Вопрос или проблема
Я использую приведенный ниже код в пользовательской форме для сканирования штрих-кодов SKU и сохранения записей в определенном столбце, но после сканирования штрих-кода курсор не остается на месте в текстовом поле. Я хочу, чтобы курсор всегда находился в текстовом поле.
Private Sub TextBox2_AfterUpdate()
Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Value = TextBox2.Value
TextBox2.Value = ""
userform1.TextBox2.SetFocus
End Sub
В этом примере следующий элемент управления в порядке TAB
CommandButton1
Поскольку после нажатия ENTER
и обработки всех событий Excel автоматически перемещает точку вставки на следующий элемент управления. Событие Enter
восстанавливает фокус.
Private Sub CommandButton1_Enter()
UserForm1.TextBox1.SetFocus
End Sub
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Value = TextBox1.Value
TextBox1.Value = ""
End Sub
Ответ или решение
Для решения проблемы, связанной с удержанием курсора в текстовом поле (TextBox) пользовательской формы Excel после сканирования штрих-кода, вам необходимо учесть, что Excel автоматически перемещает фокус на следующий элемент управления, когда вы нажимаете клавишу «Enter». Ваша задача состоит в том, чтобы контролировать поведение формы и вернуть фокус обратно в текстовое поле сразу после завершения ввода.
Решение проблемы с фокусом в TextBox
Ниже представлен модифицированный код, который позволяет решить вашу задачу, поддерживая курсор в TextBox2 после сканирования:
Private Sub TextBox2_AfterUpdate()
' Записываем значение из TextBox2 в следующую пустую строку в столбце "A"
Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Value = TextBox2.Value
' Очищаем текстовое поле для нового ввода
TextBox2.Value = ""
' Устанавливаем фокус обратно на TextBox2
TextBox2.SetFocus
End Sub
Private Sub CommandButton1_Click()
' Этот код выполняется при нажатии кнопки
Call TextBox1_Exit(False) ' Проверяем текстовое поле перед переходом
End Sub
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
' Записываем значение из TextBox1 в следующую строку в столбце "A"
Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Value = TextBox1.Value
' Очищаем TextBox1
TextBox1.Value = ""
' Возвращаем фокус обратно на TextBox2
TextBox2.SetFocus
End Sub
Private Sub TextBox1_Enter()
' Установка фокуса на TextBox1, если он активен
TextBox1.SetFocus
End Sub
Объяснение кода
-
Обработчик событий
AfterUpdate
:- Код в этом блоке выполняется каждый раз, когда текст в TextBox2 изменяется и пользователь уходит от него (включая нажатие клавиши «Enter»).
- Значение из TextBox2 записывается в следующую пустую строку в столбце «A», и поле очищается для следующего ввода.
- С помощью
TextBox2.SetFocus
фокус возвращается обратно в текстовое поле.
-
Обработчик нажатия кнопки (CommandButton):
- При нажатии кнопки происходит вызов процедуры, которая обрабатывает выход из TextBox1. Здесь также обеспечивается возврат фокуса на TextBox2.
-
Обработчик
Exit
для TextBox1:- При выходе из TextBox1 происходит запись данных и возврат фокуса на TextBox2, что позволяет пользователю сразу же начать вводить следующий штрих-код без лишних кликов.
-
Обработчик
Enter
для TextBox1:- Этот блок отвечает за установку фокуса на TextBox1, когда он становится активным.
Заключение
Таким образом, данный код позволяет поддерживать курсор в текстовом поле, упрощая процесс ввода данных для пользователей. Избегая лишних действий, таких как дополнительный клик мышкой, вы значительно улучшаете пользовательский интерфейс вашей формы.
Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.