OnKey仅适用于一个工作表

时间:2015-11-07 19:59:13

标签: excel vba excel-vba

我正在尝试添加代码,使“Enter”键的行为类似于一个(受保护的)工作表的“Tab”键,但不会出现在任何其他工作表中。我在ThisWorkbook模块中有这个代码:

Private Sub Workbook_Open()
 Application.OnKey "~", "MoveThruForm"
 Application.OnKey "{enter}", "MoveThruForm"
End Sub

在一个单独的模块中,我尝试过:

Private Sub MoveThruForm()
Select Case ActiveSheet.CodeName
    Case "Calculator"
    SendKeys "{tab}"
    Exit Sub

    Case "Lists"
    Application.OnKey "~" 'wanted this to set 'enter' key to be normal 'enter' key but it doesn't!
    'SendKeys "{down}" 'This works but is very much a workaround!

End Select
End Sub

这在“计算器”表单中工作正常,但在“列表”表单中没有。

有关如何让“输入”键在“列表”表单中“正常”操作的任何建议吗?

(我正在使用Excel 2013和2010。)

3 个答案:

答案 0 :(得分:3)

您不需要OnKey :) Excel允许您更改Enter键移动方向。

enter image description here

您也可以通过代码更改它。

在模块中,输入此

Public PreState As Long

将此代码放在工作簿代码区

Private Sub Workbook_Open()
    '~~> Store ENTER Key move behaviour
    PreState = Application.MoveAfterReturnDirection
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    '~~> Check here which sheet is active and then
    '~~> decide where the ENTER key should move
    If Sh.Name = "Calculator" Then
        Application.MoveAfterReturn = True
        Application.MoveAfterReturnDirection = xlToRight
    Else
        Application.MoveAfterReturnDirection = PreState
    End If
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    '~~> Reset ENTER Key behaviour
    Application.MoveAfterReturnDirection = PreState
End Sub

答案 1 :(得分:0)

好的 - 想想我已经解决了!!感谢您的帮助。

问题1:希望“输入”键仅在一个工作表中像“标签”键一样使它使光标跳转到下一个不受保护的单元格。

问题2:希望enter键在工作簿中唯一的其他工作表中以默认的excel方式工作。

问题3:如果在原始(Test FRF3.xlsm)工作簿打开时打开了另一个工作簿,我希望输入键在新工作簿中执行默认的excel操作。 (如果没有'If ActiveWorkbook.Name ='位,我发现如果打开另一个工作簿,而原始的'Test FRF3.xlsm'工作簿打开,并且我随后关闭原始工作簿并打开新工作簿,则宏会保持不变,然后按下回车键,这重新打开原始工作簿!我相信用户不会很好!!)

这似乎有效: 在ThisWorkbook中:

 Private Sub Workbook_Open()

If ActiveWorkbook.Name = "Test FRF3.xlsm" Then
    Sheets("Lists").Activate
    Sheets("Calculator").Activate
    ElseIf ActiveWorkbook.Name <> "Test FRF3.xlsm" Then
    Exit Sub
End If

End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

    If Sh.Name = "Calculator" Then
        Application.OnKey "~", "MoveThruForm"
        Application.OnKey "{enter}", "MoveThruForm"
        'ElseIf Sh.Name = "Lists" Then
        ElseIf Sh.Name <> "Calculator" Then
        Application.OnKey "~"
        Application.OnKey "{enter}"
    Exit Sub
    End If

End Sub

在单独的模块中:

Private Sub MoveThruForm()
    If ActiveWorkbook.Name = "Test FRF3.xlsm" Then
        SendKeys "{tab}"
        ElseIf ActiveWorkbook.Name <> "Test FRF3.xlsm" Then
        Application.OnKey "~"
        Application.OnKey "{enter}"
    End If
End Sub

希望对人们有意义 - 如果有必要,乐意澄清!!

另外:我发现这一切都正常,除非用户打开另一个工作簿并开始使用另一个工作簿,同时在后台打开“计算器”。如果他们随后返回“计算器”表,Excel似乎不会“重新激活”工作表的“计算器”(因此所有键都会返回到默认操作),所以我在工作表中添加了这个作为解决方法 - 它只有在进行更改时才会起作用(这通常是用户返回电子表格时发生的情况 - 他们会添加一些数字,以便它可以正常工作:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
'If Target.Address <> "$A$1" Then_or probably better even tho A1 is a protected cell:
If Not Application.Intersect(Target, Me.Range("A1:L100")) Is Nothing Then
    Application.OnKey "~", "MoveThruForm"
    Application.OnKey "{enter}", "MoveThruForm"
End If

End Sub

如果有人知道更好的方法来确保代码运行,焦点会返回到“计算器”表,我会非常感兴趣。

答案 2 :(得分:0)

如果我发现任何错误,请道歉,我正在学习!

Application.OnKey在应用程序级别更改密钥的功能,即更改将影响当前打开的每个工作簿。因此,为了只应用于一个工作表,我发现最简单的解决方案是在激活工作表时设置它,然后在工作表停用时更改回默认值。

Private Sub Worksheet_Activate() ' in the worksheet that you want to change

    Application.OnKey "~", "YourMacroHere"
    Application.OnKey "{ENTER}", "YourMacroHere"

End Sub

Private Sub Worksheet_Deactivate() ' in the same worksheet

    Application.OnKey "~"
    Application.OnKey "{ENTER}"

End Sub

但是,切换工作簿时似乎没有触发Worksheet_Deactivate事件,因此要解决此问题,请使用Workbook_Deactivate事件将Application.OnKey更改回ThisWorkbook中的默认值。

Private Sub Workbook_Deactivate()

    Application.OnKey "~"
    Application.OnKey "{ENTER}"

End Sub

现在Application.OnKey仅在激活特定工作表和工作簿时才会更改,您应该能够通过取出If语句来简化它运行的过程。

希望这可以节省别人的时间和挫折感: - )