运行时错误424开始时没有警告
我知道还有很多类似的问题,但没有一个能够帮助我解决具体的问题。 我一直在教自己的VBA,并从http://www.excel-easy.com/vba/userform.html开始学习用户表单
一切工作正常和花花公子,直到蓝色,我收到了424错误代码,当我试图运行我的用户窗体后做了一些调整
Private Sub CommandButton21_Click() StartUpUserForm.Show End Sub
是目前这个非工作版本,但我有双重和三重检查,正确调用了用户窗体,删除并重新创buildbutton六次,重命名和召回了代码中的用户窗体,绝对没有什么帮助。
当前的用户表单是
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
(我知道这就像用砖头画蒙娜丽莎,但这不是问题)
这个问题在今天早些时候出现,但是我可以通过重命名我的用户窗体并用button代码调出它。 然而,在我重新命名属性文本框后,它又回来了,似乎又回来了。
您的问题在于初始化事件中的“空属性”下面的代码块。
这些属性是什么? 您为它们分配一个值,就像它们是对象一样,但是它们没有在任何地方声明。 如果它们是variables,则声明它们,并使用Strength = 0
它们进行初始化。
这有帮助吗?
编辑:我只是注意到,你在命令button的Click事件声明variables。 这引发了一个关于variables范围的问题。 如果您要在Initialize事件中声明variables(即使它们使用相同的名称),它们将不会对应于Click事件中的variables,因为它们是私人范围的。 您应该在初始化事件中完全删除对属性的引用。 否则,您可以查看Publicly声明的variables。
我假设StartupUserForm
存在并被命名为这样。
表单是特殊types的类 ,有一个predeclaredId – 一个“默认实例”。 当你这样做:
Private Sub CommandButton21_Click() StartUpUserForm.Show End Sub
您正在使用该默认实例 。 你应该创build它的副本 :
Private Sub CommandButton21_Click() Dim frm As StartUpUserForm Set frm = New StartUpUserForm frm.Show End Sub
这将使CommandButton21
点击处理程序创build一个对象 ,对其调用Show
方法,然后该对象将在表单closures时死亡。
那么为什么你得到这个错误?
Private Sub Userform_initialize()
每个类都有一个特殊的Initialize
事件,在创build实例时运行 – 当您使用表单的默认实例时,该过程中的代码可能运行也可能不运行,具体取决于VBA环境的状态。 这就是为什么总是要创build一个对象的原因,所以你在Initialize
处理器中编写的代码将总是在你打算的时候运行。
正如@TimWilliams所指出的那样 ,我们不知道哪一行发生了#424错误,所以在这里很难帮到你。
我build议你添加一个error handling程序来帮助你弄清楚发生了什么事情:
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 = ""
如果控件/文本框实际上被称为Strength
,那么你有另一个问题:
Dim Strength As Integer Strength = Int((18 - 3 + 1) * Rnd + 3)
variables与文本框名称相同,名称冲突会混淆VBA – VBA可能会将此赋值语句解释为将整数值分配给对象引用,该对象引用势必会炸毁。
底线,validation您的控件名称与您在代码中用于引用它们的标识符相匹配。