使用VBA控制Excel中的Tab键行为

问题描述 投票:0回答:1

我在excel中创建了一个表单,现在想通过按Tab键从单元格跳转到单元格,但只能在用户输入数据的单元格之间跳转。一种解决方案是锁定纸张,只留下未锁定的字段,用户应在其中输入内容。但是,这不适用于包含合并单元格(我需要)的字段,如果合并字段分配在“单个条目单元格”旁边的多行上,它也会遇到困难。 Tab键然后只是跳回到前一个单元格而不向前移动。

因此,我需要“手动”控制Tab键的行为,并遇到以下代码:

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

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

上面的工作是在按下TabKey时触发事件。现在我需要帮助编写函数TabIntercept来将tab键发送到我表单中的下一个入口单元格。假设我在B3,B8,D3,E3,E6中有5个字段,其中应输入数据。

谁能帮我这个?

谢谢!

excel vba excel-vba
1个回答
0
投票

这样的事情应该有效:

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
© www.soinside.com 2019 - 2024. All rights reserved.