【问题标题】:Excel Doesn't Complete Macro after Opening Another Workbook打开另一个工作簿后 Excel 未完成宏
【发布时间】:2011-08-05 15:45:54
【问题描述】:

我正在尝试让 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 文档, 然后什么都不做。但是,当我在开发人员选项卡中打开“宏”时,选择我的宏,然后单击“运行”,一切正常。

【问题讨论】:

  • 你说它没有“做任何事情”——你期待看到什么?大概在您发布的示例之后还有更多代码。 FunctionGetFileName 是什么?
  • 预期结果将是执行下一行 FunctionGetFileName 并继续执行整个文档。 FunctionGetFileName 是我在程序的其他地方编写的一个函数,它从 FilePath 中找到 FileName,但之后还有更多代码也没有执行。然而,通过进一步的实验,我缩小了问题的范围并相应地修改了问题。
  • 什么版本的 Excel?在 2007 年使用 Ctrl+Shift+F 为我工作。
  • 我也在使用 2007。我不知道为什么这不应该工作。可能与使用全局变量有关吗?
  • 你有任何错误处理或“on error resume next”吗?如果是,则将其注释掉,看看会发生什么。正在打开的工作簿是否有任何 auto_open 宏?

标签: excel vba


【解决方案1】:

我自己确实遇到了这个确切的问题,并最终找到了解决我的问题的方法。

它是您用来调用代码的键盘快捷键中的 Shift 按钮。

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

当您在程序的早期尝试通过代码打开工作簿时,就会发生这种情况。如果在您有足够的时间真正松开 Shift 按钮之前在代码中调用了Workbook.Open,则 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

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

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

【讨论】:

  • @psubee2003,这个让我绕弯了,谢谢你的修复。
【解决方案2】:

只需在调用 Workbooks.Open 之前添加一个对“DoEvents”的调用就可以了。 所以下面的 sn-p 将起作用:

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

【讨论】:

  • 这是最简单的解决方案
  • @GlenHong 这取决于实际问题是什么。如果是按下 shift 按钮,那么DoEvents 不会解决这个问题,但如果是别的,那么是的,这个答案很容易实现
  • 值得这个解决方案对我来说非常有效,而 Shift 则没有。我打开的工作簿位于网络位置,因此这可能是情况的一部分。
【解决方案3】:

问题在这行代码之前的任何时候,您是否有一行代码选择多个选项卡?我发现这有点像在选择它们的整个过程中都按住 shift 键。为了解决这个问题,我让宏取消组合(单选)一个选项卡,然后宏开始工作。

【讨论】:

    【解决方案4】:

    对我来说,一个简单的解决方法是将 VBA 分配给一个快捷键而无需换档。我不太喜欢这样做,因为与默认 Excel 快捷方式存在更多冲突。但是有一些基于this article 的 Excel 2010 可用:Ctrl+e、Ctrl+j、Ctrl+m、Ctrl+q。

    【讨论】:

    • 欢迎来到 SO!这个答案如何增加任何价值?已经有an answer 用另一种解决方法更详细地描述了这个确切的问题。如果您确实想回答老问题,请确保您提供了额外的价值。
    【解决方案5】:

    在法语论坛上找到的临时解决方案:使用以下 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多