为什么这段代码适用于F1而不是CTRL-M(例如)

时间:2014-06-30 14:30:57

标签: excel vba excel-vba

我在网上找到了这个代码,它就像一个魅力:

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键,它会打开所有表格的对话框。我可以选择我想要的纸张,然后就可以了。

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

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

现在,control-m打开,对话框显示了工作表,但是当我点击工作表时,我想excel不会在那里导航。为什么触发器会有所不同,并使执行不起作用?

编辑:顺便说一下,当我用F5手动运行代码时,代码也能正常运行,而不是使用onkey control-m。

2 个答案:

答案 0 :(得分:2)

问题似乎是,当与OnKey一起使用时,即使你毫无疑问地释放了密钥,Control键也会在整个命令中持续存在。这对你做的大多数事情都没有影响,但莫名其妙地影响了More Sheets弹出窗口。拿这个代码

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

Sub WorkbooksHandler()

    SendKeys "{RIGHT}"

End Sub

所有这一切都是按右箭头键。但它具有按Ctrl + Right的效果,它会将您带到工作表的边缘(对于空白工作表)。因此,^ m的控制部分通过执行WorkbooksHandler来保持不变。

这也是手动发生的。按住控制键,右键单击工作表导航按钮,选择“更多工作表”,选择一个工作表。当你按下Control时,它不会移动到那张表。

我尝试了所有方式的SendKeys,OnTime和DoEvents,但无法欺骗Excel释放Control键。我敢打赌你可以找到一个可以解决问题的Windows API,但是简单地选择一个不使用Control的组合键可能更容易。

答案 1 :(得分:0)

确保

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(),然后尝试快捷方式