Problem
An eine Excel-Datei soll ein Kommandozeilenparameter übergeben werden, der in VBA weitergenutzt werden kann.
Ansatz – Approach
- Nutzung der Kernel32.dll-Bibliothek
- Deklaration von Kernel32-Funktionen
- GetCommandLineW
- lpString
- RtlMoveMemory
- Erstellung einer Funktion für die Verwendeung
- Beispielaufruf
Lösung – Solution
Im Modulkopf von Modul1.bas (oder auch in der Arbeitsmappe) werden Funktionen deklariert:
1.) Modulkopf (Modul1.bas): Deklaration der Kernel Funktionen für die Ausführung von Kommandozeilenparametern:
' Used at module level to declare the default ' lower bound for array subscripts (Array starts with 0) Option Base 0 ' Erzwingt die explizite Deklaration aller ' Variablen in einer Datei Option Explicit ' Deklariert die Funktionen aus kernel32.dll Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineW" () As Long Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (MyDest As Any, MySource As Any, ByVal MySize As Long)
2.) Erstellen einer einfachen Funktion, die die Ausführung von Kommandos anhand der kernel32.dll-Funktionen erlaubt.
Function CmdToSTr(Cmd As Long) As String Dim Buffer() As Byte Dim StrLen As Long If Cmd Then StrLen = lstrlenW(Cmd) * 2 If StrLen Then ReDim Buffer(0 To (StrLen - 1)) As Byte CopyMemory Buffer(0), ByVal Cmd, StrLen CmdToSTr = Buffer End If End If End Function
3.) Wenn das Workbook (die Arbeitsmappe) geöffnet wird, soll der Parameter (hier /cs:irgendwas ) zur Weiterverwendung genutzt werden können
Private Sub Workbook_Open() Dim CmdRaw As Long Dim CmdLine As String Dim start As Integer 'The return value is a pointer to the command-line string for the current process. CmdRaw = GetCommandLine CmdLine = CmdToSTr(CmdRaw) start = InStr(CmdLine, "/cs:") ende = Len(CmdLine) - start - 3 Tabelle1.Cells(1, 1) = Right(CmdLine, ende) mainForm.Show End Sub
4.) Aufruf der Datei
C:\Program Files (x86)\Microsoft Office\Office12\EXCEL.exe C:\tracematrix.xlsm /cs:meinParameter