VBA:在userform初始化时未触发Userform初始化方法

时间:2013-06-05 17:30:24

标签: vba module listbox initialization userform

我的模块代码调用userform:

PreInfo.Show

我的用户格式代码:

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

我的模块代码没有触发我的userform initialize sub,因此该子程序中没有任何内容运行。我无法弄清楚为什么会这样。我非常感谢任何帮助!

当此代码运行时,会弹出userform,但不会添加任何列表框项

5 个答案:

答案 0 :(得分:5)

Userform_Initialize事件由模块中调用的这样的行触发:

Load Userform1

为了再次触发它,您需要卸载用户窗体(而不是简单地隐藏它)。这可以在模块中的加载调用之后完成:

Unload Userform1

或Userform代码中的任何位置:

Unload Me

请注意,卸载调用也会触发事件初始化 QueryClose QueryClose 是当按下右上角的关闭按钮时也会触发),所以我建议你不要使用初始化。相反,在加载调用之后,在同一模块中添加初始化代码(如果从多个位置调用它,则创建一个单独的子代码。)

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

最后但并非最不重要的是,如果您正在运行无模式表单(让我们的代码在显示时在后台运行),您需要使用激活事件为了运行代码。事件序列是:

    加载用户表单 之后
  • Userform_Initialize Userform.Show
  • 之后
  • Userform_Activate Userform_QueryClose ,在卸载Userform 之后,按下结束“X”或通过关闭Excel /任务管理器终止
  • Userform_Terminate ,当它真的要结束时(虽然我不知道如何使用它)。

答案 1 :(得分:2)

我遇到了同样的问题,并找到了一个非常简单的解决方案。

在您的情况下,而不是使用

Public Sub PreInfo_Initialize()     

使用

Public Sub UserForm_Initialize()      

答案 2 :(得分:0)

  

当用户点击userform上的“继续”按钮时,我使用userform.hide,该按钮关闭用户窗体并将用户窗体输入打印到工作表中

发生的事情是您的userform永远不会从内存中卸载。 Hide仅将其从视图中删除。

这意味着它仅在您第一次在该Excel实例中运行用户窗体时初始化。

您可以使用

来防止这种情况发生
unload me

End

而不是UserForm.Hide,具体取决于您的其他代码。您还可以使用UserForm_Activate方法而不是UserForm_Initialize方法。


要填充ListBox,请使用:

lbTest.AddItem "3 Cylinders"
With声明之外的

等。

答案 3 :(得分:0)

我已经弄清楚了。长话短说,我的模块需要以下代码:

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

表示用户表单在打开之前激活(调用“initialize”,然后显示用户表单以供用户更改)。

Userform.Show应该提示这个激活子运行,但是我不是出于任何原因。这解决了这个问题,直到我确定为什么没有像调用Userform.Userform_Activate那样调用它。

答案 4 :(得分:0)

你必须保持语法UserForm_Initialize()才能实现它

干杯