为什么这个代码与F1而不是CTRL-M(例如)

我在网上发现了这个代码,它的function就像一个魅力:

Sub Auto_Open() Application.OnKey "{F1}", "WorkbooksHandler" End Sub Sub WorkbooksHandler() On Error Resume Next If ActiveWorkbook.Sheets.Count <= 16 Then Application.CommandBars("Workbook Tabs"). _ ShowPopup 500, 225 Else Application.CommandBars("Workbook Tabs"). _ Controls("More Sheets...").Execute End If On Error GoTo 0 End Sub 

我按下F1,并打开与所有表单的对话。 我可以select我想要的工作表,然后去那里。

如果我稍微更改代码,并使用:

 Sub Auto_Open() Application.OnKey "^{m}", "WorkbooksHandler" End Sub 

现在控制-m打开对话框显示我的工作表,但是当我点击工作表,我想Excel不会导航那里。 为什么触发器有什么区别,并使执行不起作用?

编辑:顺便说一句,代码也工作正常,当我用F5手动运行它,只是没有onkey控制-m。

问题似乎是,即使您无疑释放了密钥,Control键在与OnKey一起使用时仍然贯穿整个命令。 这对你所做的大部分事情没有任何影响,但莫名其妙地影响了“更多信息”popup窗口。 拿这个代码

 Sub Auto_Open() Application.OnKey "^m", "WorkbooksHandler" End Sub Sub WorkbooksHandler() SendKeys "{RIGHT}" End Sub 

所做的只是按右箭头键。 但是它具有按Ctrl +右键的效果,它将您带到工作表的边缘(对于空白工作表)。 因此,^ m的控制部分正在执行WorkbooksHandler。

这也是手动发生的。 按住控制键,右键单击工作表导航button,select更多工作表,select工作表。 当您按住Control键时,它不会移动到该表格。

我尝试过SendKeys,OnTime和DoEvents的所有方式,但不能把Excel放到释放Control键的地方。 我敢打赌,你可以find一个Windows API来做这个伎俩,但是简单的select一个不使用Control的组合键可能会更容易一些。

确保

 Sub WorkbooksHandler() On Error Resume Next If ActiveWorkbook.Sheets.Count <= 16 Then Application.CommandBars("Workbook Tabs"). _ ShowPopup 500, 225 Else Application.CommandBars("Workbook Tabs"). _ Controls("More Sheets...").Execute End If On Error GoTo 0 End Sub 

被粘贴在模块中

然后编译并手动运行Auto_Open() ,然后尝试快捷方式