Excel 2003: Aufruf aus anderem Programm

Moin Experten,

ich möchte aus einem Drittprogramm (SNMP-Manager) heraus eine Excel-Tabelle aufrufen lassen. Das Ganze soll so laufen, dass der Anwender auf ein Objekt klickt, „Datentabelle“ auswählt und dadurch Excel aufgerufen wird mit der passenden Datei.

Das kriege ich ja auch noch hin, aber: ich würde gerne noch nach dem Objektnamen in (einer Spalte) der Excel-Tabelle suchen lassen, so dass der Anwender direkt auf der passenden Zelle steht. Es ist kein Problem, den Objektnamen beim Aufruf als Parameter mitzugeben, nur wie verarbeite ich den in Excel?

Gruß
Stefan

ich möchte aus einem Drittprogramm (SNMP-Manager) heraus eine
Excel-Tabelle aufrufen lassen. Das Ganze soll so laufen, dass
der Anwender auf ein Objekt klickt, „Datentabelle“ auswählt
und dadurch Excel aufgerufen wird mit der passenden Datei.
Das kriege ich ja auch noch hin, aber: ich würde gerne noch
nach dem Objektnamen in (einer Spalte) der Excel-Tabelle
suchen lassen, so dass der Anwender direkt auf der passenden
Zelle steht. Es ist kein Problem, den Objektnamen beim Aufruf
als Parameter mitzugeben, nur wie verarbeite ich den in Excel?

Hi Stefan,

man kann schon mit API die Befehlszeile die Excel aufrief auslesen, um wieviele Dateien geht es denn circa?
In jede müßte halt Ereigniscode für das Ereignis Workbook_Open rein, also Vba-Code der beim Öffnen der Mappe ausgeführt wird.

Ging vielleicht auch über Code in der Personl.xls aber dann braucht man Kenntnisse von Klassenmodulen.

Was kann denn dein Managerprogramm so, kann es in die Registry schreiben oder eine .txt-Datei erstellen?

Dann ginge es einfacher, mit einfachem Code in der personl.xls die Registry auslesen bzw. die Txt.Datei und nach dem dort angegebem Objektnamen suchen in einer Spalte.

Gruß
Reinhard

Hallo Reinhard,

danke für Deine Antwort.

man kann schon mit API die Befehlszeile die Excel aufrief
auslesen, um wieviele Dateien geht es denn circa?

Im Augenblick eine einzige, das werden u.U. bis zu 10. Ist also kein ernsthaftes Problem, die jeweils anzupassen um irgendwelche Macros einzufügen.

In jede müßte halt Ereigniscode für das Ereignis Workbook_Open
rein, also Vba-Code der beim Öffnen der Mappe ausgeführt wird.

Ahja. Ok, ich habe mal ein wenig rumgegoogelt und etwas zusammengeklaut:

Option Explicit

Private Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineA" () As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Private Function GetCommLine() As String
 Dim RetStr As Long, SLen As Long
 Dim Buffer As String
 'Get a pointer to a string, which contains the command line
 RetStr = GetCommandLine
 'Get the length of that string
 SLen = lstrlen(RetStr)
 If SLen \> 0 Then
 'Create a buffer
 GetCommLine = Space$(SLen)
 'Copy to the buffer
 CopyMemory ByVal GetCommLine, ByVal RetStr, SLen
 End If
End Function




Private Sub Workbook\_Open()
Dim myParam As String
Dim i As Integer, j As Integer

myParam = GetCommLine
'Prüfen, ob "/e/" in der Befehlszeile enthalten ist
i = InStr(LCase(myParam), "/e/")
If i \> 0 Then
myParam = Mid$(myParam, i + 3)
j = InStr(myParam, "/")
If j 0 Then myParam = Left(myParam, j - 1)
 Columns("A:A").Select
 Selection.Find(What:=myParam, After:=ActiveCell, LookIn:=xlFormulas, LookAt \_
 :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= \_
 False, SearchFormat:=False).Activate
End If

End Sub

Das funktioniert auch, wenn der Wert gefunden wird. Wenn der übergebene Wert nicht vorhanden ist, gibt es einen

Laufzeitfehler '91': Objektvariable oder With-Blockvariable nicht festgelegt.

Was fehlt da noch???

Was kann denn dein Managerprogramm so, kann es in die Registry
schreiben oder eine .txt-Datei erstellen?

Nö, nicht wirklich. Ok, ich könnte eine Batchdatei aufrufen, die das dann macht, aber komfortabel ist anders.

VBA-rumstümpernde Grüße
Stefan

Excel beim Start Parameter übergeben
Hi Stefan,

man kann schon mit API die Befehlszeile die Excel aufrief
auslesen, um wieviele Dateien geht es denn circa?

Im Augenblick eine einzige, das werden u.U. bis zu 10. Ist
also kein ernsthaftes Problem, die jeweils anzupassen um
irgendwelche Macros einzufügen.

gut.

In jede müßte halt Ereigniscode für das Ereignis Workbook_Open
rein, also Vba-Code der beim Öffnen der Mappe ausgeführt wird.

Ahja. Ok, ich habe mal ein wenig rumgegoogelt und etwas
zusammengeklaut:
Das funktioniert auch, wenn der Wert gefunden wird. Wenn der
übergebene Wert nicht vorhanden ist, gibt es einen

Laufzeitfehler ‚91‘: Objektvariable oder
With-Blockvariable nicht festgelegt.

Was fehlt da
noch???

