/ / ExcelマクロはExcelで動作しますが、Pythonから呼び出されたときには動作しません。 - python、excel、vba、pywin32

なぜExcelマクロはExcelで動作しますが、Pythonから呼び出されたときには動作しません。 - python、excel、vba、pywin32

私は、シートを削除するExcelマクロを持って、別のシートをコピーし、削除したシートの同じ名前に変更します。 Excelから実行するとうまく動作しますが、Pythonからマクロを呼び出して実行すると、次のエラーメッセージが表示されます。

実行時エラー "1004" - 同じ名前のシートの名前を変更できません。 別のシート、参照されるオブジェクトライブラリ、または参照されるワークブック VisualBasic。

マクロには次のようなコードがあります:

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

デバッガは、シートの名前が変更された最後の行のエラーを強調表示します。私はまた、これらの呼び出しを直接Pythonに入れようとしましたが、同じエラーメッセージが表示されます。

どんな提案も大歓迎です!

ありがとう。

回答:

回答№1は2

Excel VBA内でコードを実行しました。
私は次の行が失敗していると推測しています。

Sheets("CC").Delete

それが理由です。新しいシートに既存の(削除されていない)シートと同じ名前を付けることはできません。

置く Application.DisplayAlerts = False Sheets("CC").Delete そして
Application.DisplayAlerts = True コードを書き終えたら

私はPythonを使用していませんでしたが、ライブラリがあなたのためにそのエラーを飲み込んで、次のステートメントに進むことができるようです。

希望が役立ちます。


回答№2の場合は1

ビハインドシーンでは、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"