6

我的模块代码调用用户表单:

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

我的模块代码不会触发我的用户表单初始化子程序,因此该子程序中没有任何内容运行。我无法弄清楚为什么会这样。我将不胜感激任何帮助!

当此代码运行时,会弹出用户窗体,但是没有添加任何列表框项目

4

5 回答 5

7

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

Load Userform1

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

Unload Userform1

或者用户表单代码中的任何地方:

Unload Me

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

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_Activate,在Userform.Show之后
  • Userform_QueryClose,在Unload Userform之后,按关闭“X”或通过关闭 Excel/任务管理器终止
  • Userform_Terminate,当它真的要结束时(尽管我不知道它是如何使用的)。
于 2017-04-07T21:55:43.880 回答
3

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

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

Public Sub PreInfo_Initialize()     

利用

Public Sub UserForm_Initialize()      
于 2014-11-04T01:58:00.917 回答
2

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

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

它指示用户表单在打开之前激活(调用“初始化”,然后显示用户表单供用户更改)。

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

于 2013-06-06T16:18:31.477 回答
1

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

正在发生的事情是您的用户表单永远不会从内存中卸载。Hide仅将其从视图中删除。

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

您可以通过使用来防止这种情况

unload me

或者

End

而不是UserForm.Hide依赖于您的其他代码。您也可以潜在地使用UserForm_Activate方法而不是UserForm_Initialize方法。


要填充 ListBox,请使用:

lbTest.AddItem "3 Cylinders"

声明之外的等With

于 2013-06-05T17:52:13.480 回答
0

您必须保留语法 UserForm_Initialize() 才能实现

干杯

于 2016-06-05T21:22:00.987 回答