Проверить открыта ли форма vba excel

 

ran

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

Приветствую!  
Задача — если UserForm активна, берем номер строки с нее, если нет — с листа.  
Как определить номер — решаемая проблема.    
Как определить, где искать?

 

у UserForm есть свойство Enabled — это не оно?

 

VovaK

Пользователь

Сообщений: 1716
Регистрация: 01.01.1970

По проверке ошибки:  

  On Error Resume Next  
r = Userform.Caption  
If Err <> 0 Then r= Range(«A1»).Value

 

ran

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

Если написать r = UserForm.Caption  
то ошибка возникает всегда (не зависимо от того, открыта-ли форма)  
Если написать r = UserForm1.Caption  
то ошибка не возникает никогда(не зависимо от того, открыта-ли форма)

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

а так?

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

нет, мой предыдущий вариант некорректен в случае вызова метода Hide  
вот так — вроде бы всегда корректно работает  
но надо пробовать :)

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

ran

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

 

Юрий М

Модератор

Сообщений: 60588
Регистрация: 14.09.2012

Контакты см. в профиле

Имею возразить :-)  
Если мы загрузим форму вот так:  
UserForm1.Show 0  
то, кликнув по любой ячейке, и нажав на кнопку Check на листе, получим сообщение «Из формы». Это я всё к чему: форма отображена, но НЕ АКТИВНА.  
А в теме так и говорилось — Активна или нет.

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

совершенно правильное возражение.  
но про немодальные формы речь не шла :)  

  не проверяя на полигоне: скорее всего, нам таки ещё понадобится Enabled

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

Юрий М

Модератор

Сообщений: 60588
Регистрация: 14.09.2012

Контакты см. в профиле

{quote}{login=ikki}{date=01.05.2011 12:37}{thema=}{post}но про немодальные формы речь не шла :){/post}{/quote}  
Согласен. Но ведь из вопроса можно и так истолковать активность/неактивность. Форма загружена, но не активна (активен лист)   :-)  
RAN, что скажете? :-) Про какую активность говорим?

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

{quote}{login=Юрий М}{date=01.05.2011 12:34}{thema=}{post}  
А в теме так и говорилось — Активна или нет.{/post}{/quote}  

  так в том-то и состоит главная задача консультанта — объяснить заказчику, что ему на самом деле было надо, вне зависимости от того, что он там писал :)

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

Юрий М

Модератор

Сообщений: 60588
Регистрация: 14.09.2012

Контакты см. в профиле

Совершенно верно: тут уже неоднократно были случаи, когда «заказчик» что-то спрашивал, ему отвечали, советовали… И в конце-концов предлагали СОВЕРШЕННО другое. Причём, оказывалось, что ИМЕННО это и было нужно, и клиент уходил довольный :-)

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

я тут понемножку пробую разобраться с немодальками…  
чё-то никак…  
ни Enabled, ни установка/снятие глобальной переменной при событиях.  
какое событие возникает, если, находясь на немодальке, щёлкнуть по ячейке?

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

Юрий М

Модератор

Сообщений: 60588
Регистрация: 14.09.2012

Контакты см. в профиле

CelectionChange в любом случае произойти должно.

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

пока получилось сделать, только задействовав событие листа.  
но это ж страшное дело :(

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

Юрий М

Модератор

Сообщений: 60588
Регистрация: 14.09.2012

Контакты см. в профиле

Опять немного не то: активна какая-либо ячейка и кликаем сразу по кнопке на форме :-)

 

Юрий М

Модератор

Сообщений: 60588
Регистрация: 14.09.2012

Контакты см. в профиле

Нужно добавлять MouseMove, наверное… А может ничего этого уже и не нужно?

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

это значит надо спать  
завтра будет день опять

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

ran

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

If UserForm1.Visible Then  
меня вроде устроило.  
Задача:  
Есть лист1 с данными.  
Есть форма для внесения данных на лист1.  
Есть лист2 отчет.  
Отчет можно формировать либо выбрав строку на листе с данными, либо найдя нужную запись в форме.  
Для Hide пока применения не нашел…

 

Юрий М

Модератор

Сообщений: 60588
Регистрация: 14.09.2012

Контакты см. в профиле

А глобальную переменную на активацию формы?

 

ran

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

 

Юрий М

Модератор

Сообщений: 60588
Регистрация: 14.09.2012

Контакты см. в профиле

#22

01.05.2011 01:25:31

Вам же нужно было узнать — активна или нет. Не хотите переменную — не надо :-)

Взято с сайта hiprog.com

Вопрос: Проверяет открыта ли форма

Совет:
Функция возвращает True, если форма загружена и False — если нет.

Visual Basic
1
2
3
4
5
6
7
8
Function fIsLoaded(ByVal strFormName As String) As Boolean
'функция возращает True, если форма загружена и False - если нет
    If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> 0 Then
        If Forms(strFormName).CurrentView <> 0 Then
            fIsLoaded = True
        End If
    End If
End Function

=======================

или

Visual Basic
1
2
3
Function isOpen(Object$) As Boolean
isOpen = Application.SysCmd(acSysCmdGetObjectState, acForm, "TV_calc") = acObjStateOpen
End Function

=======================

или

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Function IsLoaded(ByVal strFormName As String) As Boolean
' Returns True if the specified form is open in Form view or Datasheet view.
 
Const conObjStateClosed = 0
Const conDesignView = 0
 
If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then
If Forms(strFormName).CurrentView <> conDesignView Then
IsLoaded = True
End If
End If
 
End Function

=======================
или

Автор: Дмитрий Сонных sonni-dim@mail.ru

Для того, чтобы обратиться к элементу управления на форме или к самой форме, форма должна быть открыта. Приведённая ниже функция и позволяет определить, открыта ли форма. Функцию лучше всего распологать в модуле.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Public Function IsFormOpen(Name As String) As Boolean
' IsFormOpen = True - форма открыта
' IsFormOpen = False - форма закрыта
Dim FP As Form
For Each FP In Forms
    If FP.Name = Name Then
        IsFormOpen = True
        Exit Function
    End If
Next
IsFormOpen = False
End Function

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's user avatar

Mikku

6,5183 gold badges15 silver badges38 bronze badges

asked May 28, 2018 at 9:58

Mentos's user avatar

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

gizlmo's user avatar

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_R's user avatar

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's user avatar

Tim Stack

3,2093 gold badges18 silver badges39 bronze badges

answered May 7, 2019 at 10:24

Tornar's user avatar

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

Я хочу проверить, загружена ли пользовательская форма во время выполнения кода. Пробовал несколько способов, ни у кого не получается. Я помню, что делал это раньше, но не могу вспомнить свой обходной путь. Любая идея?

Я нашел некоторые решения здесь и в других местах, они тоже не работали!

Проблемы …

  1. vba.userforms принимает только номера индексов, а не строковые индексы,
  2. в цикле над пользовательскими формами некоторые свойства, такие как имя, недоступны для проверки!

Вот мои попытки:

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

Понравилась статья? Поделить с друзьями:
  • Проведение статистического исследования возрастной структуры работников предприятия средствами excel
  • Проведение статистического анализа расчета с помощью таблицы excel
  • Проведение регрессионного анализа в excel
  • Проведение расчетов в microsoft excel
  • Проведение корреляционного анализа в excel