只有一个工作表的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
结束小组
如果有人知道更好的方式来确保代码在焦点返回到“计算器”表单时运行,那么我会非常感兴趣。