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.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

python VBA

Beitragvon DatenMetzgerX » Donnerstag 10. August 2006, 21:05

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

Beitragvon keppla » Freitag 11. August 2006, 08:40

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)

Beitragvon DatenMetzgerX » Freitag 11. August 2006, 08:55

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

Beitragvon N317V » Freitag 11. August 2006, 10:13

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: python VBA

Beitragvon gerold » Freitag 11. August 2006, 10:52

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=]'***************************************************************************************************
'* 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[/code]
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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Freitag 11. August 2006, 11:09

...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: 566
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Sonntag 13. August 2006, 19:14

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 ...

Wer ist online?

Mitglieder in diesem Forum: Google [Bot]