[Excel] VBA - Excelmakro mit (externen) Parameter starten

amn.ssy

Erfahrenes Mitglied
Hallo,

ich habe hier eine Excel-Makrovorlage in die in eine Zelle ein Namen geschrieben wird und in einer anderen Zellen via Filedialog eine Datei incl. Pfad eingetragen wird.
Hat jemand einverständliches Beispiel wie ich so etwas automatisieren kann?
Der erste Gedanke wäre eine simple Textdatei\CSV die je "datensatz" den Namen und die Datei incl. Pfad enthält
z.b. L.Mueller ; c:\aaa\bbb\datei.xlsx. Die Vorlagendatei müßte dann beim öffnen schauen ob es eine solche CSV gibt und wenn ja diese dann entsprechend abarbeiten.
Denkbar wäre ab auch ein VB-Script (wenn das den überhaupt geht), das die Excel-Vorlage aufruft und den Namen und die zu verarbeitende Datei als Parameter übergibt.
Welcher Weg macht Sinn? Wo kann ich ggf. ein Beispiel hierfür finden?

Grüße
opiWahn
 
Ahoi _opiWahn_
ich habe hier eine Excel-Makrovorlage in die in eine Zelle ein Namen geschrieben wird und in einer anderen Zellen via Filedialog eine Datei incl. Pfad eingetragen wird.
Hat jemand einverständliches Beispiel wie ich so etwas automatisieren kann?
Was davon soll automatisiert werden? Das klingt für mich bereits automatisiert. Oder gibts bestimmte Regeln mit denen der Pfad erstellt werden könnte, damit du ihn nicht mehr auswählen musst?

Oder meinst du damit dein erwähntes CSV-File? Wenn ja, was soll daran automatisiert werden?
 
Parameterübergabe aus der Kommandozeile:
http://www.vbforums.com/showthread....to-Pass-Command-Line-Parameter-DKenny-is-KING

In ein Standard-Modul

Public Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineW" () As Long
Public Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (MyDest As Any, MySource As Any, ByVal MySize As Long)

Public 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



In die Workbook_Open-Funktion

Private Sub Workbook_Open()
Dim CmdRaw As Long
Dim CmdLine As String
Dim CmdLineArr() As String
Dim ParamArr() As String

CmdRaw = GetCommandLine
CmdLine = CmdToSTr(CmdRaw)

CmdLineArr = Split(CmdLine, "/e/")
ParamArr = Split(CmdLineArr(1), "/")

For i = LBound(ParamArr) To UBound(ParamArr)
Debug.Print ParamArr(i)
Next

End Sub



Aufruf in der Kommandzeile (Oder per Batch-Datei):
excel c:\Mein\Pfad\Zur\XLSM\Datei\Mappe1.xlsm /e/Test1/Param2/DritterEintrag

ALT+F11 drücken und sich die Direktausgabe anschauen

Wichtig: Der Switch "/e" und alles was danach kommt darf keine Leerzeichen enthalten
 
Zuletzt bearbeitet:
'n Abend,

zunächst vielen Dank für eure Hinweise.
Ich befürchte jedoch, daß ich mich etwas unklar ausgedrückt habe um was es konkret geht:
Zunächst einmal habe ich auf der einen Seite für jeden Monat Exceltabellen ohne Makro die bestimmte Daten enthalten.
Diese Daten müßen mit ein paar Parametern einer Statistiksoftware übergeben werden.
Auf der anderen Seite auf ich die besagte Excelvorlage mit Makros.
In dieser Vorlage wähle ich über ein DropDownMenü einen Namen aus, der dann nach B4 geschrieben wird (alternativ kann ich über die Adresszeile auch gleich einen anderen Namen eintragen).
Über den Button "Add" (dahinter befindet sich ein GetOpenFileName) wähle ich eine bestimmte Exceldatei (die mit den Monatsdaten) aus.
Diese Datei wird dann nicht nur geöffnet und ausgelesen, es wird auch der Dateiname nebst Pfad nach B7 eingetragen.
Zum Schluß folgt manuell der Klick auf "Run" und die Daten werden zur Statistiksoftware geschickt, die Ergebnisse wieder entgegen genommen und ein Report generriert.
Was ich nun erreichen möchte ist, daß ich den Name und den Pfad von außen via txt-Datei oder sonst wie übergeben kann und die Analyse losrennt ohne, daß ich das Template öffnen muß.
Ganz cool wären die Möglichkeit mehrere Zeilen in der Info.txt zu pflegen um das Prozedere entsprechend oft zu durchlaufen.
Ich muß dann halt dafür sorgen, daß die Software ordentlich geschlossen wird und daß Makro die ermittelten Daten bzw. Reports gleich speichert.
Letzteres scheint mir auf den ersten Blick aber nicht so dramatisch zu sein.


Grüße
opiWahn
 
Dann denke ich aber, dass du genau den Code aus meinem Beispiel oben verwenden musst.
Im zweiten Code-Block in Zeile 14 kannst du ja bequem eine IF-Abfrage oder ein Select Case einbauen, je nachdem was du in der Kommandozeile als Parameter übergibst, dass dein Code was anderes tun soll.

Visual Basic:
For i = LBound(ParamArr) To UBound(ParamArr)
If i=0 then FileOpenFunktion(ParamArr(0)) 'ParamArr(0) enthält c:\Mein\Pfad\Zur\CSV\MeineCSV.csv
If i>0 then

Select Case ParamArr(i)

Case "Funktion1"
'Tu dies
Case "Funktion2"
'Tu jenes
Case Else

End Select

End If
Next

Der Kommandozeilen-Aufruf wäre dann irgendwie sowas:
excel c:\Mein\Pfad\Zur\XLSM\Datei\MeineExcelVorlage.xlsm /e/c:\Mein\Pfad\Zur\CSV\MeineCSV.csv/Funktion1/Funktion2
 
Zuletzt bearbeitet:
@opiWahn: Meiner Meinung nach hat Zvoni völlig recht mit der Vorgehensweise. Vielleicht wird dir mit dieser Erläuterung klarer, warum das so gemacht werden muss/sollte: http://www.xlam.ch/soscq/startparameter.htm#Eigene Start-Parameter definieren

Ganz cool wären die Möglichkeit mehrere Zeilen in der Info.txt zu pflegen um das Prozedere entsprechend oft zu durchlaufen.
Die Zeilen sind die Pfade zu den verschiedenen CSV-Dateien? Wenn ja, dann müsste das so funktionieren:
Code:
@echo off
for /f "delims=" %%i in (C:\temp\info.txt) do echo %%i
pause
Anstatt echo %%i muss hier nur der zusammengesetzte Befehlsaufruf (Siehe Beitrag Zvoni) aufgeführt werden, wobei %%i der Pfad zu den einzelnen csv-Dateien ist.

Edit - Oder etwas erweitert:
Code:
@echo off

set param=%1

if /i %param:~-4%==.csv echo Oeffne Vorlage mit: %param%
if /i %param:~-4%==.txt for /f "delims=" %%i in (%param%) do echo Oeffne Vorlage mit: %%i

pause
(Eine csv oder txt Datei wird der cmd per Drag&Drop übergeben. Die cmd unterscheidet den Dateityp und "öffnet" die Excel mit den entsprechenden Parametern.)
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück