ExcelからPythonファイルを一時的に出力。実行したら削除

概要

ExcelVBAとPythonを連携させたい。方法として大きく2つ。

①Excelからpythonを実行
②pythonからExcelを実行

このうち、今回はExcelからpythonを実行する方法についてまとめる。

①Excelのセルにまるまるpythonコードを記述しておく
②マクロを実行すると、セルに記載したコードを.pyで一時的に出力し、コマンドプロンプト経由で実行
③実行したら.pyファイルを削除する

詳細

①Pythonコードは一枚目のシートのA1セルにコピペしておく。こんな感じにする。

張り付けたコードのうち、def main()の部分は好きに書き換えていただく部分。export_finish_sign()はCドライブ直下に終わったことを知らすためのファイルを出力する。Cドライブ直下はさすがに、という場合はマクロ側のパスと合わせて書き換えていただければと思う。

# -*- coding: utf-8 -*-/n
import pandas as pd
def main():
    print("Hello World")
    print("こんにちは!")

def export_finish_sign():
    val="C:/flag.csv"
    pd.DataFrame().to_csv(val.replace("/","\\"))

if __name__=="__main__":
    main()
    export_finish_sign()

②次にマクロから上記pythonコードを一時的に出力し、実行するようにする。マクロは下記。

Excelのシートを開いた状態でAlt+F11でエディタが開かれるので、そこに下記を張り付ける。

'VBAコード
Sub main()
    'ファイルを一時的に書き出したりするので、そのディレクトリやファイルの名前を指定する。基本はなんでもいい
    home = ThisWorkbook.Path
    file = "temp_python.py"
    
    'Cell(1,1)に記載しているPythonコードを作業ディレクトリに出力する。utf-8にして日本語を扱えるようにする
    Call writeCSV_utf8(home, file)
    
    '作業ディレクトリに出力したPythonコードを実行するために、コマンドプロンプトで実行
    Call Execute(home, file)
    
    '終わったら作業フォルダにflag.csvが作成されるので、そうしたら一時的に出力したPythonコードを削除する
    Call delete(home, file)

End Sub

Function writeCSV_utf8(home, file)
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(1)
     
    Dim csvFile As String
    csvFile = home & "\" & file
     
    'ADODB.Streamオブジェクトを生成
    Dim adoSt As Object
    Set adoSt = CreateObject("ADODB.Stream")
     
    Dim strLine As String
    strLine = Replace(ws.Cells(1, 1).Value, vbLf, vbCrLf)
    strLine = Replace(strLine, "dir_to_be_replaced", Replace(home, "\", "/"))
    
     
    With adoSt
        .Charset = "UTF-8"
        .LineSeparator = adLF
        .Open
        .WriteText strLine, adWriteLine
        .SaveToFile csvFile, adSaveCreateOverWrite
        .Close
    End With

End Function

Function Execute(home, file)
    'cをkにするとコンソールが残る
    CreateObject("WScript.Shell").Run "CMD.EXE /c python " & home & "\" & file

End Function


Function delete(home, file)
    Do While Dir(home & "\flag.csv") = ""
        Application.Wait Now() + TimeValue("00:00:01")
    Loop
    kill home & "\flag.csv"
    kill home & "\" & file
End Function

 

③最後に、VBAからコマンドプロンプトを起動させるために、VBAの編集画面から”ツール>参照設定>Microsoft ActiveX Data Object?.? Library”にチェックをうっておく。基本は最新をチャックしておけばいいかと。

Excelのマクロを動かすと、pythonファイルが一時的に生成されて、コマンドプロンプト経由で実行される。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です