运行时错误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您的控件名称与您在代码中用于引用它们的标识符相匹配。