运行-时间错误 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 将此赋值解释为将整数值赋给对象引用,该对象引用绑定到吹起来。
最重要的是,验证您的控件名称是否与您在代码中用来引用它们的标识符相匹配。
我知道有很多类似的问题,但其中 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
处理程序中编写的代码将始终 运行 当你想要它时。
作为
我建议你添加一个错误处理程序来帮助你弄清楚发生了什么:
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 将此赋值解释为将整数值赋给对象引用,该对象引用绑定到吹起来。
最重要的是,验证您的控件名称是否与您在代码中用来引用它们的标识符相匹配。