为什么Excel宏在Excel中有效但在Python调用时无效?
我有一个Excel宏,它的功能是删除一个工作表,复制另一个工作表,然后把复制的工作表重命名为被删除的工作表的名字。这个宏在Excel里运行得很好,但当我通过Python来调用这个宏时,就出现了一个错误信息:
运行时错误 '1004' - 不能把工作表重命名为与另一个工作表、引用的对象库或VisualBasic引用的工作簿相同的名字。
这个宏的代码大概是这样的:
Sheets("CC").Delete
ActiveWindow.View = xlPageBreakPreview
Sheets("FY").Copy After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = "CC"
调试器在最后一行,也就是重命名工作表的地方标出了错误。我也尝试直接在Python里调用这些代码,但还是得到了同样的错误信息。
如果有任何建议,我会非常感激!
谢谢。
2 个回答
1
在后台,VB和VBA会保持对COM对象的引用,比如应用程序、工作表等。这就是为什么你会看到像'Application'、'Worksheets'这样的全局变量。可能VBA仍然在引用这个工作表,所以Excel没有正确地清理它。
建议你不要使用这些隐含的全局变量,而是明确地引用对象模型中的项目。或者你也可以直接在Python中实现。
下面是一个Python脚本,它可以做你想要的事情:
import win32com.client
xl = win32com.client.Dispatch ('Excel.Application')
xl.Visible = True
wb = xl.Workbooks.Add()
wb.Worksheets[0].Delete()
wb.Worksheets.Add()
wb.Worksheets[0].Name = 'Sheet1'
2
我在Excel的VBA里面运行了代码。
我猜下面这行代码出问题了。
Sheets("CC").Delete
这就是为什么你不能给新建的工作表起和已经存在(未删除)工作表一样的名字。
在 Sheets("CC").Delete
之前加上 Application.DisplayAlerts = False
,然后在代码结束后再加上 Application.DisplayAlerts = True
。
我没用过Python,但看起来那个库会把这个错误吞掉,让你继续执行下一条语句。
希望这能帮到你。