VBA Excel Userforms, Показать, Скрыть - PullRequest
0 голосов
/ 01 марта 2019

У меня есть вопрос относительно экземпляров пользовательских форм.

Когда пользовательская форма создается с помощью объекта в модуле (например, set frm = new Userform2), я могу скрыть ее и восстановить с помощью метода show, даже когдаподпрограмма выполняется до конца?

Допустим,

  1. создание пользовательской формы с помощью sub1
  2. ввод значений в пользовательскую форму
  3. скрытие пользовательской формыс sub2
  4. восстановить пользовательскую форму со всеми значениями по sub3 с помощью метода show

Я получил очень странное поведение при тестировании кода с методами show и hide на уровне модуля или кода Userform, но что янаконец-то пришло время работать с тем, чтобы использовать глобальную переменную и следующий код в стандартном модуле:

Global frm As UserForm2
Option Explicit

Sub sub1()
Set frm = New UserForm2
    With frm
        .Show vbModeless
    End With
End Sub

Sub sub2()
    With frm
        .Hide
    End With
End Sub

Sub sub3()
    With frm
        .Show vbModeless
    End With
End Sub

Часто говорят, что глобальных переменных следует избегать.Это вообще возможно здесь?Я что-то пропустил?

1 Ответ

0 голосов
/ 01 марта 2019

Что я действительно хочу, так это скрыть пользовательскую форму, но сохранить экземпляр со всеми установленными ранее значениями.Вот мой оригинальный код, и теперь я понял, что я все перепутал и сделал ошибку.У меня был «конец» в состоянии, и это заставляет UF не показывать соотв.убивает все случаи.@Chronocidal: На самом деле я прячусь в коде внутри пользовательской формы.Это часть кнопки, которая передает данные набора из УФ на лист.Но я думаю, что не важно, где спрятаться или?Теперь это работает, как я ожидал.Спасибо всем вам

Global myfrm As FormFillInformation
Option Explicit

Sub InitUserFormGeneralInformation()
Dim chkfrm As Boolean
chkfrm = CheckFrmIsHidden
If chkfrm = True Then
    myfrm.Show vbModeless
    End '<<<<<========== completely wrong but overseen
Else
    Set myfrm = New FormFillInformation
    myfrm.Show vbModeless

End If

End Sub


Function CheckFrmIsHidden() As Boolean
Dim frm As Object
CheckFrmIsHidden = False
For Each frm In VBA.UserForms
 If frm.Name = "FormFillInformation" Then
    CheckFrmIsHidden = True
 End If
Next
End Function
...