Почему макрос Excel работает в Excel, а не при вызове из Python? - PullRequest
0 голосов
/ 14 ноября 2008

У меня есть макрос 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 ]

2 голосов
/ 14 ноября 2008

Я запустил код в Excel VBA.
Я предполагаю, что следующая строка не работает.

Sheets("CC").Delete

И по этой причине вы не можете присвоить новому листу то же имя, что и существующий (не удаленный) лист.

Поставьте Application.DisplayAlerts = False перед Sheets("CC").Delete и
Application.DisplayAlerts = True , как только вы закончите с кодом.

Я не использовал python, но, похоже, библиотека поглотила эту ошибку и позволила вам перейти к следующему утверждению.

Надеюсь, это поможет.

1 голос
/ 14 ноября 2008

За кулисами 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...