VBA脚本在关闭工作簿时出现卡顿

6

我正在尝试使用Visual Basic for Applications编写一个“你好,世界”的应用程序,即修改Excel表格中的单元格。以下是代码:

Sub hello()

    Dim obj As Object
    Dim Workbook As Object

    Set obj = CreateObject("Excel.Application")
    Set Workbook = obj.Workbooks.Open("C:\Users\gbuday\Desktop\Oktatás\Excel\start.xlsx")

    Workbook.Worksheets("Munka1").Range("B3") = "Hello World!"

    Workbook.Close
    Set Workbook = Nothing
    Set obj = Nothing

End Sub

运行Excel时,它会卡死,我无法停止脚本运行,只能终止Excel进程。在调试时,它卡在Workbook.Close这一行。那么这一行有什么问题呢?

通常在自动化时,您会在“Set WB = Nothing”之前使用“WB.Quit”。而且最好不要将对象(工作簿)用作变量名。请参见http://www.tushar-mehta.com/excel/vba/xl_doesnt_quit/。 - brettdj
2个回答

5

问题在于你没有给Excel足够的时间来完成它的操作。通常使用DoEvents就可以解决这个问题。此外,为避免混淆,建议将变量命名为“wbk”,而不是“Workbook”。

Sub hello()
    Dim obj As Object, wbk As Object

    Set obj = CreateObject("Excel.Application")
    Set wbk = obj.Workbooks.Open("C:\Users\gbuday\Desktop\Oktatás\Excel\start.xlsx")

    wbk.Worksheets("Munka1").Range("B3") = "Hello World!"

    DoEvents

    '~~> Change True to False if you do not want to save
    wbk.Close SaveChanges:=True

    Set wbk = Nothing: Set obj = Nothing
End Sub

谢谢,Siddharth,它起作用了。关键是SaveChanges子句。 - Gergely
+1(虽然更改十次而不保存看起来很奇怪) - brettdj
@brettdj:非常正确 :). 然而在许多情况下(可能不是上述情况),我们打开一个工作簿进行一些计算,使用输出进行其他计算,然后关闭工作簿而不保存,因此我想,我可以简单地在注释中解释一下,并让提问者自行决定他/她需要什么... - Siddharth Rout
我认为问题在于有一个对话框询问是否保存,但用户看起来卡住了。不知道在C#中是否可用DoEvents? - InContext
来自一个 C# 问题,我的错误。 - InContext

1

应该是这样的

Workbooks.Close

我认为“Workbook”是一个保留字,你应该使用类似“wb”的东西代替它。
Dim wb As Workbook

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接