Commandline Parameter in Excel 2007


Angaben wie man Commandline Parameter oder Kommandozeilenparameter in Excel übergeben kann gibt es kaum. Die meisten Beispiele die im Internet herumgeistern beziehen sich noch auf Excel97. Doch leider funktionieren die einfachen Methoden mit neueren Versionen von Excel nicht mehr.

Wer aber z. B. in einer Batchdatei auf bestimmte Parameter reagieren will braucht folgenden Code:

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 Sub Workbook_Open()
Dim CmdLine$, CmdArgs$(), i&, ArgNb&
CmdLine = GetCommLine
If Len(CmdLine) = 0 Then Exit Sub
i = InStr(1, CmdLine, ThisWorkbook.FullName, 1)
If i Then CmdLine = Mid$(CmdLine, 1, i – 1) Else Exit Sub
If Right$(CmdLine, 1) = „“““ Then i = 2 Else i = 1
CmdLine = Mid$(CmdLine, 1, Len(CmdLine) – i)
CmdLine = Mid$(CmdLine, InStr(1, CmdLine, “ /e“, 1) + 3, Len(CmdLine)) & „/“
Do Until Len(CmdLine) < 2
i = InStr(CmdLine, „/“)
ArgNb = ArgNb + 1
ReDim Preserve CmdArgs(1 To ArgNb)
CmdArgs(ArgNb) = Mid$(CmdLine, 1, i – 1)
CmdLine = Mid$(CmdLine, i + 1, Len(CmdLine))
Loop
For i = 1 To ArgNb
CmdLine = CmdLine & „Parameter “ & i & „: “ & CmdArgs(i) & vbLf
Next i
MsgBox CmdLine
End Sub

Private Function GetCommLine() As String
Dim Ret&, sLen&, Buffer$
Ret = GetCommandLine
sLen = lstrlen(Ret)
If sLen Then
GetCommLine = Space$(sLen)
CopyMemory ByVal GetCommLine, ByVal Ret, sLen
End If
End Function

Examples of use:
Execute dialog box:
excel /eInfo1/Info2 c:\your file.xls
with short cut:
„C:\Program Files\Microsoft Office\Office10\EXCEL.EXE“ /eInfo1/Info2
„c:\your file.xls“
with batch file:
Start „C:\Program Files\Microsoft Office\Office10\EXCEL.EXE“ /eInfo1/Info2
„c:\your file.xls“

Der Grund warum es mit dieser Methode funktioniert ist ganz einfach die Funktion GetCommLine, die benutzt nicht einfach den ermittelten Wert, sondern kopiert ihn mittels CopyMemory-API Aufruf sauber in einen String. Damit ist man die Schutzverletzungen los, die bei den älteren Lösungen auftauchen.

Das Original ist zu finden unter:
http://www.pcreview.co.uk/forums/thread-2004448.php

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s


%d Bloggern gefällt das: