【问题标题】:Why does Excel macro work in Excel but not when called from Python?为什么 Excel 宏在 Excel 中有效,但在 Python 中调用时无效?
【发布时间】:2010-09-22 07:07:42
【问题描述】:

我有一个 Excel 宏,它可以删除工作表、复制另一个工作表并将其重命名为与已删除工作表相同的名称。从 Excel 运行时这工作正常,但是当我通过从 Python 调用宏运行它时,我收到以下错误消息:

运行时错误“1004” - 无法将工作表重命名为与 另一个工作表、被引用的对象库或被引用的工作簿 视觉基础。

宏的代码如下:

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

并且调试器会在工作表重命名的最后一行突出显示错误。我也尝试将这些调用直接放在 python 中,但得到相同的错误消息。

非常感谢任何建议!

谢谢。

【问题讨论】:

    标签: python excel vba pywin32


    【解决方案1】:

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

    Sheets("CC").Delete

    这就是原因,您不能为新工作表提供与现有(未删除)工作表相同的名称。

    完成代码后,将 Application.DisplayAlerts = False 放在 Sheets("CC").Delete
    Application.DisplayAlerts = True 之前。

    我没有使用过 python,但似乎该库正在为您处理该错误并让您继续执行下一条语句。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      在幕后,VB 和 VBA 为应用程序、工作表等维护对 COM 对象的引用。这就是为什么你有全局“应用程序”、“工作表”等。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'
      

      【讨论】:

      • 感谢您的回复。我通过清除工作表上的所有单元格然后将所有单元格复制到同一个工作表(如果存在)来解决这个问题。我想我永远不会知道幕后发生了什么。
      猜你喜欢
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多