打开另一个工作簿后Excel不完成宏

soy*_*uce 18 excel vba

我正试图让VBA解雇命令

sImportFilePath = Application.GetOpenFilename(FileFilter:= _
"Excel Files (*.xls), *.xls", Title:="Choose The Source File")
Application.Workbooks.Open (sImportFilePath)
sImportFileName = FunctionGetFileName(sImportFilePath)
Run Code Online (Sandbox Code Playgroud)

当我单步执行该功能时它们会工作,但是当我使用热键Ctrl + Shift + F或任何其他热键时,该Application.Workbooks.Open命令可以工作,但它会导航新的Excel文档,然后不会执行任何操作.但是,当我在开发人员选项卡中打开"宏"时,选择我的宏,然后单击"运行",一切运行正常.

psu*_*003 24

我实际上遇到了这个问题,最终找到了解决问题的方法.

它是Shift用于调用代码的键盘快捷键中的按钮.

显然,Excel中有一项功能专门用于防止代码在打开工作簿并按下Shift键时运行,但不幸的是,这也会影响Workbook.Open通过VBA 使用该方法打开工作簿.这在KB Article 555263中提到,适用于Excel 2000和2003,但我在Excel 2010中遇到了同样的问题,所以我想它也影响了2007.

当您尝试在程序的早期通过代码打开工作簿时,会发生这种情况.如果Workbook.Open在您有足够的时间实际放开Shift按钮之前已在代码中达到调用,则Excel会将此解释为阻止代码运行并中止该过程.并且没有错误消息或我找到的任何内容.它突然停止了.

解决方法/修复方法是强制代码在发出Workbook.Open命令之前等待释放Shift键.

根据文章,只需将此代码添加到您的宏,并应该这样做:

'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
Run Code Online (Sandbox Code Playgroud)

(注意:此代码适用于32位版本的Excel.64位版本需要使用语句中的PtrSafe属性Declare).

如果您不想添加额外的代码,那么您唯一的其他选择是不使用Ctrl+ Shift+ Some Letter来启动宏,或者Workbook.Open稍后将命令放在宏中(不是在开头)以便给自己留出时间启动后释放Shift按钮.