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

时间:2015-01-16 17:57:08

标签: excel vba runtime-error

我知道有很多类似的问题,但它们都没有帮助我解决我的具体问题。 我一直在教自己VBA并开始学习用户形态 http://www.excel-easy.com/vba/userform.html

一切正常,花花公子直到明白,我在做了一些调整后试图运行我的Userform时收到了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

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

今天早些时候出现了这个问题,但我可以通过重命名我的用户窗体并用按钮代码调出它来避免它。但是,它在我重命名属性文本框后回来了,似乎又回来了。

2 个答案:

答案 0 :(得分:4)

我认为StartupUserForm存在且被命名为。

表单是的特殊类型,它们具有 predeclaredId - “默认实例”。当你这样做时:

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()

每个类都有一个特殊的Initialize事件,在创建实例时运行 - 当您使用表单的默认实例时,该过程中的代码可能会也可能不会运行,具体取决于您的VBA环境的状态。这就是为什么总是创建一个对象更好的原因,因此您在Initialize处理程序中编写的代码将始终在您打算运行时运行。

作为@TimWilliams pointed out,我们不知道哪条线因#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 = ""

如果控件/文本框实际上被称为Strength,那么您还有另一个问题:

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

变量与文本框具有相同的名称,并且该名称冲突会混淆VBA - 可能VBA将此赋值解释为将一个整数值赋给对象引用,这必然会爆炸。

从底线开始,验证您的控件名称是否与您在代码中引用它们时使用的标识符相匹配。

答案 1 :(得分:0)

您的问题在于Initialization事件中的代码块低于'空属性。

这些属性是什么?您为它们分配了一个值,就像它们是对象一样,但它们不会在任何地方声明。如果它们是变量,则声明它们,并使用Strength = 0初始化它们。

这有帮助吗?

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