Ошибка времени выполнения 424 со скрытым окном на основе выбора - PullRequest
1 голос
/ 10 июня 2019

Новый для VBA. У меня есть код для пользовательской формы, с которой я почти работаю ... единственная проблема - это (прокомментированные) метка и текстовые поля, которые я скрыл, если значение "Да" не дает мне ошибку времени выполнения.

Private Sub E_EnterInformation_Click()

'----------------------------------------------------
'Check Validation of Completed form
'----------------------------------------------------
If Trim(Me.TextBoxE_RequestBy.Value) = "" Then
    Me.TextBoxE_RequestBy.SetFocus
    MsgBox "Please fill in 'Request By' on form", vbCritical
        Exit Sub
End If

If Trim(Me.TextBoxE_OnSiteContact.Value) = "" Then
    Me.TextBoxE_OnSiteContact.SetFocus
    MsgBox "Please fill in 'On Site Contact' on form", vbCritical
        Exit Sub
End If

If Trim(Me.TextBoxE_OnSiteNumber.Value) = "" Then
    Me.TextBoxE_OnSiteNumber.SetFocus
    MsgBox "Please fill in 'On Site Phone Number' on form"
    Exit Sub
End If

If Trim(Me.TextBoxE_EventName.Value) = "" Then
    Me.TextBoxE_EventName.SetFocus
    MsgBox "Please fill in 'Event Name' on form"
    Exit Sub
End If

If Trim(Me.ComboBoxE_LocationNumber.ListIndex) = -1 Then
  Me.ComboBoxE_LocationNumber.SetFocus
  MsgBox "Please fill in 'Location Number' on form"
  Exit Sub
End If

If Trim(Me.ListBoxE_OffSiteDelivery.ListIndex) = -1 Then
  Me.ListBoxE_OffSiteDelivery.SetFocus
  MsgBox "Please fill in 'Off Site Delivery?' on form"
  Exit Sub
End If

If Trim(Me.ListBoxE_RequestStatus.ListIndex) = -1 Then
  Me.ListBoxE_RequestStatus.SetFocus
  MsgBox "Please fill in 'Request Status' on form"
  Exit Sub
End If

If Trim(Me.TextBoxE_DeliverDate.Value) = "" Then
  Me.TextBoxE_DeliverDate.SetFocus
  MsgBox "Please fill in 'Delivery Date' on form"
  Exit Sub
End If

If Trim(Me.ListBoxE_DeliverTime.ListIndex) = -1 Then
  Me.ListBoxE_DeliverTime.SetFocus
  MsgBox "Please fill in 'Delivery Time' on form"
  Exit Sub
End If

If Trim(Me.TextBoxE_SSDate.Value) = "" Then
  Me.TextBoxE_SSDate.SetFocus
  MsgBox "Please fill in 'Show Start Date' on form"
  Exit Sub
End If

If Trim(Me.ListBoxE_SSTime.ListIndex) = -1 Then
  Me.ListBoxE_SSTime.SetFocus
  MsgBox "Please fill in 'Show Start Time' on form"
  Exit Sub
End If

If Trim(Me.TextBoxE_SEDate.Value) = "" Then
  Me.TextBoxE_SEDate.SetFocus
  MsgBox "Please fill in 'Show End Date' on form"
  Exit Sub
End If

If Trim(Me.ListBoxE_SETime.ListIndex) = -1 Then
  Me.ListBoxE_SETime.SetFocus
  MsgBox "Please fill in 'Show End Time' on form"
  Exit Sub
End If

If Trim(Me.TextBoxE_PickupDate.Value) = "" Then
  Me.TextBoxE_PickupDate.SetFocus
  MsgBox "Please fill in 'Pickup Date' on form"
  Exit Sub
End If

If Trim(Me.ListBoxE_PickupTime.ListIndex) = -1 Then
  Me.ListBoxE_PickupTime.SetFocus
  MsgBox "Please fill in 'Pickup Time' on form"
  Exit Sub
End If

'Hide or show offsite and order number boxes

