ran Пользователь Сообщений: 7091 |
Приветствую! |
у UserForm есть свойство Enabled — это не оно? |
|
VovaK Пользователь Сообщений: 1716 |
По проверке ошибки: On Error Resume Next |
ran Пользователь Сообщений: 7091 |
Если написать r = UserForm.Caption |
ikki Пользователь Сообщений: 9709 |
а так? фрилансер Excel, VBA — контакты в профиле |
ikki Пользователь Сообщений: 9709 |
нет, мой предыдущий вариант некорректен в случае вызова метода Hide фрилансер Excel, VBA — контакты в профиле |
ran Пользователь Сообщений: 7091 |
|
Юрий М Модератор Сообщений: 60588 Контакты см. в профиле |
Имею возразить |
ikki Пользователь Сообщений: 9709 |
совершенно правильное возражение. не проверяя на полигоне: скорее всего, нам таки ещё понадобится Enabled фрилансер Excel, VBA — контакты в профиле |
Юрий М Модератор Сообщений: 60588 Контакты см. в профиле |
{quote}{login=ikki}{date=01.05.2011 12:37}{thema=}{post}но про немодальные формы речь не шла :){/post}{/quote} |
ikki Пользователь Сообщений: 9709 |
{quote}{login=Юрий М}{date=01.05.2011 12:34}{thema=}{post} так в том-то и состоит главная задача консультанта — объяснить заказчику, что ему на самом деле было надо, вне зависимости от того, что он там писал фрилансер Excel, VBA — контакты в профиле |
Юрий М Модератор Сообщений: 60588 Контакты см. в профиле |
Совершенно верно: тут уже неоднократно были случаи, когда «заказчик» что-то спрашивал, ему отвечали, советовали… И в конце-концов предлагали СОВЕРШЕННО другое. Причём, оказывалось, что ИМЕННО это и было нужно, и клиент уходил довольный |
ikki Пользователь Сообщений: 9709 |
я тут понемножку пробую разобраться с немодальками… фрилансер Excel, VBA — контакты в профиле |
Юрий М Модератор Сообщений: 60588 Контакты см. в профиле |
CelectionChange в любом случае произойти должно. |
ikki Пользователь Сообщений: 9709 |
пока получилось сделать, только задействовав событие листа. фрилансер Excel, VBA — контакты в профиле |
Юрий М Модератор Сообщений: 60588 Контакты см. в профиле |
Опять немного не то: активна какая-либо ячейка и кликаем сразу по кнопке на форме |
Юрий М Модератор Сообщений: 60588 Контакты см. в профиле |
Нужно добавлять MouseMove, наверное… А может ничего этого уже и не нужно? |
ikki Пользователь Сообщений: 9709 |
это значит надо спать фрилансер Excel, VBA — контакты в профиле |
ran Пользователь Сообщений: 7091 |
If UserForm1.Visible Then |
Юрий М Модератор Сообщений: 60588 Контакты см. в профиле |
А глобальную переменную на активацию формы? |
ran Пользователь Сообщений: 7091 |
|
Юрий М Модератор Сообщений: 60588 Контакты см. в профиле |
#22 01.05.2011 01:25:31 Вам же нужно было узнать — активна или нет. Не хотите переменную — не надо |
Взято с сайта hiprog.com
Вопрос: Проверяет открыта ли форма
Совет:
Функция возвращает True, если форма загружена и False — если нет.
Visual Basic | ||
|
=======================
или
Visual Basic | ||
|
=======================
или
Visual Basic | ||
|
=======================
или
Автор: Дмитрий Сонных sonni-dim@mail.ru
Для того, чтобы обратиться к элементу управления на форме или к самой форме, форма должна быть открыта. Приведённая ниже функция и позволяет определить, открыта ли форма. Функцию лучше всего распологать в модуле.
Visual Basic | ||
|
I run a program which repeats itself. It should stop, when the user closes the userform. It runs without stopping.
Since the program calls itself every 8 seconds, I want to check at the end if the userform is still loaded / opened.
Public Sub NextPicture1()
PictureChange = Now + TimeValue("00:00:08")
If Onboarding_Projekt.Visible = True Then
Application.OnTime PictureChange, "NextPicture1"
End If
End Sub
Mikku
6,5183 gold badges15 silver badges38 bronze badges
asked May 28, 2018 at 9:58
You can use a function like this:
Public Function IsLoaded(formName As String) As Boolean
Dim frm As Object
For Each frm In VBA.UserForms
If frm.Name = formName Then
IsLoaded = True
Exit Function
End If
Next frm
IsLoaded = False
End Function
Usage:
If IsLoaded("Form_Test") Then
'Do Something
End If
Your code should look like this:
Public Sub NextPicture1()
PictureChange = Now + TimeValue("00:00:08")
If IsLoaded("Onboarding_Projekt") Then
Application.OnTime PictureChange, "NextPicture1"
End If
End Sub
Public Function IsLoaded(formName As String) As Boolean
Dim frm As Object
For Each frm In VBA.UserForms
If frm.Name = formName Then
IsLoaded = True
Exit Function
End If
Next frm
IsLoaded = False
End Function
answered May 28, 2018 at 10:06
gizlmogizlmo
1,8621 gold badge14 silver badges14 bronze badges
5
Here’s a version that shows both whether it’s loaded and whether it’s visible:
Function Userform_Check( _
form_name As String) _
As Integer
' Returns:
' 0 - Userform is not loaded
' 1 - Loaded but not visible
' 2 - Loaded and visible
' mUtilities.Userform_Check()
Dim frm As Object
Userform_Check = 0
For Each frm In VBA.UserForms
If frm.name = form_name Then
Userform_Check = 1
If frm.Visible Then Userform_Check = 2
Exit For
End If
Next frm
' Function Userform_Check( _
form_name As String) _
As Integer
End Function
answered May 31, 2019 at 5:20
RIck_RRIck_R
1113 bronze badges
I found a field that should help identify it easily:
If userform.Visible = True Then
'do something
End If
Tim Stack
3,2093 gold badges18 silver badges39 bronze badges
answered May 7, 2019 at 10:24
2
Public Function IsFormLoaded(sFormName$) As Boolean
‘ Возвращает:
‘ Истина — если форма загружена и не находится в режиме редакции;
‘ Ложь — если форма не загружена или находится в режиме редакции.
‘—————————————————————————
‘ Аргументы:
‘ sFormName = имя формы
‘—————————————————————————
On Error GoTo IsFormLoaded_Err
If CurrentProject.AllForms(sFormName).IsLoaded Then
If CurrentProject.AllForms(sFormName).CurrentView > 0 Then
IsFormLoaded = True
End If
End If
IsFormLoaded_Bye:
Exit Function
IsFormLoaded_Err:
Resume IsFormLoaded_Bye
End Function
(Древний — от прибл 1997г.)
Public Function IsLoaded(sFormName As String) As Boolean
‘ Назначение: определяет, загружена ли форма
‘ Возвращает: Истина, если форма загружена;
‘ Ложь, если форма не загружена.
‘———————————————————————
Dim i
IsLoaded = False
For i = 0 To Forms.Count — 1
If Forms(i).FormName = sFormName Then
IsLoaded = True
Exit Function
End If
Next
End Function
Я хочу проверить, загружена ли пользовательская форма во время выполнения кода. Пробовал несколько способов, ни у кого не получается. Я помню, что делал это раньше, но не могу вспомнить свой обходной путь. Любая идея?
Я нашел некоторые решения здесь и в других местах, они тоже не работали!
Проблемы …
- vba.userforms принимает только номера индексов, а не строковые индексы,
- в цикле над пользовательскими формами некоторые свойства, такие как имя, недоступны для проверки!
Вот мои попытки:
Public Function IsFormVisible(FrmName As String) As Boolean
On Error GoTo errorH
IsFormVisible = False
Set Frm = UserForms(FrmName)
If Not Frm Is Nothing Then IsFormVisible = True
End Function
errorH:
IsFormVisible = False
End Function
Public Function IsFormVisible(FrmName As String) As Boolean
Dim Frm As UserForm
On Error GoTo errorH
IsFormVisible = False
For Each Frm In VBA.UserForms
If Frm.Name = FrmName Then
IsFormVisible = True
Exit Function
End If
Next
errorH:
IsFormVisible = False
End Function
2 ответа
Лучший ответ
Вот два простых варианта. Во-первых, вы можете объявить frm
как Object
:
Public Function IsFormVisible(FrmName As String) As Boolean
Dim Frm As Object
On Error GoTo errorH
IsFormVisible = False
For Each Frm In VBA.UserForms
If LCase$(Frm.Name) = LCase$(FrmName) Then
IsFormVisible = True
Exit Function
End If
Next
errorH:
IsFormVisible = False
End Function
Или, во-вторых, вы можете использовать TypeName
вместо .Name
:
Public Function IsFormVisible(FrmName As String) As Boolean
Dim Frm As UserForm
'On Error GoTo errorH
IsFormVisible = False
For Each Frm In VBA.UserForms
If lcase$(TypeName(Frm)) = lcase$(FrmName) Then
IsFormVisible = True
Exit Function
End If
Next
errorH:
IsFormVisible = False
End Function
Я сделал оба этих параметра нечувствительными к регистру.
5
Rory
15 Окт 2018 в 14:06
Я думаю, что код для IsFormVisible
просто пропускает одну строку кода, если вам действительно нужно проверить видимость.
СОВЕТ , как справедливо указал Рори, вопрос заключается в том, загружена ли пользовательская форма или нет. И на этот вопрос его ответ абсолютно правильный.
Public Function IsFormVisibleA(FrmName As String) As Boolean
Dim Frm As Object
On Error GoTo errorH
IsFormVisibleA = False
For Each Frm In VBA.UserForms
If LCase$(Frm.Name) = LCase$(FrmName) Then
If Frm.Visible Then
IsFormVisibleA = True
Exit Function
End If
End If
Next
errorH:
IsFormVisibleA = False
End Function
Вы можете проверить это так. Если вы загружаете только форму, не показывая ее, функция IsFormVisible вернет true, хотя форма не отображается.
Sub Testfrm()
Dim Frm As frmMy
Set Frm = New frmMy
' Frm.Show vbModeless
Debug.Print Frm.Name
Debug.Print IsFormVisibleA("frmMy"), IsFormVisible("frmMy")
End Sub
1
Storax
15 Окт 2018 в 14:43