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

标签 excel vba

我正在尝试让 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/

相关文章:

c# - 使用 InvokeMember 通过 C# 在 Excel 中的文化特定属性

excel - 选择工作表时转到特定单元格

vba - 让我开始编程和调试 Microsoft Office 自动化

arrays - VBA 数组可以存储单元格属性,如字体颜色或填充颜色吗?

excel - 使用 Excel VBA 调整列表框以显示长于列表框宽度的字符串

excel - 从 Excel VBA - 检查 Access 表是否存在/如果不存在,则创建/复制

excel - 在 Excel 中锁定选择框大小

vba - 带有 float 的 Mod 给出错误的结果

vba - 使用 Excel 2018 for MacOS 的用户表单

excel - 如何一次删除Excel中的n个多行?