Wie kann ich ein Python script in eine VBA Applikation einbinden?
GruessDM
python VBA
- DatenMetzgerX
- User
- Beiträge: 398
- Registriert: Freitag 28. April 2006, 06:28
- Wohnort: Zürich Seebach (CH)
- DatenMetzgerX
- User
- Beiträge: 398
- Registriert: Freitag 28. April 2006, 06:28
- Wohnort: Zürich Seebach (CH)
ich will nicht vba in python
sondern
python in vba
sondern
python in vba
Kuck mal hier: http://www.oreilly.com/catalog/pythonwi ... /ch12.html
In etwa in der Mitte der Seite ab der Überschrift "Implementing COM Objects in Python"
In etwa in der Mitte der Seite ab der Überschrift "Implementing COM Objects in Python"
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.
Wie man Fragen richtig stellt
Außerdem gibt es eine irrationale.
Wie man Fragen richtig stellt
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi DM!DatenMetzgerX hat geschrieben:Wie kann ich ein Python script in eine VBA Applikation einbinden?
Es gibt mehrere Möglichkeiten, aber am Zuverlässigsten ist immer noch der Aufruf eines externen Programmes -- ganz ohne direktes Einbinden in ein VB-Programm.
1. Daten in eine Textdatei schreiben.
2. Externes Programm aufrufen, Pfad zur Textdatei mitgeben.
3. Warten bis das externe Programm fertig ist und Rückgabewert auswerten.
4. Textdatei mit dem Ergebnis lesen
5. Textdateien wieder löschen.
http://www.aboutvb.de/khw/artikel/khwshell.htm
Hier noch ein Auszug aus einem meiner VB-Programme. Diese Methode ist so nicht lauffähig, da sie in eine Klasse eingebettet ist und einige Informationen aus der Klasse erwartet. Aber vielleicht geht sie als Pseudocode durch:
Code: Alles auswählen
'***************************************************************************************************
'* Erstellt von: Gerold Penz Am: 02.06.2005 22:58:23
'* Beschreibung: Führt dieses Tool aus
'* Rückgabe: eTrue = Wenn Rückgabe des externen Tools = OK_Returnvalue
'* eFalse = Wenn Rückgabe des externen Tools <> OK_Returnvalue
'* eErrorMisc = Fehler
'***************************************************************************************************
Public Function Execute(Optional ByRef objParentForm As Object) As Enum_TrueFalseError
If Not (modFehler.bgFbAus) Then On Error GoTo Fehlerbereich
Dim sCommand As String
Dim sResult As String
Dim AppWinStyle As VbAppWinStyle
Dim vTaskID As Variant
Dim sTempFileName As String
Dim sZeile As String
' Prüfen ob überhaupt ein Kommando übergeben wurde
If Trim(Me.Command) = "" Then
MsgBox "Dieses Tool besitzt kein zugewiesenes Kommando das ausgeführt " & _
"werden könnte.", vbInformation, "Kein Kommando"
GoTo Exitbereich
End If
' working directory
If Me.WorkDir <> "" Then
If DirectoryExists(Me.WorkDir) Then
ChDrive Left(Me.WorkDir, 3)
ChDir Me.WorkDir
End If
End If
' Hidden
If Me.Hidden Then
AppWinStyle = vbHide
Else
AppWinStyle = vbNormalFocus
End If
' Command parsen und Parameter ersetzen
sCommand = ParseCommand(Me.Command)
' Show Result
If Me.ShowResult Then
' Temp-Filename generieren
sTempFileName = GetTempFilenameVB
' Ausführen mit Pipe in Temp-File mit ">"
sCommand = "%ComSpec% /C " & sCommand & " > " & sTempFileName
If CStr(ShellWait(sCommand, AppWinStyle)) = Me.OK_Returnvalue Then
Execute = eTrue
Else
Execute = eFalse
End If
' Temp-File auslesen und das Ergebnis anzeigen
If FileExist(sTempFileName) Then
Open sTempFileName For Input As #1
Do While Not EOF(1)
sResult = sResult & Input(1, #1)
Loop
Close #1
If sResult = "" Then
MsgBox "Keine Daten als Ergebnis.", vbInformation, "Kein Ergebnis"
Else
Call ShowResultForm(sResult, objParentForm)
End If
Else
MsgBox "Keine Daten als Ergebnis.", vbInformation, "Kein Ergebnis"
End If
Else
'Das Ergebnis nicht anzeigen -->
'WaitMode
If Me.Wait Then
If CStr(ShellWait(sCommand, AppWinStyle)) = Me.OK_Returnvalue Then
Execute = eTrue
Else
Execute = eFalse
End If
Else
' Ausführen
Call Shell(sCommand, AppWinStyle)
Execute = eTrue
End If
End If
Exitbereich:
On Error Resume Next
If sTempFileName <> "" Then
If FileExist(sTempFileName) Then
Kill sTempFileName
End If
End If
' Wenn die Rückgabe ignoriert werden soll, dann OK zurück liefern
If Me.IgnoreReturnvalue Then Execute = eTrue
Exit Function
Fehlerbereich:
Call modFehler.FehlerProzedur( _
Err, _
"Tool", _
"Execute", _
"", _
Nothing, _
Nothing, _
Nothing)
'Kommandos im Fehlerbereich
Execute = eErrorMisc
'Fehler abschliessen
Resume Exitbereich
End Function
lg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
...die andere Variante.
Es gibt noch das MS ScriptControl, mit dem man Skripte direkt in ein Programm einbinden kann. Getestet habe ich das Control bereits mit JavaScript, VbScript und **Python**. Allerdings weiß ich jetzt nicht, ab welcher Visual Basic Version das Control mit dabei ist, da ich Visual Basic 6 aus dem DeveloperNetwork bekommen habe. Das war wohl die höchste Version.
Suche mal nach dem "msscript.ocx". Vielleicht hast du es ja. Ob du es auch verwenden darfst, das kann ich dir nicht sagen.
http://www.microsoft.com/mind/0799/script/script.asp
Sieht so aus, als ob man dieses Control ohne große Voraussetzungen verwenden kann:
http://www.microsoft.com/downloads/deta ... laylang=en
ABER, der Aufruf eines eigenen Prozesses ist stabiler und bereitet weniger Probleme.
lg
Gerold
Es gibt noch das MS ScriptControl, mit dem man Skripte direkt in ein Programm einbinden kann. Getestet habe ich das Control bereits mit JavaScript, VbScript und **Python**. Allerdings weiß ich jetzt nicht, ab welcher Visual Basic Version das Control mit dabei ist, da ich Visual Basic 6 aus dem DeveloperNetwork bekommen habe. Das war wohl die höchste Version.
Suche mal nach dem "msscript.ocx". Vielleicht hast du es ja. Ob du es auch verwenden darfst, das kann ich dir nicht sagen.
http://www.microsoft.com/mind/0799/script/script.asp
Sieht so aus, als ob man dieses Control ohne große Voraussetzungen verwenden kann:
http://www.microsoft.com/downloads/deta ... laylang=en
ABER, der Aufruf eines eigenen Prozesses ist stabiler und bereitet weniger Probleme.
lg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
- Michael Schneider
- User
- Beiträge: 569
- Registriert: Samstag 8. April 2006, 12:31
- Wohnort: Brandenburg
Hi,
ich stehe gerade vor einem ähnlichen Problem. Ich habe Python 2.2 auf einem HPUX System zur Verfügung und möchte meine Scriptergebnisse in Excel einlesen, das in einem Citrix-Client eingebettet läuft.
Da mir die Erstellung einer formatierten Tabelle genügt, entwickle ich gerade eine äußerst einfache Schnittstelle. Dabei erzeugt das Python-Script eine Anweisungs-Ascii Datei mit Kommandos wie:
a) fragt nach der Kommandodatei,
b) erstellt ein neues Workbook,
c) liest die Anweisungs-Parameter Folgen aus der Datei ein
d) wendet die Befehle auf das neue Workbook an und
e) schließt das Scriptworkbook wieder.
Und voila, man hat ein komplett formatiertes Excel-Workbook.
Leider bekomme ich weder PyWin noch das win32com-Modul, sonst würde ich vielleicht auch über eine direkte ActiveX-Schnittstelle nachdenken. Die hat sich in meiner Diplomarbeit bewährt, auch wenn ich nie wieder ernsthaft in Excel-VBA programmieren möchte.
Grüße,
der Michel
ich stehe gerade vor einem ähnlichen Problem. Ich habe Python 2.2 auf einem HPUX System zur Verfügung und möchte meine Scriptergebnisse in Excel einlesen, das in einem Citrix-Client eingebettet läuft.
Da mir die Erstellung einer formatierten Tabelle genügt, entwickle ich gerade eine äußerst einfache Schnittstelle. Dabei erzeugt das Python-Script eine Anweisungs-Ascii Datei mit Kommandos wie:
Dann starte ich eine vorbereitete Excel-Mappe, die beim Öffnen automatisch ein Startscript ausführt. Das Startscript wiederumselect
A1
Hallo Welt
fg
3
bg
43
a) fragt nach der Kommandodatei,
b) erstellt ein neues Workbook,
c) liest die Anweisungs-Parameter Folgen aus der Datei ein
d) wendet die Befehle auf das neue Workbook an und
e) schließt das Scriptworkbook wieder.
Und voila, man hat ein komplett formatiertes Excel-Workbook.
Leider bekomme ich weder PyWin noch das win32com-Modul, sonst würde ich vielleicht auch über eine direkte ActiveX-Schnittstelle nachdenken. Die hat sich in meiner Diplomarbeit bewährt, auch wenn ich nie wieder ernsthaft in Excel-VBA programmieren möchte.
Grüße,
der Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...