为什么Excelmacros在Excel中工作,而不是从Python中调用?

我有一个Excelmacros,删除工作表,复制另一个工作表,并重命名为删除工作表相同的名称。 从Excel运行时,这工作正常,但是当我通过从Python调用macros运行它,我得到以下错误信息:

运行时错误“1004” – 无法将工作表重命名为与另一个工作表,引用的对象库或由VisualBasic引用的工作簿相同的名称。

该macros具有如下代码:

Sheets("CC").Delete ActiveWindow.View = xlPageBreakPreview Sheets("FY").Copy After:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = "CC" 

并且debugging器在表格重命名的最后一行突出显示错误。 我也试着把这些调用直接在Python中,但得到相同的错误信息。

任何build议,非常感谢!

谢谢。

我在Excel VBA中运行代码。
我猜测下面一行是失败的。

Sheets("CC").Delete

这就是原因,你不能给新的工作表与现有的(非删除)工作表相同的名称。

Sheets("CC").Delete之前添加Application.DisplayAlerts = False Sheets("CC").Delete
Application.DisplayAlerts = True一旦你完成了代码。

我没有使用Python,但似乎图书馆正在吞咽你的错误,让你继续下一个声明。

希望有所帮助。

在幕后,VB和VBA保持对应用程序,工作表等的COM对象的引用。这就是为什么你有全局variables的“应用程序”,“工作表”等。有可能VBA仍然持有对工作表的引用,所以Excel没有把它整理好。

尽量不要使用这些隐式全局variables,并明确引用对象模型中的项目。 另外,你可以直接在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'