python VBA

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Wie kann ich ein Python script in eine VBA Applikation einbinden?

GruessDM
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

wie soll man VBA-Applikationen überhaupt irgendwo einbinden? leben die nicht innerhalb einer Office-Datei?
Benutzeravatar
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
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

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"
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

DatenMetzgerX hat geschrieben:Wie kann ich ein Python script in eine VBA Applikation einbinden?
Hi DM!

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
Ich habe im Moment nicht die Zeit, ein funktionierendes Teil daraus zu machen. Vielleicht hilft es dir trotzdem weiter.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
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:
select
A1

print
Hallo Welt

fg
3

bg
43
Dann starte ich eine vorbereitete Excel-Mappe, die beim Öffnen automatisch ein Startscript ausführt. Das Startscript wiederum
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 ...
Antworten