使用VBA

时间:2019-01-02 17:30:25

标签: excel vba excel-vba

我在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个字段,应在其中输入数据。

有人可以帮我吗?

谢谢!

1 个答案:

答案 0 :(得分: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