VBA: метод инициализации Userform не попадает при инициализации userform

мой код модуля, вызывающий userform:

PreInfo.Show

мой код userform:

Public Sub PreInfo_Initialize()
Dim Invoice, Name, Model, Crank, MyValue1, StrokeL As Variant
'Dim ListBox1 As ListBox
Dim c As Range
Dim oneControl As Object

'Empty Text Boxes and Set Focus
For Each oneControl In PreInfo.Controls
Select Case TypeName(oneControl)
Case "TextBox"
    oneControl.Text = vbNullString
'Case "ListBox"
    'oneControl.AddItem "Test"
End Select
Next oneControl

With lbTest
    .AddItem Item:="2 Cylinders" '3 different syntax used as test to isolate issue
    .AddItem "3 Cylinders"
    .AddItem ("5 Cylinders")
End With

Invoice.TextBox.SetFocus 'Activate?

End Sub

мой код модуля не запускает мою пользовательскую форму initialize sub, поэтому ничего в этом sub не запускается. Я не могу понять, почему это происходит. Я был бы очень признателен за любую помощь!

когда этот код запускается, появляется userform, однако ни один из элементов списка не добавляется

5 ответов


событие Userform_Initialize инициируется строкой, подобной этой, вызываемой в модуле:

Load Userform1

для того, чтобы он был запущен снова, вам нужно будет выгрузить userform (а не просто скрыть его). Это можно сделать либо после вызова загрузки внутри модуля:

Unload Userform1

или в любом месте кода Userform:

Unload Me

обратите внимание, что события инициализации и QueryClose будет вызвано выгрузить вызова, а также (QueryClose также срабатывает при нажатии кнопки закрытия в правом верхнем углу), поэтому я действительно рекомендую вам воздержаться от использования инициализации. Вместо этого, после загрузить вызов, добавьте код инициализации в одном модуле (или создайте отдельный sub, если он будет вызван из нескольких мест).

Sub LoadThatUserform
    Load Preinfo
    'All textboxes are loaded with their value set to vbnullstring, _
         unless you specified otherwise in the Properties box.
    With ThatUserform.lbTest
    'Answering this test
        .AddItem Item:="2 Cylinders" 'Here you used the parameter name. _
              It's entirely optional, which is why the one below _
              also works. It's necessary, however, if you wanna skip _
              an optional parameter on a procedure call.
        .AddItem "3 Cylinders"
        .AddItem ("5 Cylinders") 'This will theoretically create a _
              run-time error: a procedure call either outside of a Call _
              statement or not setting a value to a variable or property _
              doesn't require parentheses.
    End With
    'After loading, show the form
    Preinfo.Show
    'Showing, if not as modeless, stops code execution for the user _
          to make changes to the form. Once he presses a button _
          or whatever, and the form is hidden, code will resume. _
          After you grab every form data you need, just call Unload.
    Unload Preinfo
End Sub

последнее, но не менее, если вы используете Modeless форма (давайте код в фоновом режиме во время показа), вам нужно использовать активировать событие для запуска кода. Последовательность событий:

  • Userform_Initialize, после Загрузить Userform
  • Userform_Activate, после пользовательская форма.Шоу
  • Userform_QueryClose, после Выгрузить Userform, нажав кнопку закрытия "X" или завершив через закрытие Excel / Task Менеджер!--36-->
  • Userform_Terminate, когда он действительно закончится (хотя я понятия не имею, как это использовать).

у меня была такая же проблема, и я нашел очень простое решение.

в вашем случае, вместо того, чтобы использовать

Public Sub PreInfo_Initialize()     

использовать

Public Sub UserForm_Initialize()      

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

происходит то, что ваша пользовательская форма никогда не выгружается из памяти. Hide только удаляет его из вида.

это означает, что он инициализируется только при первом запуске userform в этом экземпляре Excel.

вы можете предотвратить это используя

unload me

или

End

вместо UserForm.Hide в зависимости от вашего другого кода. Вы также можете потенциально использовать UserForm_Activate вместо UserForm_Initialize метод.


чтобы заполнить список, используйте:

lbTest.AddItem "3 Cylinders"

и т. д. За пределами With заявление.


Я все понял. Короче говоря, мой модуль нуждался в следующем коде:

Userform.Userform_Activate 'THIS IS THE NEW CODE
Userform.Show 'existing code, unchanged

который сигнализирует userform для активации до его открытия (вызов "initialize", а затем показывает userform для пользователя, чтобы изменить).

Userform.Шоу должно сигнализировать об этой активации суб для запуска, однако мой не был по какой-либо причине. Это устраняет проблему, пока я не определю, почему Userform.Userform_Activate не был вызван так, как должен был быть.


вы должны сохранить синтаксис UserForm_Initialize (), чтобы это произошло

Ура