2017-05-01 5 views
2

Ich habe mehrere Threads gelesen und festgestellt, dass ich Python von VBA mit Shell aufrufen kann. DieseVBA - Aufruf Python-Skript

ist, was ich habe:

Private Sub CommandButton1_Click() 

    Ret_Val = Shell("C:\Users\....\Anaconda3\python.exe C:\Users\...\REL.py", vbNormalFocus) 

    If Ret_Val <> 0 Then 
     MsgBox "ok!", vbOKOnly 
    End If 

End Sub 

ich tun, um die OK-Meldung erhalten, und ein Fenster öffnen und schließen sich innerhalb einer Sekunde. Ich denke also, es startet Python, aber das Skript funktioniert nicht.

Also dachte ich, dass vielleicht nicht funktioniert, weil ich den Code in spyder schrieb und ich könnte starten müssen spyder:

Ret_Val = Shell("C:\Users\...\Anaconda3\Scripts\spyder.exe C:\Users\...\REL.py", vbNormalFocus) 

Dies wird Spyder öffnen, die zu viel Zeit in Anspruch nimmt, und es ist nicht das, was ich wollen. Auch wenn es geöffnet wird, startet es das Skript nicht.

Etwas stimmt nicht, aber ich bin mir nicht sicher, ob dies auf den VBA-Code oder etwas anderes im Zusammenhang mit dem Skript zurückzuführen ist. Das Skript funktioniert, wenn ich es ohne VBA von Spyder aus starte.

Dies ist ein einfaches Beispiel für die Python-Code:

# -*- coding: utf-8 -*- 
""" 
Created on Fri Apr 21 08:24:05 2017 

@author: xxxxxx 
""" 
import pandas as pd 
import numpy as np 
import datetime 

RW = pd.read_excel('Raw_data.xlsx', skipinitialspace=True) 
RW=pd.DataFrame(RW, columns = ['Task Id', 'TIDmodRW', 'Start Date', 'End Date', 'Machine', 'Boards']) 

writerRW = pd.ExcelWriter('RW_test2.xlsx', engine='xlsxwriter') 
RW.to_excel(writerRW, sheet_name='sheet1') 
writerRW.save() 
+1

Warum geben Sie kein Python-Beispielskript, um dies zu einem [mcve] zu machen? –

+0

Ich habe es in der Frage hinzugefügt. Ich schneide es, um es einfach zu halten, aber es schreibt nicht das Excel. Der Code funktioniert mit Spyder – Filippo

+0

Vielleicht können Sie dem Python-Skript eine Fehlerbehandlung hinzufügen, bei der der Fehlerhandler die Ausnahme druckt und eine 'input (" Drücken Sie eine beliebige Taste zum Schließen ")', so dass Sie das Ergebnis vor dem Fenster anzeigen können schließt. Können Sie durch sinnvolle Verwendung von 'print()' die Zeile im Python-Code identifizieren, die den Fehler verursacht? –

Antwort

1

Betrachten Sie das eingebaute in os Moduls path.dirname() mit automatisch den aktuellen Pfad Ihres Python-Skript erkennt die Eingabe Excel-Datei (vorausgesetzt, die Arbeitsmappe zu lokalisieren befindet sich im gleichen Verzeichnis wie das .py-Skript). Verwenden Sie dann die OS-unabhängige path.join(), um jede Dateizeichenfolge mit ihr für die vollständige Verzeichnisreferenz zu verketten. Diese Methode erfordert keine umgekehrten Schrägstriche (d. H. Windows) oder Schrägstriche (d. H. Linux/Mac), sollte also über Betriebssysteme hinweg funktionieren.

So, nun, was auch immer die Excel-Datei und Python-Datei oder was auch immer die Aufruf-Methode einschließlich Spyder, VBA oder Befehlszeile, das Skript sollte vollständig lesen und schreiben in lokalen Arbeitsmappen.

import os            # ADD IMPORT 
import pandas as pd 
import numpy as np 
import datetime 

cd = os.path.dirname(os.path.abspath(__file__))   # LOCATE CURRENT DIR 

# CONCATENATE CURRENT DIRECTORY TO EXCEL BASE FILE NAME 
RW = pd.read_excel(os.path.join(cd, 'Raw_data.xlsx'), skipinitialspace=True) 
RW = pd.DataFrame(RW, columns = ['Task Id', 'TIDmodRW', 'Start Date', 
           'End Date', 'Machine', 'Boards']) 

writerRW = pd.ExcelWriter(os.path.join(cd, 'RW_test2.xlsx'), engine='xlsxwriter') 
RW.to_excel(writerRW, sheet_name='sheet1') 
writerRW.save() 
Verwandte Themen