我正在尝试让 VBA 触发命令
sImportFilePath = Application.GetOpenFilename(FileFilter:= _
"Excel Files (*.xls), *.xls", Title:="Choose The Source File")
Application.Workbooks.Open (sImportFilePath)
sImportFileName = FunctionGetFileName(sImportFilePath)
当我单步执行该函数时,它们会起作用,但是当我使用热键 Ctrl+Shift+F 或任何其他热键时,Application.Workbooks.Open
命令有效,但它导航新的 Excel 文档,然后不执行任何操作。但是,当我在开发人员选项卡中打开“宏”时,选择我的宏,然后单击“运行”,一切运行正常。
最佳答案
我自己实际上也遇到了这个问题,并最终找到了解决我的问题的方法。
它是您用来调用代码的键盘快捷键中的 Shift 按钮。
显然,Excel 中有一项专门设计的功能,用于在打开工作簿并按下 Shift 键时阻止代码运行,但不幸的是,这也会影响使用 Workbook.Open 打开工作簿
通过 VBA 的方法。 KB Article 555263中提到了这一点,适用于 Excel 2000 和 2003,但我在 Excel 2010 中遇到了同样的问题,所以我想它也会影响 2007。
当您尝试在程序的早期阶段通过代码打开工作簿时,尤其会发生这种情况。如果在您有足够的时间实际松开 Shift 按钮之前,在代码中调用了 Workbook.Open
,Excel 会将其解释为试图阻止代码运行并中止该进程。并且没有任何错误消息或我发现的任何内容。它突然停止了。
解决方法/修复方法是强制代码等待 Shift 键释放,然后再发出 Workbook.Open
命令。
根据文章,只需将此代码添加到您的宏中即可:
'Declare API
Declare Function GetKeyState Lib "User32" (ByVal vKey As Integer) As Integer
Const SHIFT_KEY = 16
Function ShiftPressed() As Boolean
'Returns True if shift key is pressed
ShiftPressed = GetKeyState(SHIFT_KEY) < 0
End Function
Sub Demo()
Do While ShiftPressed()
DoEvents
Loop
Workbooks.Open Filename:="C:\MyPath\MyFile.xlsx"
End Sub
(注意:此代码适用于 32 位版本的 Excel。64 位版本需要在 Declare
语句中使用 PtrSafe
属性)。
如果您不想添加额外的代码,那么您唯一的选择就是不使用 Ctrl+Shift+Some Letter 启动宏,或者将 Workbook.Open
命令放在宏后面(而不是放在开头),以便在启动后给自己时间释放 Shift 按钮。
关于打开另一个工作簿后 Excel 无法完成宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6959005/