ここで与えられた答えを見ていましたxlwingsを使用してPythonからExcelマクロを呼び出すにはどうすればよいですか? . 私はそのソリューションを実装しましたが、VBA を呼び出す可能性についてテストしたところ、Python スクリプトから RunPython を使用する VBA 関数を呼び出すことができるかどうか疑問に思っていました。
これを説明するために、フォルダーに3つのファイルがあります
- -- myproject.xlsm
- -- myproject.py
- -- Hello_World.py
myproject.xlsm の VBA
Sub SampleCall()
RunPython ("import myproject; myproject.xl_main()")
End Sub
Sub Hello()
RunPython ("import Hello_World; Hello_World.xl_test()")
End Sub
Sub Message()
MsgBox ("ok")
End Sub
myproject.py
from xlwings import Workbook, Range, Application
import os
import sys
def xl_main():
# Create a WorkBook Object
wb = Workbook('myproject.xlsm')
Range('B1').value = 17
#Call a VBA Function
Application(wb).xl_app.Run("Message")
Application(wb).xl_app.Run("Hello")
if __name__ == "__main__":
if not hasattr(sys, 'frozen'):
# The next two lines are here to run the example from Python
# Ignore them when called in the frozen/standalone version
#TODO: Change the name of excel file
path = os.path.abspath(os.path.join(os.path.dirname(__file__), 'myproject.xlsm'))
Workbook.set_mock_caller(path)
xl_main()
Hello_World.py
import xlwings as xw
from xlwings import Workbook, Range
import os
def xl_test():
# Create a WorkBook Object
wb = xw.Workbook.caller()
Range('A1').value = "Hello World"
if __name__ == '__main__':
# To run from Python, not needed when called from Excel.
# Expects the Excel file next to this source file, adjust accordingly.
path = os.path.abspath(os.path.join(os.path.dirname(__file__), 'myproject.xlsm'))
xw.Workbook.set_mock_caller(path)
xl_test()
問題:
問題は、Hello_World.py スクリプトを実行したときに問題なく動作することですが、VBA で SampleCall() Sub を実行するとクラッシュし、空白のエラーが発生します。