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