If Me.ListBoxE_OffSiteDelivery.Value = "Yes" Then
    'EquipmentRequest.LabelE_OffSiteAdd.Visible = True          - Run Time Error 424 when No is selected on Offsite Delivery
    'EquipmentRequest.TextBoxE_OffSiteAdd.Visible = True        - Run Time Error 424 when No is selected on Offsite Delivery
    Else
    'EquipmentRequest.LabelE_OffSiteAdd.Visible = False         - Run Time Error 424 when Yes is selected on Offsite Delivery
    'EquipmentRequest.TextBoxE_OffSiteAdd.Visible = False       - Run Time Error 424 when Yes is selected on Offsite Delivery
    End If

If Me.ListBoxE_OffSiteDelivery.Value = "Yes" And Me.TextBoxE_OffSiteAdd.Value = "" Then
    Me.TextBoxE_OffSiteAdd.SetFocus
    MsgBox "Please fill in 'Enter Off Site Location Name and Address' on form"
  Exit Sub
End If

If Me.ListBoxE_RequestStatus.Value <> "New" Then
    'EquipmentRequest.LabelE_OrderNum.Visible = True         - Run Time Error 424 when No is selected on Offsite Delivery
    'EquipmentRequest.TextBoxE_OrderNum.Visible = True       - Run Time Error 424 when No is selected on Offsite Delivery
    Else
    'EquipmentRequest.LabelE_OrderNum.Visible = False       - Run Time Error 424 when Yes is selected on Offsite Delivery
    'EquipmentRequest.TextBoxE_OrderNum.Visible = False     - Run Time Error 424 when Yes is selected on Offsite Delivery
    End If

If Me.ListBoxE_RequestStatus.Value <> "New" And Me.TextBoxE_OrderNum.Value = "" Then
    Me.TextBoxE_OrderNum.SetFocus
    MsgBox "Please fill in 'Enter Order/Job #' on form"
  Exit Sub
End If


'--------------------------------------------
'Enter Data in Form
'--------------------------------------------

Sheets("Equipment Request").Range("C6") = Me.TextBoxE_RequestBy.Value       'Name of Requester
Sheets("Equipment Request").Range("C7") = Me.TextBoxE_OnSiteContact.Value   'Name of Contact
Sheets("Equipment Request").Range("C8") = Me.TextBoxE_OnSiteNumber.Value    'Phone Number format
Sheets("Equipment Request").Range("F10") = Me.TextBoxE_Comments.Value       'Comments (not required)

Sheets("Equipment Request").Range("I6") = Me.TextBoxE_EventName.Value       'Name of Event
Sheets("Equipment Request").Range("I7") = Me.ComboBoxE_LocationNumber.Value 'Location Number
Sheets("Equipment Request").Range("I8") = Me.ListBoxE_OffSiteDelivery.Value 'Yes or No Selection
Sheets("Equipment Request").Range("I9") = Me.ListBoxE_RequestStatus.Value   'New or revision or cancel selection

Sheets("Equipment Request").Range("C9") = Me.TextBoxE_PWDate.Value          'Short Date Format
Sheets("Equipment Request").Range("D9") = Me.ListBoxE_PWTime.Value          'Time Format
Sheets("Equipment Request").Range("C10") = Me.TextBoxE_DeliverDate.Value    'Short Date Format
Sheets("Equipment Request").Range("D10") = Me.ListBoxE_DeliverTime.Value    'Time Format
Sheets("Equipment Request").Range("C11") = Me.TextBoxE_SSDate.Value         'Short Date Format
Sheets("Equipment Request").Range("D11") = Me.ListBoxE_SSTime.Value         'Time Format
Sheets("Equipment Request").Range("C12") = Me.TextBoxE_SEDate.Value         'Short Date Format
Sheets("Equipment Request").Range("D12") = Me.ListBoxE_SETime.Value         'Time Format
Sheets("Equipment Request").Range("C13") = Me.TextBoxE_PickupDate.Value     'Short Date Format
Sheets("Equipment Request").Range("D13") = Me.ListBoxE_PickupTime.Value     'Time Format

'-----------------------------------------
'Vice Versa for Revisions
'-----------------------------------------

'If Me.TextBoxE_EventName.Value <> "" Then

