我正在尝试添加代码,使“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。)
答案 0 :(得分:3)
您不需要OnKey
:) Excel允许您更改Enter键移动方向。
您也可以通过代码更改它。
在模块中,输入此
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语句来简化它运行的过程。
希望这可以节省别人的时间和挫折感: - )