На блокпосту здесь. Простая форма пользователя с использованием трех текстовых полей, одно для идентификатора пользователя, два для ввода серийного номера с помощью ручного сканера. Пользователь загружает файл Excel, загружает userform.show, пользователь вводит идентификатор, затем выполняет простую проверку для проверки номера numberi c, затем фокусируется на первом текстовом поле, пользователь сканирует штрих-код для ввода серийного номера, снова простую проверку, чтобы убедиться, что цифры c и длина то же самое с последним текстовым полем, сканировать серийный номер, проверить, что первая запись в текстовом поле соответствует второй записи в текстовом поле.
Ручной сканер используется для ввода серийного номера, а также возвращает символ «возврат каретки»; например, нажмите кнопку ввода после сканирования серийного номера.
Использование «возврата каретки» для запуска обработчика события textbox_exit. Проблема очень прерывистая, но последовательная. Я загружаю пользовательскую форму, ввод данных, когда запись завершена, данные передаются на рабочий лист объекта. Однако при устранении неполадок я вначале открываю книгу и форму пользователя, создаю несколько записей, сохраняю и закрываю. Все работает хорошо, данные записываются и архивируются. Обычно проблема возникает, когда я загружаю книгу во второй раз, ввожу данные для одной записи, сохраняю и начинаю вторую запись. Как только серийный номер введен в первое текстовое поле, событие выхода никогда не запускается с использованием «возврата каретки». Я могу вручную перенести фокус на другие объекты; например, текстовое поле diff, но общая операция не соответствует ожидаемой.
Я попытался вставить команды application.eventhandler = true, различные обработчики событий, а также многочисленные изменения кода; например, выйти из sub в конце операторов IF, чтобы это сработало.
Я подумал, что хотел бы обратиться к сообществу за комментариями. К вашему сведению, по-прежнему возникают проблемы, если я имитирую ручной сканер, используя клавиши копирования / вставки и ввода.
Пример обработчика события выхода для первого последовательного текстового поля ниже.
Private Sub SerialIn_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = False
If Not IsNumeric(SerialIn.Value) Then 'validate serial number is numeric
'error msg serial number is not numeric
Msg = "Opps, something went wrong! Serial number was incorrect." _
& vbNewLine & vbNewLine & "Rescan module serial number."
MsgBox Msg, vbCritical, "Warning" 'display msg
Cancel = True 'stop user from changing focus
SerialIn.SelStart = 0 'highlight user text
SerialIn.SelLength = Len(SerialIn.Value) 'select user text
'Image1.Picture = LoadPicture(StopLightRed) 'display red stop light
Exit Sub
Else
If Not Len(SerialIn.Value) = 19 Then 'validate serial number length
'error msg incorrect length
Msg = "Opps, something went wrong! Serial number was incorrect." _
& vbNewLine & vbNewLine & "Rescan module serial number."
MsgBox Msg, vbCritical, "Warning"
Cancel = True 'stop user from changing focus
SerialIn.SelStart = 0 'highlight user text
SerialIn.SelLength = Len(SerialIn.Value) 'select user text
'Image1.Picture = LoadPicture(StopLightRed) 'display red stop light
Exit Sub
Else
SerialInTime.Caption = Now 'record date and time
'Image1.Picture = LoadPicture(StopLightYellow) 'display yellow WIP stop light
Me.SerialOut.SetFocus
Exit Sub
End If
End If End Sub
Новый код:
Private Sub SerialIn_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = ValidateSerialIn(SerialIn)
End Sub
Function ValidateSerialIn(ByVal TextBox As Object) As Boolean
If Not IsNumeric(SerialIn.Value) Then 'validate serial number is numeric
'error msg serial number is not numeric
Msg = "Opps, something went wrong! Serial number was incorrect." _
& vbNewLine & vbNewLine & "Rescan module serial number."
msgbox Msg, vbCritical, "Warning" 'display msg
SerialIn.SetFocus
SerialIn.SelStart = 0 'highlight user text
SerialIn.SelLength = Len(SerialIn.Value) 'select user text
'Image1.Picture = LoadPicture(StopLightRed) 'display red stop light
ValidateSerialIn = True
Else
If Not Len(SerialIn.Value) = 19 Then 'validate serial number length
'error msg incorrect length
Msg = "Opps, something went wrong! Serial number was incorrect." _
& vbNewLine & vbNewLine & "Rescan module serial number."
msgbox Msg, vbCritical, "Warning"
'Cancel = True 'stop user from changing focus
SerialIn.SelStart = 0 'highlight user text
SerialIn.SelLength = Len(SerialIn.Value) 'select user text
'Image1.Picture = LoadPicture(StopLightRed) 'display red stop light
ValidateSerialIn = True
Else
SerialInTime.Caption = Now 'record date and time
'Image1.Picture = LoadPicture(StopLightYellow) 'display yellow WIP stop light
ValidateSerialIn = False
End If
End If
End Function
Третий go с использованием решения Тима TextBox_Change:
Private Sub SerialIn_Change()
Dim v
v = ScannedValue1(SerialIn.Text)
If Len(v) > 0 Then
If Not IsNumeric(v) Then 'validate serial number is numeric
'error msg serial number is not numeric
Msg = "Opps, something went wrong! Serial number was incorrect." _
& vbNewLine & vbNewLine & "Rescan module serial number."
msgbox Msg, vbCritical, "Warning" 'display msg
SerialIn.Text = vbNullString
Else
If Not Len(v) = 19 Then 'validate serial number length
'error msg incorrect length
Msg = "Opps, something went wrong! Serial number was incorrect." _
& vbNewLine & vbNewLine & "Rescan module serial number."
msgbox Msg, vbCritical, "Warning"
SerialIn.Text = vbNullString
'Image1.Picture = LoadPicture(StopLightRed) 'display red stop light
Else
SerialInTime.Caption = Now 'record date and time
'Image1.Picture = LoadPicture(StopLightYellow) 'display yellow WIP stop light
SerialOut.SetFocus
End If
End If
End If
End Sub
'check if a value ends with vbcrlf or vblf
' - if yes strip that off and return the rest
' - otherwise returns empty string
Function ScannedValue1(vIn) As String
Dim rv As String
If Right(vIn, 2) = vbCrLf Then
ScannedValue1 = Replace(vIn, vbCrLf, "")
ElseIf Right(vIn, 1) = vbLf Then
ScannedValue1 = Replace(vIn, vbLf, "")
End If
End Function