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 не был вызван так, как должен был быть.