2017-07-31 303 views
11

我有一個包含宏的excel文件(Main.xlsm)。我有一個python文件(python.py)來生成一個輔助excel文件(sub.xlsx),我將在Main.xlsm文件的宏中進一步調用它。這個由運行python.py生成的sub.xlsx文件保存在同一個工作目錄中。有沒有辦法在Excel-VBA中調用python代碼?

現在我想讓這個python.py在運行Main.xlsm宏時執行,然後使用這個xlsx文件。我基本上想要減少外部執行python.py的步驟。有沒有一個命令?我是VBA新手。

+1

然後留新(以及遠離)VBA :)我希望你你找到你需要的東西。有趣的問題。 –

+0

@ Jean-FrançoisFabre感謝您對這個問題的興趣。 :從我的角度來看,p –

+0

(也適用於其他專有和繁瑣的系統),有時最好1)將數據導出爲CSV 2)運行python腳本以便輕鬆處理數據3)重新導入爲excel /無論如何我們也使用這個技巧,而不是試圖在子語言中編碼:) –

回答

12

最簡單的方法是用Shell命令運行Python解釋器

Shell ("python.exe " & yourScript & " " & arguments) 
+0

感謝您的回覆@Uri。但是一個小問題是它是用於Python還是用於VBA的命令? 我需要在VBA中執行它。 –

+0

這是一個VBA命令 –

+0

@UriGoren根據這個上下文,你的標籤是Main.xlsm? –

9

是的,有。我最喜歡的做法是通過xlwings(https://www.xlwings.org/),但還有其他幾個選項。 XlWings非常棒,因爲它免費,開放源代碼且易於使用,並且具有出色的文檔。雖然有一些功能限制,所以你必須檢查它是否符合你的需求。

+0

好主意,有一個upvote。 XlWings不是在一個線程中工作嗎? – Bathsheba

+0

據我所知,它確實是單線程的 – Gabor

+0

偉大的加載項!不知道這個,謝謝!有(其他)upvote。 –

3

有多種方式TU運行使用VBA取決於你是否需要等待執行結束,知道一個python腳本如果它沒有錯誤。

隨着Shell,異步與控制檯:

Public Sub RunPython(file As String, ParamArray args()) 
    Shell "python.exe """ & file & """ " & Join(args, " ") 
End Sub 

隨着Shell,同步而不控制檯:

Public Function RunPython(file As String, ParamArray args()) 
    Shell "pythonw.exe """ & file & """ " & Join(args, " ") 
End Function 

隨着WScript.Shell,同步而不控制檯和與退出代碼:

Public Function RunPython(file As String, ParamArray args()) As Long 
    Dim obj As Object 
    Set obj = CreateObject("WScript.Shell") 
    RunPython = obj.Run("pythonw.exe """ & file & """ " & Join(args, " "), 0, True) 
End Function 
相關問題