🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

1回答

7993閲覧

pythonによるマクロの起動

jetfly

総合スコア3

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

1クリップ

投稿2021/01/17 10:03

前提・実現したいこと

pythonから入力した数値を元にエクセル上で計算を行う。
エクセルのシートを開いた状態では入力できないので、エクセルを
閉じた状態で計算を行い、結果を読み取りたいです。

発生している問題・エラーメッセージ

pythonからエクセルに数値を入力し、マクロで計算を実行させようとすると以下のエラーが出ます。

Traceback (most recent call last): File "C:\Temp\python\macro_test\macro_test3.py", line 40, in <module> app.Application.Run(excel_path + '!test()') File "<COMObject <unknown>>", line 8, in Run File "C:\Temp\anaconda\lib\site-packages\win32com\client\dynamic.py", line 287, in _ApplyTypes_ result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args) pywintypes.com_error: (-2147352567, '例外が発生しました。', (0, 'Microsoft Excel', "マクロ 'C:\Temp\python\macro_test\Book1.xlsm!test()' を実行できません。このブックでマクロが使用できないか、またはすべてのマクロが無効になっている可能性 があります。", 'xlmain11.chm', 0, -2146827284), None)

該当のソースコード

python3.8.3

python3.8.3

1import win32com.client 2import xlwings 3import pprint 4import os 5import openpyxl 6from openpyxl import load_workbook 7import sys 8 9cwd = os.getcwd() 10file_name = "Book1.xlsm" 11excel_path = '%s\%s'%(cwd, file_name) 12print("excel_path=", excel_path) 13wb = openpyxl.load_workbook(excel_path, keep_vba=True) 14print(type(wb)) 15print(wb.sheetnames) 16sheet = wb['Sheet1'] 17result = sheet.cell(row=2, column=1).value 18calc = sheet.cell(row=2, column=2).value 19print("result=", result) 20print("calc=", calc) 21sheet.cell(row=2, column=3, value= 1) 22plus = sheet.cell(row=2, column=3).value 23print("result=", result) 24print("plus=", plus) 25wb.save(excel_path) 26app = win32com.client.Dispatch('Excel.Application') 27app.Visible = False 28app.DisplayAlerts = False 29macro = app.Workbooks.Open(Filename='%s'%(excel_path)) 30app.Application.Run(excel_path + '!test()') 31calc2 = sheet.cell(row=2, column=2).value 32print("calc2=", calc2) 33macro.SaveAs(excel_path) 34macro.Close() 35Excel.Application.Quit()

マクロ

Sub test() Dim result As Single Dim calc As Single Dim i As Single result = Cells(2, 1).Value i = Cells(2, 3).Value calc = result + i Cells(2, 2) = calc End Sub

試したこと

pythonで上記のコードを使ってエクセルに数値を入力することはできましたが、
エクセルを閉じた状態ではマクロを有効にできないのでエラーが出ます。

補足情報(FW/ツールのバージョンなど)

python3.8.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

COM (オートメーション) でエクセルのマクロを実行する場合、Run("ファイル名!マクロ名") となりますが、ファル名にはパスはいらなかったと思います。
また、マクロ名 に "()" も必要無いです。

Diff

1- app.Application.Run(excel_path + '!test()') 2--- 3+ app.Application.Run(file_name + '!test')

とすれば、当方の環境 (Windows10, Python 3.8.7) でマクロを実行できました。

余談ですが、Excelも未定義のエラーになりますね。

Diff

1- Excel.Application.Quit() 2--- 3+ app.Application.Quit()

でしょうか。

投稿2021/01/18 06:55

Bull

総合スコア986

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jetfly

2021/01/24 08:52

ありがとうございます。エラー無く処理を行うことができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問