Поведение клавиши Tab в Excel с VBA - PullRequest
0 голосов
/ 02 января 2019

Я создал форму в Excel и теперь хочу переходить от ячейки к ячейке, нажимая клавишу табуляции, но только между ячейками, в которые пользователь должен ввести данные. Решение состоит в том, чтобы заблокировать лист и оставить только те поля, в которые пользователь должен что-то ввести. Тем не менее, это не работает с полями, содержащими объединенные ячейки (которые мне нужны), а также борется, если объединенное поле размещается в нескольких строках, расположенных рядом с «ячейкой с одной записью». Затем клавиша табуляции просто возвращается к предыдущей ячейке и не перемещается вперед.

Поэтому мне нужно «вручную» контролировать поведение клавиши табуляции и наткнулся на следующий код:

Private Sub Worksheet_Activate()
    Application.OnKey "{TAB}", "TabIntercept"
End Sub

Private Sub Worksheet_Deactivate()
    Application.OnKey "{TAB}"
End Sub

Выше работает для запуска события при нажатии TabKey. Теперь мне нужна помощь в написании функции TabIntercept для отправки клавиши табуляции в следующую ячейку ввода в моей форме. Скажем, у меня есть 5 полей в B3, B8, D3, E3, E6, в которые должны быть введены данные.

Может ли кто-нибудь помочь мне с этим?

Спасибо!

1 Ответ

0 голосов
/ 02 января 2019

Примерно так должно работать:

Sub TabIntercept()

    Const TAB_ORDER As String = "B3,B8,D3,E3,E6" 'entry cell addresses in tab order
    Dim arr, a, x, nxt, sel

    If TypeName(Selection) <> "Range" Then Exit Sub 'Exit if (eg) a shape is selected
    Set sel = Selection.Cells(1) 'if multiple cells selected use the first...

    arr = Split(TAB_ORDER, ",")
    For x = LBound(arr) To UBound(arr)
        If sel.Address(False, False) = arr(x) Then
            'loops back to start if at end...
            nxt = IIf(x = UBound(arr), LBound(arr), x + 1)
            Range(arr(nxt)).Select
            Exit For
        End If
    Next x

End Sub

РЕДАКТИРОВАТЬ : использование именованных диапазонов будет очень похоже -

Sub TabIntercept2()

    Const TAB_ORDER As String = "tabs1,tabs2,tabs3,tabs4,tabs5"  'as named ranges
    Dim arr, a, x, nxt, sel

    If TypeName(Selection) <> "Range" Then Exit Sub 'Exit if (eg) a shape is selected
    Set sel = Selection.Cells(1) 'if multiple cells selected use the first...

    arr = Split(TAB_ORDER, ",")
    For x = LBound(arr) To UBound(arr)
        If sel.Address() = sel.Parent.Range(arr(x)).Address() Then
            'loops back to start if at end...
            nxt = IIf(x = UBound(arr), LBound(arr), x + 1)
            sel.Parent.Range(arr(nxt)).Select
            Exit For
        End If
    Next x

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