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

我试图让VBA发射命令

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

而且,当我逐步完成这个function时,它们会工作,但是当我使用热键Ctrl + Shift + F或任何其他热键时, Application.Workbooks.Open命令可以工作,但它会导航新的Excel文档,因此不会执行任何操作。 但是,当我在开发人员选项卡中打开“macros”,select我的macros,然后单击“运行”一切运行正常。

我实际上碰到了这个确切的问题,并最终find了解决我的问题的方法。

这是您用来调用您的代码的键盘快捷方式中的Shiftbutton。

显然,Excel中有一项function,专门devise用于防止在打开工作簿并按下Shift键时运行代码,但不幸的是,这也会影响通过VBA打开Workbook.Open方法的Workbook.Open 。 这在知识库文章555263中提到,适用于Excel 2000&2003,但是我在Excel 2010中遇到了同样的问题,所以我想它也会影响到2007年。

当您尝试在程序的早期通过代码尝试打开工作簿时,会发生这种情况。 如果Workbook.Open调用在代码到达之前已经有足够的时间来放开Shiftbutton,则Excel会将其解释为尝试阻止代码运行并中止该过程。 并没有任何错误信息或任何我find的。 它只是突然停下来。

解决办法是强制代码在发出Workbook.Open命令之前等待Shift键被释放。

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

 '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属性)。

如果您不想添加额外的代码,那么您唯一的其他select是不使用Ctrl + Shift + 某些字母来启动一个macros,或者稍后将macros中的Workbook.Open命令(不是在开头)为了让自己有时间来启动后释放Shiftbutton。

在调用Workbooks.Open之前,只需将一个调用添加到“DoEvents”中即可。 所以下面的代码片段将起作用:

 DoEvents Workbooks.Open Filename:="C:\MyPath\MyFile.xlsx" 

我的猜测会改变

 Application.Workbooks.Open (sImportFilePath) 

 Application.Workbooks.Open sImportFilePath 

..你没有分配返回的书。 是的,它会打开书,但它会死。 我无法想象它做任何其他事情时调用任何不同,所以我不认为最后一个函数在您的例子中曾经被称为。

如果'Option Explicit'被添加到模式的顶部,那么debugging器是否仍然允许你单步执行?

一个简单的解决方法,为我做的是将VBA分配给一个快捷键没有转移。 我不喜欢这样做,因为与默认的Excel快捷方式有更多的冲突。 但是,基于这篇文章 ,有一些可用的Excel 2010:Ctrl + e,Ctrl + j,Ctrl + m,Ctrl + q。

在法语论坛上find的临时解决scheme:在激活您select的工作簿之前,使用下面的ForEachWinDoEvents

 Sub Test() Application.ScreenUpdating = False Set w1 = Workbooks.Add(xlWBATWorksheet) Set w2 = Workbooks.Add(xlWBATWorksheet) Set w3 = Workbooks.Add(xlWBATWorksheet) Application.ScreenUpdating = True ForEachWinDoEvents w2.Activate End Sub Sub ForEachWinDoEvents() Dim win As Window For Each win In Application.Windows DoEvents Next win End Sub 

问题是否有一行代码在这行代码之前随时select多个标签? 我发现这就像是在select的整个过程中按住shift键。 为了解决这个问题,我有macros取消组合(单选)选项卡,然后macros开始工作。