'Me.TextBoxE_RequestBy.Value = Sheets("Equipment Request").Range("C6")
'Me.TextBoxE_OnSiteContact.Value = Sheets("Equipment Request").Range("C7")
'Me.TextBoxE_OnSiteNumber.Value = Sheets("Equipment Request").Range("C8")
'Me.TextBoxE_Comments.Value = Sheets("Equipment Request").Range("F10")
'
'Me.TextBoxE_EventName.Value = Sheets("Equipment Request").Range("I6")
'Me.ComboBoxE_LocationNumber.Value = Sheets("Equipment Request").Range("I7")
'Me.ListBoxE_OffSiteDelivery.AddItem = Sheets("Equipment Request").Range("I8")
'Me.ListBoxE_RequestStatus.AddItem = Sheets("Equipment Request").Range("I9")
'
'Me.TextBoxE_PWDate.Value = Sheets("Equipment Request").Range("C9")
'Me.ListBoxE_PWTime.AddItem = Sheets("Equipment Request").Range("D9")
'Me.TextBoxE_DeliverDate.Value = Sheets("Equipment Request").Range("C10")
'Me.ListBoxE_DeliverTime.AddItem = Sheets("Equipment Request").Range("D10")
'Me.TextBoxE_SSDate.Value = Sheets("Equipment Request").Range("C11")
'Me.ListBoxE_SSTime.AddItem = Sheets("Equipment Request").Range("D11")
'Me.TextBoxE_SEDate.Value = Sheets("Equipment Request").Range("C12")
'Me.ListBoxE_SETime.AddItem = Sheets("Equipment Request").Range("D12")
'Me.TextBoxE_PickupDate.Value = Sheets("Equipment Request").Range("C13")
'Me.ListBoxE_PickupTime.AddItem = Sheets("Equipment Request").Range("D13")
'
'End If

'------------------------------------------------------
'Message box when data has been correctly added
'------------------------------------------------------
'MsgBox "Show Information Added to Form", vbOKOnly + vbInformation, "Show Information Added to Form"

Me.Hide

Call ESaveBook

ThisWorkbook.Sheets("Equipment Request").Visible = True
ThisWorkbook.Sheets("Equipment Request").Select

End Sub

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

Почему я получаю эту ошибку?

1 Ответ

0 голосов
/ 10 июня 2019

Я предполагаю, что EquipmentRequest было именем вашей формы, и Option Explicit не указаны в верхней части модуля, чтобы требовать объявления переменной.

Без Option Explicit неизвестный идентификатор (такой как EquipmentRequest) молча превращается в локальную переменную Variant/Empty ... и когда для этой переменной выполняется вызов члена, происходит сбой с ошибкой 424, поскольку Empty не является объектом, который вы можете сделать вызовом члена - следовательно, "объект требуется".

Похоже, вы были в процессе замены всех EquipmentRequest ссылок на экземпляр по умолчанию формы квалификаторами Me - но забыли несколько.

  • Укажите Option Explicit в верхней части каждого модуля. Всегда. Сделай это привычкой. Код не скомпилируется, пока все переменные не объявлены.
  • Удалите все / все ссылки на экземпляр формы по умолчанию (т. Е. EquipmentRequest, UserForm1 или любое другое имя вашей формы), замените их на Me (то есть текущий экземпляр класса, на который вы смотрите).

Что касается огромного количества кода, то это потому, что Принцип единой ответственности - это ... ну, это просто поражение: большой кусок вверху отвечает за проверку формы - вытащите эту проблему в своя собственная процедура Например:

Private Sub TextBox1_Change()
    ValidateForm
End Sub

Private Sub ValidateForm()
    Dim validationErrors As Long

    If Trim$(Me.TextBox1.Text) = vbNullString Then
        Me.InvalidIconTextBox1.Visible = True
        validationErrors = validationErrors + 1
    Else
        Me.InvalidIconTextBox1.Visible = False
    End If

    '...

    Me.OkButton.Enabled = (validationErrors = 0)
End Sub

Где InvalidIconTextBox1 может быть элементом управления Image с небольшим растровым изображением 16x16 и удобным текстом всплывающей подсказки - это устранит необходимость во всех этих вызовах MsgBox и сделает все ошибки проверки видимыми сразу - и OkButton невозможно щелкнуть с неверными данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...