运行-时间错误 424 在没有警告的情况下启动

Run-Time Error 424 Started without warning

我知道有很多类似的问题,但其中 none 对我的特定问题有所帮助。 我一直在自学 VBA 并开始从 http://www.excel-easy.com/vba/userform.html

一切都很好,但突然间,我在做了一些调整后尝试 运行 我的用户表单时收到了 424 错误代码

Private Sub CommandButton21_Click()
StartUpUserForm.Show
End Sub

是当前的非工作版本,但我已经双重和三次检查用户表单是否正确调用,删除并重新创建按钮六次,重命名并在代码中召回用户表单和绝对没有任何帮助。

当前用户表单是

Private Sub Userform_initialize()

'Empty NameTextBox
NameTextBox.Value = ""

'Empty Race_Select
Race_Select.Clear
'Fill Race_Select
With Race_Select
    .AddItem "Dwarf"
    .AddItem "Elf"
    .AddItem "Gnome"
    .AddItem "Half-Elf"
    .AddItem "Half-Orc"
    .AddItem "Halfling"
    .AddItem "Human"
    .AddItem "Other"
End With

'Empty Class_Select
Class_Select.Clear
'Fill Class_Select
With Class_Select
    .AddItem "Barbarian"
    .AddItem "Bard"
    .AddItem "Cleric"
    .AddItem "Druid"
    .AddItem "Fighter"
    .AddItem "Monk"
    .AddItem "Paladin"
    .AddItem "Ranger"
    .AddItem "Rogue"
    .AddItem "Sorceror"
    .AddItem "Wizard"
End With

'Empty Attributes
Strength.Value = ""
Dexterity.Value = ""
Constitution.Value = ""
Intelligence.Value = ""
Wisdom.Value = ""
Charisma.Value = ""

End Sub

Private Sub Roll_Attributes_Click()


Dim Strength As Integer
Dim Dexterity As Integer
Dim Constitution As Integer
Dim Intelligence As Integer
Dim Wisdom As Integer
Dim Charisma As Integer

'Roll Attributes
Strength = Int((18 - 3 + 1) * Rnd + 3)
Dexterity = Int((18 - 3 + 1) * Rnd + 3)
Constitution = Int((18 - 3 + 1) * Rnd + 3)
Intelligence = Int((18 - 3 + 1) * Rnd + 3)
Wisdom = Int((18 - 3 + 1) * Rnd + 3)
Charisma = Int((18 - 3 + 1) * Rnd + 3)

'Display Integer as attribute
StrengthTextBox.Text = Strength
DexterityTextBox.Text = Dexterity
ConstitutionTextBox.Text = Constitution
IntelligenceTextBox.Text = Intelligence
WisdomTextBox.Text = Wisdom
CharismaTextBox.Text = Charisma

End Sub

(我知道这就像用砖头画蒙娜丽莎,但这不是问题)

今天早些时候出现了这个问题,但我通过重命名我的用户表单并使用按钮代码将其召回来避免了它。但是,在我重命名属性文本框后它又回来了,而且似乎永远回来了。

您的问题出在“空属性”下方的初始化事件中的代码块中。

这些属性是什么?您为它们分配一个值,就好像它们是对象一样,但它们没有在任何地方声明。如果它们是变量,请将它们声明为变量,并使用 Strength = 0.

初始化它们

这有帮助吗?

编辑:我刚刚注意到您在命令按钮的 Click 事件中声明了变量。这引发了一个关于变量作用域的额外问题。如果您要在 Initialize 事件中声明变量(即使它们使用相同的名称),它们将不会对应于 Click 事件中的变量,因为它们是私有范围的。您应该在初始化事件中完全删除对属性的引用。否则,您可以查看公开声明的变量。

我假设 StartupUserForm 存在并以此命名。

表单是 classes 的特殊类型,具有 predeclaredId - "default instance"。当您这样做时:

Private Sub CommandButton21_Click()
StartUpUserForm.Show
End Sub

您正在使用那个默认实例。您应该创建它的 副本

Private Sub CommandButton21_Click()
    Dim frm As StartUpUserForm
    Set frm = New StartUpUserForm
    frm.Show
End Sub

这将使 CommandButton21 单击处理程序 创建一个对象 ,对其调用 Show 方法,然后当表单已关闭。

那么为什么会出现该错误?

Private Sub Userform_initialize()

每个 class 都有一个特殊的 Initialize 事件,该事件 运行 在创建实例时发生 - 当您使用表单的默认实例时,该过程中的代码可能 运行 运行,具体取决于您的 VBA 环境状态。这就是为什么最好总是创建一个对象,这样你在 Initialize 处理程序中编写的代码将始终 运行 当你想要它时。

作为,我们不知道哪一行出现#424 错误,所以很难在这里帮助你。

我建议你添加一个错误处理程序来帮助你弄清楚发生了什么:

Private Sub Userform_initialize()
    On Error GoTo CleanFail

    'your code here

CleanExit:
    Exit Sub

CleanFail:
    Debug.Print Err.Number, Err.Description
    Stop
    Resume 'Resume CleanExit
End Sub

这对你有什么帮助?当一条指令爆炸时,VBA 编辑器 (VBE) 将在 立即窗格 中显示错误编号和描述(Ctrl+ G 以显示它(如果它不可见)并突出显示显示 Stop 的行,然后您可以按 F8单步执行 到下一行 - VBE 将突出显示显示 Resume 的指令,然后再次按 F8 将直接带您到导致错误的行。

很有可能,您重命名了窗体上的控件,但没有在代码中重命名;控件的 Name 属性 是您应该在代码中用来引用该控件的标识符。

您的代码在两个处理程序之间不一致 - 在 Click 处理程序中它似乎是 StrengthTextBox...

StrengthTextBox.Text = Strength

...在 Initialize 处理程序中它似乎只是 Strength:

Strength.Value = ""

如果control/textbox实际调用的是Strength,那你还有另外一个问题:

Dim Strength As Integer
Strength = Int((18 - 3 + 1) * Rnd + 3)

变量与文本框同名,该名称冲突使 VBA 混淆 - 可能 VBA 将此赋值解释为将整数值赋给对象引用,该对象引用绑定到吹起来。

最重要的是,验证您的控件名称是否与您在代码中用来引用它们的标识符相匹配。