2017-07-31 15 views
11

Mam plik excel (Main.xlsm) zawierający makra. Mam plik python (python.py) do generowania pliku pomocniczego excel (sub.xlsx), który będę dalej wywoływać w makrach pliku Main.xlsm. Ten plik pod.xlsx generowany przez program python.py jest zapisywany w tym samym katalogu roboczym.Czy istnieje sposób wywołania kodu Pythona w Excel-VBA?

Teraz chcę, aby ten plik python.py został wykonany podczas uruchamiania makr Main.xlsm, a następnie użyj tego pliku xlsx. Zasadniczo chcę zmniejszyć etap wykonywania Python.py z zewnątrz. Czy jest jakieś polecenie? Jestem nowy w VBA.

+1

następnie zostań nowy (i od) VBA :) Mam nadzieję y znajdziesz to, czego potrzebujesz. Interesujące pytanie. –

+0

@ Jean-FrançoisFabre Dzięki za zainteresowanie pokazane w pytaniu. : p –

+0

z mojego punktu widzenia (dotyczy również innych zastrzeżonych i uciążliwych systemów), czasami najlepiej jest 1) eksportować dane jako CSV 2) uruchomić skrypt Pythona, aby łatwo przetworzyć dane i 3) ponownie zaimportować do Excela/cokolwiek, więc również użyj tej sztuczki zamiast próbować kodować w pod-językach :) –

Odpowiedz

12

Najprostszym sposobem jest uruchomienie interpretera Pythona z komendy Shell

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

Dziękujemy za odpowiedź @Uri. Ale małe pytanie jest to polecenie dla Pythona lub VBA? Muszę wykonać go w VBA. –

+0

To polecenie VBA –

+0

@UriGoren yourscript według tego kontekstu to Main.xlsm? –

9

Tak, istnieje. Mój preferowany sposób to zrobić przez xlwings (https://www.xlwings.org/), ale istnieje również kilka innych opcji. XlWings jest świetny, ponieważ jest darmowy, open source i łatwy w użyciu, z doskonałą dokumentacją. Istnieje jednak kilka ograniczeń funkcji, więc musisz sprawdzić, czy odpowiada Twoim potrzebom.

+0

Niezły pomysł, przekaż. Czy XlWings nie działa jednak w jednym wątku? – Bathsheba

+0

O ile mi wiadomo, jest to jeden gwintowany naprawdę – Gabor

+0

Świetny dodatek! Nie znałem tego, dzięki! Mieć (inne) upvote. –

3

Istnieje wiele sposobów tu uruchomić skrypt Pythona z VBA w zależności od tego, czy trzeba czekać do zakończenia realizacji i wiedzieć jeśli przebiegnie bezbłędnie.

z Shell asynchroniczne z konsolą:

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

Z Shell synchroniczne bez konsoli:

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

Z WScript.Shell synchroniczne bez konsoli i kodu zakończenia:

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 
Powiązane problemy