Стрелка в текстовом поле пользовательской формы, VBA

Я работаю над пользовательской формой с несколькими текстовыми полями, которые упорядочены так же, как диаграмма excel. Я установил TabIndexes, и они отлично работают с TAB / shift + TAB. Однако реакция нажатия клавиш со стрелками не та, что я ожидал. Я назвал эти текстовые поля следующим образом:

boxA1 boxB1 boxC1 boxD1 boxA2 boxB2 boxC2 boxD2 ... boxA3 boxB3 boxC3 boxD3 : : 

Предполагая, что фокус находится в boxB1. При нажатии клавиши со стрелкой вниз, я хочу, чтобы фокус переместился в boxB2, но он перейдет в boxA3 или что-то еще.

Я пробовал этот код:

 Private Sub boxB1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Select Case KeyCode Case vbKeyDown boxB2.SetFocus Case vbKeyUp boxA10.SetFocus End Select End Sub 

Он работает отлично, однако, если в моей форме есть только несколько текстовых полей, это отличное и ясное решение. Но в моей форме около 70 текстовых полей, это сделает мой код большим и действительно продублированным. Есть ли какие-либо параметры, которые я могу настроить, чтобы сделать это правильно? Или есть какая-либо функция, которую я могу использовать, например, ниже? Вы знаете, просто судо.

 Private Sub name_i_KeyDown(ByVal KeyCode as MSForms.ReturnInteger, ByVal Shift As Integer) Select Case KeyCode Case vbKeyDown Controls("name_" & i+1).SetFocus Case vbKeyUp Controls("name_" & i-1).SetFocus End Select End Sub 

Спасибо!

Вы на правильном пути. Добавьте ниже двух UDF в ваш модуль формы:

 Sub SetTextBoxFocus(ByVal KeyCode As MSForms.ReturnInteger) Dim sPrevControl As String Dim sNextControl As String Dim sBoxToSet As String Dim oC As Control ' Cater for TAB key press. Setting it so that it behaves like vbKeyDown. Remove this If condition if not required If Asc(KeyCode) = 57 Then KeyCode = vbKeyDown End If ' We only want to check if pressed key was either vbKeyDown or vbKeyUp and the key was pressed on a TextBox If TypeName(Me.ActiveControl) = "TextBox" And (KeyCode = vbKeyDown Or KeyCode = vbKeyUp) Then With Me.ActiveControl ' Lets set both previous and next text box names If InStr(1, .Name, "boxD") > 0 Then sPrevControl = "boxC" & GetNumFromString(.Name) sNextControl = "boxA" & GetNumFromString(.Name) + 1 ElseIf InStr(1, .Name, "boxA") > 0 Then sPrevControl = "boxD" & GetNumFromString(.Name) - 1 sNextControl = "boxB" & GetNumFromString(.Name) Else sPrevControl = "box" & Chr(Asc(Mid(.Name, 4, 1)) - 1) & GetNumFromString(.Name) sNextControl = "box" & Chr(Asc(Mid(.Name, 4, 1)) + 1) & GetNumFromString(.Name) End If ' Bases on which key was pressed, lets set the name of the text box to move to Select Case KeyCode Case vbKeyDown: sBoxToSet = sNextControl Case Else: sBoxToSet = sPrevControl End Select ' Loop through all controls in the form and set the focus to the control if found For Each oC In Me.Controls If oC.Name = sBoxToSet Then oC.SetFocus Exit For End If Next End With End If End Sub Function GetNumFromString(ByVal txt As String) As String Dim oRe As New RegExp With oRe .pattern = "\d" If .Test(txt) Then GetNumFromString = .Execute(txt)(0) End With End Function 

Теперь, в KeyDown для каждого TextBox, сделайте следующий вызов: SetTextBoxFocus KeyCode . Это должно сделать трюк

ПРИМЕЧАНИЕ. У меня есть boxD как последнее текстовое поле. Вы должны изменить это на любое последнее текстовое поле, которое у вас есть в той же строке

  • Присоединение текстового поля к точке или строке на диаграмме в Excel / VBA
  • Как активировать входной режим с VBA на текстовом поле неактивного x, вставленного в рабочий лист?
  • Excel VBA Append для TextBox медленный
  • Excel 2010 не может вставляться в текстовое поле формы
  • Ячейка, связанная с текстовым полем ActiveX, возвращающая текст вместо номера
  • Как получить доступ к текстовому блоку, размещенному на листе в модуле VBA?
  • Не удалось извлечь содержимое текстового поля Powerpoint в Excel с помощью Excel VBA
  • Копирование / управление форматированным текстом в текстовых блоках в Excel 2013 с использованием VBA
  • Добавление чисел с использованием форм Excel
  • Код устранения неполадок для макросов и текстовых полей
  • Очистка текстового поля при нажатии кнопки VBA
  • Interesting Posts

    Работа с файлом Excel в MVC

    Как взять название веб-сайта и добавить его в электронную таблицу Excel с помощью AppleScript + Excel

    VBA: Получение времени выполнения 1004: метод «Диапазон» объекта «Рабочий стол» не удался при использовании ячеек

    Excel VBA скребок со стола

    Применение StyleIndexId для нескольких ячеек в строке Excel с помощью OfficeXml

    Есть ли библиотека Java-Excel, которая поддерживает AutoFilter в Excel?

    Использование Today () и Mid in excel

    Почему индекс стиля ячейки возвращает неправильное значение CellFormat при анализе excel-ячеек с помощью OpenXML SDK?

    Какой тип объекта представляет собой несколько выбранных листов в Excel?

    C # Interop не закрывает процесс Excel после выполнения

    Почему «Wrap Text» включается при копировании из DataGridView в Excel?

    Экспорт таблицы HTML в Excel и форматирование Файл Excel

    копирование данных с одного листа на разные листы с разными критериями

    Как обмениваться этой проблемой Excel VBA с точки зрения приоритезации кода?

    Скомпилируйте данные из нескольких выбранных файлов Excel в один файл сводки

    Давайте будем гением компьютера.