Userform для ввода информации и при отзыве покажет, что было введено ранее - PullRequest
0 голосов
/ 07 июня 2019

Новое в VBA, поэтому код может быть немного больше, чем нужно (т. Е. Могли быть сделаны объекты и т. Д.).Мне нужно иметь возможность вводить информацию с помощью пользовательской формы, а затем, если требуется ревизия, она вызывает ту же пользовательскую форму и содержит данные, которые ранее были введены в textBoxes / listBoxes.

Проблема, с которой я сталкиваюсь, заключается вчто у меня «Ошибка времени выполнения» 380 «Не удалось установить свойство Value. Недопустимое значение свойства».

Если я достану раздел «Версии для ревизий», он войдет просто отлично, но затем при вызове пользовательской формы он снова будет пустым.

Буду весьма признателен за любые советы по исправлению или даже очистке кода.

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"
        Exit Sub
End If

If Trim(Me.TextBoxE_OnSiteContact.Value) = "" Then
    Me.TextBoxE_OnSiteContact.SetFocus
    MsgBox "Please fill in 'On Site Contact' on form"
        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
    EquipmentRequest.TextBoxE_OffSiteAdd.Visible = True
    Else
    EquipmentRequest.LabelE_OffSiteAdd.Visible = False
    EquipmentRequest.TextBoxE_OffSiteAdd.Visible = False
    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
    EquipmentRequest.TextBoxE_OrderNum.Visible = True
    Else
    EquipmentRequest.LabelE_OrderNum.Visible = False
    EquipmentRequest.TextBoxE_OrderNum.Visible = False
    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.Value = Sheets("Equipment Request").Range("I8")
Me.ListBoxE_RequestStatus.Value = Sheets("Equipment Request").Range("I9")

Me.TextBoxE_PWDate.Value = Sheets("Equipment Request").Range("C9")
Me.ListBoxE_PWTime.Value = Sheets("Equipment Request").Range("D9")
Me.TextBoxE_DeliverDate.Value = Sheets("Equipment Request").Range("C10")
Me.ListBoxE_DeliverTime.Value = Sheets("Equipment Request").Range("D10")
Me.TextBoxE_SSDate.Value = Sheets("Equipment Request").Range("C11")
Me.ListBoxE_SSTime.Value = Sheets("Equipment Request").Range("D11")
Me.TextBoxE_SEDate.Value = Sheets("Equipment Request").Range("C12")
Me.ListBoxE_SETime.Value = Sheets("Equipment Request").Range("D12")
Me.TextBoxE_PickupDate.Value = Sheets("Equipment Request").Range("C13")
Me.ListBoxE_PickupTime.Value = 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"

Unload Me

Call ESaveBook

End Sub

1 Ответ

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

Это, вероятно, связано с тем, как вы пытаетесь присвоить значения с помощью своих списков.Похоже, у вас есть несколько элементов в списках, и вы хотите выбрать или выделить тот, который пользователь выбрал последним.Если это так, вы не можете сделать это следующим образом:

Me.ListBoxE_DeliverTime.Value = Sheets("Equipment Request").Range("D10")

Он либо выдаст ошибку, либо ничего не отобразит в списке.Причина в том, что для выбора или выделения элемента в списке (показать, что ранее выбрал пользователь) необходимо передать целочисленное значение для индекса:

Me.ListBoxE_DeliverTime.Selected(2) = True

, который бы выделил / выделил3-й пункт в списке.Таким образом, чтобы показать в окне списка, что пользователь ранее выбрал или ввел, вам нужно будет использовать обходной путь, например оператор case , а затем передать целочисленное значение, соответствующее тексту.

Если вы хотите показать только текст из ячейки, содержащей предыдущий выбор (в данном случае D10), вы можете добавить его в качестве элемента в поле списка:

Me.ListBoxE_DeliverTime.AddItem (Sheets("Equipment Request").Range("D10").Value2)

Однако я советую избегать спискакоробки целиком.Названия ваших списков предполагают, что вы абстрагируете и отображаете одно значение за раз (ранее введенная дата, ранее введенное время);если это так, то лучше использовать текстовое поле или метку для каждого значения.

В качестве дополнительного примечания рекомендуется явно указывать vba.Когда вы вводите код, подобный следующему:

Me.TextBoxE_Comments.Value = Sheets("Equipment Request").Range("F10")

Это может работать (на этот раз), но если вы просто заинтересованы в абстрагировании значения от ячейки, тогда ваш код будет наиболее эффективен, если добавить .Value2 кконец:

Me.TextBoxE_Comments.Value = Sheets("Equipment Request").Range("F10").Value2

.Value2 абстрагирует значение от цели без форматирования.

...