2015-01-16 4 views
2

Я знаю, что есть много подобных вопросов, но ни одна из них не помогла моей конкретной проблеме. Я преподаю себя VBA и начал изучать UserForms из http://www.excel-easy.com/vba/userform.htmlОшибка времени выполнения 424 Началось без предупреждения

Все работало нормально, и денди, пока из голубой, я не получил код 424 ошибки, когда я попытался запустить мой UserForm после внесения некоторых твиков

Private Sub CommandButton21_Click() 
StartUpUserForm.Show 
End Sub 

это текущая нерабочая версия этого, но у меня есть двойная и тройная проверки, что пользовательская форма вызывается правильно, удалена и воссоздана кнопка полдюжины раз, переименована и вышла из пользовательской формы в коде и абсолютно ничего помогает.

Ток UserForm является

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 

(я знаю, что это как картина Джоконду с кирпичом, но это не вопрос здесь)

Этот вопрос появился сегодня утром, но я был в состоянии чтобы отменить его, переименовав мою пользовательскую форму и вспомнив ее с помощью кода кнопки. Однако он вернулся после того, как я переименовал текстовые поля атрибута и, кажется, вернулся навсегда.

+0

Добро пожаловать в Stack Exchange! Как только вы получите свой код для запуска, как предполагалось, я настоятельно рекомендую вам зарегистрироваться на [codereview.se], вы узнаете тонну! :) –

+0

Какой текст сообщения об ошибке? –

+0

@TimWilliams 424 «Требуется объект» –

ответ

0

Ваша проблема кроется в блоке кода внутри события инициализации, которое находится под «Empty Attributes».

Что это за атрибуты? Вы присваиваете им значение, как если бы они были объектами, но они нигде не объявлены. Если они предназначены для переменных, объявите их как таковые и инициализируйте их, используя Strength = 0.

Помогает ли это?

EDIT: Я только заметил, что вы объявляете переменные в событии Click для командной кнопки. Это вызывает дополнительную проблему с областью переменных. Если вы должны объявить переменные (даже если они используют одно и то же имя) в событии Initialize, они не будут соответствовать переменным в событии Click, потому что они находятся в частной области. Вы должны полностью удалить ссылки на атрибуты в событии инициализации. В противном случае вы можете посмотреть публично объявленные переменные.

+0

Спасибо, это привело меня к поиску проблемы. Оказалось, что когда я изменил название текстовых полей, я не изменил его в последовательности инициализации. Strength.Value = 0 должно быть ForcethTextBox.Value = 0, которое я не думаю, что вы могли бы знать, не видя свойств для пользовательской формы. Но ты просто спас мне много обострения.Большое вам спасибо – Miksoko

+1

@ Использование Miksoko «Option Explicit» предупредило вас об этой ошибке –

+0

Делает прекрасный смысл. Я рад, что смогу помочь вам в правильном направлении. – user3561813

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

Очень приятный ответ, спасибо за то, что он вошел в Chiming In! – Phrancis