K.A., hab den Code nicht groß angeschaut :smile:

Probier dieses mal, ist von Michael Schwimmer, selbst von ihm im Internet eingestellt, also quasi Freeware.
Seine Vba-Bücher sind zu empfehlen.
Teste dies mal aus, wenn das auch nicht klappt so sag mal in beiden Fällen in welcher Codezeile der Debugger steht mit welchem Fehler.
Dann schaue ich mir beide Codes mal genauer an.

Option Explicit
'
Private Declare Function GetCommandLine& Lib "kernel32" \_
 Alias "GetCommandLineA" ()
'
Private Declare Function lstrlen Lib "kernel32" ( \_
 ByVal str As Long) As Long
'
Private Declare Function lstrcpy Lib "kernel32" ( \_
 ByVal dest As String, \_
 ByVal src As Long) As Long
'
Public Sub Workbook\_Open()
 Dim Meldung As String, dummy As String
 Meldung = "Der Text in der Kommandozeile beim öffnen," & vbCrLf
 Meldung = Meldung & "der hinter /e/ steht, wird durch die Prozedur" & vbCrLf
 Meldung = Meldung & "Workbook\_Open in ""DieseArbeitsmappe"" gelesen und" & vbCrLf
 Meldung = Meldung & "an dieser Stelle ausgegeben." & vbCrLf
 Meldung = Meldung & "Beispiel für die Kommandozeile:" & vbCrLf
 Meldung = Meldung & "excel c:\Commandline.xls /e/Hallo" & vbCrLf & vbCrLf
 dummy = StringVonPointer(GetCommandLine())
 If InStr(1, LCase(dummy), "/e/") Then
 'Text hinter "/e/"
 dummy = Right$(dummy, Len(dummy) - 2 - InStr(1, LCase(dummy), "/e/"))
 Else
 Meldung = Meldung & "Hier gesamte Befehlszeile, da /e/ fehlt:" & vbCrLf & vbCrLf
 End If
 MsgBox Meldung & dummy, vbOKOnly, "Befehlszeile"
End Sub
'
Private Function StringVonPointer(plngAscii As Long) As String
 Dim lngAnzahl&, strName$
 lngAnzahl = lstrlen(plngAscii)
 strName = String(lngAnzahl, 0)
 lstrcpy strName, plngAscii
 If InStr(1, strName, Chr(0)) 0 Then
 strName = Left$(strName, InStr(1, strName, Chr(0)) - 1)
 End If
 StringVonPointer = strName
End Function

Gruß
Reinhard

Hi,

Teste dies mal aus, wenn das auch nicht klappt so sag mal in
beiden Fällen in welcher Codezeile der Debugger steht mit
welchem Fehler.
Dann schaue ich mir beide Codes mal genauer an.

Das ist einfach: Das ist immer diese Zeile:

 Selection.Find(What:=myParam, After:=ActiveCell, LookIn:=xlFormulas, LookAt \_
 :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= \_
 False, SearchFormat:=False).Activate

Wenn der Suchwert vorhanden ist, läuft es durch, wenn nicht, dann kommt dieser Laufzeitfehler. Hat also mit der Abfrage der Parameter schon nix mehr zu tun - das klappt prima.

Gruß
Stefan

Hi Stefan,

Find ist immer sehr zickig, vieles möglich.
Aber bevor ich da schaue, was ist denn mit dem Code von Michael?

Gruß
Reinhard

Moin moin,

Find ist immer sehr zickig, vieles möglich.

Jep, ich habe mal gegoogelt nach diesem Fehler 91. Liegt wohl wirklich am find. Eine richtige Lösung habe ich aber auch noch nicht gefunden - außer auf den find zu verzichten und stattdessen eine Suchschleife zu programmieren. (Oder ein „on error resume next“ davorzuschreiben)

Aber bevor ich da schaue, was ist denn mit dem Code von
Michael?

Der läuft bei mir nicht gut: der Code geht davon aus, dass das /e/ als letztes in der Kommandozeile steht. Bei mir muss das aber vor dem Dateinamen stehen, sonst tut sich gar nichts. Der Code aus dem Internet berücksichtigt das. Aber ist ja auch wurscht - das klappt alles - bis auf das blöde „find“! :frowning:

Gruß
Stefan

Das funktioniert auch, wenn der Wert gefunden wird. Wenn der
übergebene Wert nicht vorhanden ist, gibt es einen

Laufzeitfehler ‚91‘: Objektvariable oder
With-Blockvariable nicht festgelegt.

Was fehlt da
noch???

Hi Stefan,

wie sieht denn der Aufruf von Excel genau aus wenn der Fehler kommt und wie wenn der Fehler nicht kommt?

Passiert das Identische wenn du auf Start–Ausführen gehst und dort den Excelaufruf einngibst?
Wär mir lieb, dann könnte ich testen.

Gruß
Reinhard

Der läuft bei mir nicht gut: der Code geht davon aus, dass das
/e/ als letztes in der Kommandozeile steht. Bei mir muss das
aber vor dem Dateinamen stehen, sonst tut sich gar nichts. Der
Code aus dem Internet berücksichtigt das. Aber ist ja auch
wurscht - das klappt alles - bis auf das blöde „find“! :frowning:

Hi Stefan,

sicher „find“ ist zickig, aber mein Zweitnick ist Zickenbändiger *lächel*, kriegen wir schon hin *glaub*

Außerdem wärs ja langweilig wenn man Code schreibt und der funktioniert sofort :smile:

Gruß
Reinhard