1

ここで与えられた答えを見ていました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 を実行するとクラッシュし、空白のエラーが発生します。

4

1 に答える 1