只有一个工作表的OnKey

我试图添加代码,使“input”键行为像一个(保护)工作表的“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 

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

关于如何让'Enter'键在'Lists'表中'正常'行事的build议?

(我正在使用Excel 2013和2010)

你不需要OnKey这个:)让我们来改变Enter键的移动方向。

在这里输入图像说明

你也可以通过代码来改变它。

在一个模块中,input这个

 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 

道歉,如果我得到任何这个错误,我正在学习,我走了!

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

 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语句来简化它所运行的过程。

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

好的 – 想想我已经搞定了! 感谢所有的帮助。

问题1:想让“回车”键在一张工作表中像“tab”键一样,使光标跳到下一个不受保护的单元格。

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

问题3:如果在打开原始(Test FRF3.xlsm)工作簿的同时打开另一个工作簿,则需要使用回车键在新工作簿中执行默认的excel操作。 (没有'如果ActiveWorkbook.Name ='位,我发现如果打开了另一个工作簿,而我打开了原始的“Test FRF3.xlsm”工作簿,并且随后closures了原来的工作簿,然后按下回车键,这个重新打开原来的工作簿!我敢肯定,与用户不会很好!!)

这似乎工作:在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 

结束小组

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