Ich würde gerne eine Excel-Datei per Batch-Datei aufrufen.
Der Aufruf soll wie folgt aussehen:
start datei.xls 1
Ist es möglich die "1" an Excel zu übergeben, und wenn ja wie kann ich sie
in einem Makro verarbeiten (z.B. wenn 1 dann ...)
Danke
Michi
--
Gruß
Matthias Tacke Email: Matt...@Tacke.de
---------+---------+---------+---------+---------+---------+---------+-------
Michael Mueller <Michael....@de.bosch.com> schrieb in im Newsbeitrag:
8l1aa9$o4q$1...@proxy.fe.internet.bosch.de...
Start der Datei mit
start datei.xls 1
Im Makro dann habe ich versucht mit Parameter=Command() den Parameter zu
ermitteln, ohne Erfolg :-(
Weißt Du wie es geht?
Danke
Michi
Matthias Tacke schrieb:
>Hallo Michael,
>du suchst die Command() Funktion
> Weißt Du wie es geht?
Nein, aber die Hilfe! Die hast Du doch auch, oder nicht?
--------------------------------------------------------------------
DIE COMMAND-FUNKTION
--------------------------------------------------------------------
Gibt den Argument-Abschnitt der Befehlszeile zurück, die verwendet wird, um
Microsoft Visual Basic oder ein ausführbares Programm aufzurufen, das mit
Visual Basic entwickelt wurde.
Syntax
Command
Bemerkungen
Wenn Visual Basic von der Befehlszeile, aufgerufen wird,
wird jeder Abschnitt, der auf /cmd folgt, als
^^^^^^^^^^^^^^^^^^ Wenns überhaupt geht, dann so!
Befehlszeilenargument an das Programm übergeben. Im folgenden Beispiel stellt
befzeilarg die Argumentinformationen dar, die durch die Command-Funktion
zurückgegeben werden.
VB /cmd befzeilarg
Bei Anwendungen, die mit Visual Basic entwickelt wurden und zur einer
ausführbaren Datei kompiliert wurden, gibt Command jedes Argument zurück, das
in der Befehlszeile auf den Namen der Anwendung folgt. Beispiel:
TestAnw befzeilarg
--------------------------------------------------------------------
Wie immer gilt: RTFM!
Gruss,
Piet
Syntax
Command
Bemerkungen
VB /cmd befzeilarg
TestAnw befzeilarg
--------------------------------------------------------------------
Wie immer gilt: R_T_F_M!
Gruss,
Piet
Syntax
Command
Bemerkungen
VB /cmd befzeilarg
TestAnw befzeilarg
--------------------------------------------------------------------
Wie immer gilt: RT*M!
Gruss,
Piet
> Weißt Du wie es geht?
Nein, aber die Hilfe! Die hast Du doch auch, oder nicht?
DIE COMMAND-FUNKTION
Gibt den Argument-Abschnitt der Befehlszeile zurück, die verwendet wird, um
Microsoft Visual Basic oder ein ausführbares Programm aufzurufen, das mit
Visual Basic entwickelt wurde.
Syntax
Command
Bemerkungen
Wenn Visual Basic von der Befehlszeile, aufgerufen wird,
wird jeder Abschnitt, der auf /cmd folgt, als
^^^^^^^^^^^^^^^^^^ Wenns überhaupt geht, dann so!
Befehlszeilenargument an das Programm übergeben. Im folgenden Beispiel stellt
befzeilarg die Argumentinformationen dar, die durch die Command-Funktion
zurückgegeben werden.
VB /cmd befzeilarg
Gruss,
Piet
Erst kam immer "No Server-accepted article" oder so, und auf einmal flutschten
alle 4 Versionen aus dem Postausgang.
Gruss,
Piet
Hab ich schon probiert und es hat nix geholfen :-(
Wie anders kann ich es denn bewerkstelligen das aus einer Batch-Datei heraus
eine Excel-Datei geöffnet und dabei auch noch ein Parameter übergeben wird?
> Hab ich schon probiert und es hat nix geholfen :-(
>
> Wie anders kann ich es denn bewerkstelligen das aus einer Batch-Datei heraus
> eine Excel-Datei geöffnet und dabei auch noch ein Parameter übergeben wird?
Sorry, no idea. :-(
Gruss,
Piet
Tja, lieber Piet, das Lesen der Online-Hilfe ist schon wichtig, aber wenn
schon, dann richtig:
;-))
Folgende Problematik:
Die Command()-Funktion ist in der Excel-Hilfe leider völlig fehl am Platze!
Denn wie ganz deutlich (?) im von Piet zitierten Hilfe-Text (Ich halte es im
übrigen für wenig sinnvoll, wenn man/frau hier in der NG seitenweise die
Excel-Hilfe zitiert!!) steht, ist diese Funktion für Microsoft Visual Basic
bzw. damit erstellten Programmen gedacht!
Und da hier nicht VBA (Visual Basic for Applications) sondern eben das
"richtige" Microsoft Visual Basic (kurz VB) gemeint ist, gehört die gesamte
Funktion nicht (mehr) zu Excel.
IMHO war die Command-Funktion in früheren Office-Versionen auch in den
jeweiligen Office-Produkten verfügbar. Beispielsweise konnte man/frau das in
der Befehlszeile via "/cmd" übergebene Argument in Access 97 sehr wohl mit
der Command-Funktion (jetzt VBA) abfragen.
Leider ist mir derzeit kein direkter Weg bekannt, in der Befehlszeile etwas
an die VBA-Welt einer Arbeitsmappe zu übergeben. Bliebe da noch die
Möglichkeit ein eigenes VB (!)-Programm zu schreiben, das dann wiederum die
gewünschte Excel-Arbeitsmappe öffnet und dann die gewünschten Argumente an
eine - via VB (!) - gestartete VBA-Prozedur übergibt.
Vermutlich einfacher wird es sein, die gewünschten Argumente vorher in eine
Textdatei zu schreiben (beispielsweise via Batch-Datei) und dann die
Excel-Arbeitsmappe zu starten, deren VBA-Makro wiederum die Werte aus dieser
Textdatei ausliest.
In der Hoffnung etwas zur Klärung beigetragen zu haben, verbleibe ich mit
einem leisen
Servus aus Wien,
-Robert Gelbmann-
P. S.: Ich bitte um Verständnis, daß ich Anfragen ausschließlich in der NG
beantworten kann!
---
MS MVPCE für Excel
EML: <rgel...@mvps.org>
WWW: http://www.roehrenbacher.at/
Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineA" () As
String
hth
es ist mir zwar gelungen über eine API-Funktion die exakte Commandline
über einen auto_open-Makro einzulesen, nur nützt das nichts.
Excel versucht alles was auf der Commandline steht als Datei zu öffnen,
auch den Parameter. Und wenn es den nicht als Datei gibt, kommt eine
Fehlermeldung. Automatisiert läßt sich so nicht arbeiten.
Der Hinweis mit einer Hilfsdatei zu arbeiten von Robert Gelbmann ist sicher
am sinnvollsten. Textdateien importiert Excel (je nach Einstellung) ohne
große Probleme und legt sie Zeilenweise in untereinander stehenden
Zellen ab. Die Textdatei kann man bequem mit einer Batch-Datei erstellen
und so dann auch gleich mehrere Parameter übergeben. Z.B.:
*********Schnipp*********
Rem Test.Bat
ECHO Parameter1 >Test.txt
ECHO Parameter2 >>Test.txt
Rem hier müssen noch die korrekten Pfade eingesetzt werden.
Excel Test.txt Arbeit.xls
*********Schnapp*********
Durch diese Batch-Datei startet Excel, lädt beide Dateien. Von Arbeit.xls
läßt sich auch direkt auf die Werte in den Zellen von Test.txt zugreifen.
In A1 steht Parameter1 in A2 Parameter2 etc.
*********Schnipp*********
' Modul in Arbeit.xls
Declare Function GetCommandLine Lib "kernel32" _
Alias "GetCommandLineA" () As String
Sub auto_open()
MsgBox GetCommandLine
End Sub
*********Schnapp*********
Hallo Michael,
Mathias Tacke hat mit der API Funktion GetCommandLine recht.
Damit geht das.
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
Sub Befehlszeile()
Dim a
a = StringVonPointer(GetCommandLine())
MsgBox a
End Sub
Private Function StringVonPointer(plngAscii As Long)
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
Jetzt noch beim Öffnen der Mappe aufgerufen und du hast die
komplette Befehlszeile, die etwa so aussieht:
"C:\Programme\Microsoft Office\Office\EXCEL.EXE" "c:\Eigene
Dateien\Befehlszeile.xls" 1
MfG
Michael
MfG
Michael
mittlerweile habe ich es so gelöst, das ich den Parameter durch ein
VB-Scribt an Excel übergebe. Läuft zwar prima, aber ich wollte halt nur die
Excel-Datei.
Den Tip mit der API-Funktion werde ich aber mal ausprobieren, hört sich sehr
vielversprechend an. Ich denke das ist genau das was ich brauche.
Nochmals vielen Dank für Eure Hilfe
Michael Mueller
Gruß
Matthias
Michael Schwimmer <Schw...@t-online.de> schrieb in im Newsbeitrag:
8l2jmn$kmk$10$1...@news.t-online.com...
btw: Die Idee mit dem Textfile hat trotzdem was, erspart das Parsen in
VBA und die Parameter können direkt referenziert werden.
=[TEST.TXT]TEST!$A$1
=[TEST.TXT]TEST!$A$2 etc.
> Tja, lieber Piet, das Lesen der Online-Hilfe ist schon wichtig, aber wenn
> schon, dann richtig:
> ;-))
Hast ja Recht. Hatte nur die Schreibweise gesehen (/Parameter), und die war,
unter der Annahme der Verwendung der Command()-Funktion, einfach falsch.
Deshalb der Hinweis auf die Hilfe. Das das dann _immer_ noch nicht geht, ist
schade. Ich denke nur, daß man die vorher durchgelesen haben sollte.
> Denn wie ganz deutlich (?) im von Piet zitierten Hilfe-Text (Ich halte es im
> übrigen für wenig sinnvoll, wenn man/frau hier in der NG seitenweise die
> Excel-Hilfe zitiert!!) steht, ist diese Funktion für Microsoft Visual Basic
> bzw. damit erstellten Programmen gedacht!
Auch wenn das in der Hilfe so steht, sollte man es nicht immer glauben,
sondern mal ausprobieren. Bringt hier leider nix (?) -> schade. "Seitenweise"
ist wohl etwas übertrieben. Sollte dem Poster nur Zeit sparen und
Mißverständnisse vermeiden.
Ich würde jetzt auch über die Hilfsdatei gehen, das hat schon oft geholfen,
z.B. um zu erkennen, ob ein extern gestartetes Programm fertig ist (als letzte
Aktion dort copy dummy.txt fertig.txt).
Gruss,
Piet
Hallo Matthias,
ich hatte im Appleman nachgeschaut, und habe gelesen, daß die
Funktion einen Pointer zurückliefert. Die Funktion StringVonPointer
hatte ich mal in einem anderen Zusammenhang geschrieben und war
somit verfügbar. Da ich die meiste Zeit offline bin, habe ich deinen
Beitrag erst gelesen, nachdem ich meinen gepostet hatte.
Ist schon erstaunlich, was eine kleine Änderung bei der Deklaration
bewirken kann.
MfG
Michael
------------------------------ schnipp -------------------------------
Re: getting hold of the start up params from VBA
Author: Laurent Longre
Email: lon...@wanadoo.fr
Date: 1998/09/15
Forums: microsoft.public.excel.programming
Bonjour,
The following trick works at least in XL97 SR-1 / Win95.
The command line arguments must be read by the Auto_open (or
Workbook_Open) Sub of your add-in (say c:\temp\test.xla).
Your command line should look like this one:
start excel c:\temp\test /e/param1/param2/.../paramN (DOS command)
RetVal = Shell("c:\...\excel.exe c:\temp\test /e/param1/...paramN")
(VB)
i.e. : after excel.exe, the name of the add-in, then the switch /e
**immediately** followed by your own arguments. These arguments should
be separated by "/" without any intermediate space.
For instance, if you want to pass the arguments "c:\temp\file1.dbf",
"all" and "exclusive" to Excel, your command-line should look like:
start excel c:\temp\test /e/c:\temp\file1.dbf/all/exclusive
2. In Test.xla, use the API function GetCommandLine (alias
GetCommandLineA in Win95) to get the contents of this command-line
string.
You should then parse the string returned by GetCommandLineA, search
for
the separators "/" and store each argument in an array. Here is an
example of a such Auto_open sub:
'**************************************************
Option Base 1
Declare Function GetCommandLineA Lib "Kernel32" () As String
Dim Args() As String
Sub Auto_open()
Dim CmdLine As String
Dim ArgCount As Integer
Dim Pos1 As Integer, Pos2 As Integer
CmdLine = GetCommandLineA
Pos1 = InStr(1, CmdLine, "/") + 1
Pos1 = InStr(Pos1, CmdLine, "/") + 1
Do While Pos1 <> 1
Pos2 = InStr(Pos1, CmdLine, "/")
ArgCount = ArgCount + 1
ReDim Preserve Args(ArgCount)
Args(ArgCount) = Mid(CmdLine, Pos1, _
IIf(Pos2, Pos2, Len(CmdLine)) - Pos1)
MsgBox "Argument " & ArgCount & " : " & Args(ArgCount)
Pos1 = Pos2 + 1
Loop
End Sub
'**************************************************
If you use the command-line above, this Auto_open sub will store the
three arguments ("c:\temp\file1.dbf", "all" and "exclusive") in the
Args() array and display them.
Again, be sure that you don't insert any space between /e and each
argument in the command-line, otherwise it will fail (Excel would
believe that these "pseudo-arguments" are the names of workbooks to
open
at startup...).
Bonne chance,
Laurent
------------------------------ schnipp -------------------------------
MfG Frank
_____________________________________________________
Frank Arendt-Theilen, Microsoft MVP für Excel, Hameln
E-Mail: Thei...@t-online.de
Am Tue, 18 Jul 2000 12:08:07 +0200, schrieb Michael Mueller
<Michael....@de.bosch.com> in microsoft.public.de.excel zu
"Batchparameter an Excel übergeben und im Macro verarbeiten?":
>Hi,
>
>Ich würde gerne eine Excel-Datei per Batch-Datei aufrufen.
>Der Aufruf soll wie folgt aussehen:
>
> start datei.xls 1
>
War ja nur gut gemeint! - Von uns beiden!
:-)
P.S.: Der Vorschlag von Matthias scheint mir recht brauchbar zu sein!
:-))
In der Hoffnung geholfen zu haben, verbleibe ich mit einem leisen
Interessanter Vorschlag, den ich mir erlaube gleich aufzugreifen.
Es folgt eine kleine Funktion, die den übergebenen Parameter ausliest.
Allerdings sind folgende Besonderheiten zu beachten:
(1) Der Aufruf der Excel-Datei muß vollständig erfolgen. (Also vorher
excel.exe)
(2) Der Parameter muß *nach* excel.exe und *vor* dem Excel-Dateinamen
stehen.
(3) Der Parameter beginnt mit /cmd (kann beliebig im Code geändert werden,
nur Excel-eigene Parameter dürfen nicht verwendet werden).
(4) Der Parameter muß *direkt* (d. h. vor allem auch *ohne* Leerzeichen
dazwischen!) nach dem einführenden /cmd angeführt werden.
(5) Der Parameter darf keine Leerzeichen enthalten! Es wäre aber denkbar
mehrere Parameter - beispielsweise getrennt durch weitere "/"-Zeichen (vgl.
Beitrag von Frank) - gleichzeitig zu übergeben.
Anwendungsbeispiel (z. B. als Verknüpfung):
"C:\Programme\Microsoft Office\Office\EXCEL.EXE" /cmdtest
"C:\test\MeineDatei.xls"
(Im konkreten Fall wurde der Parameter "test" übergeben.)
Nun noch der VBA-Code dazu:
'--- In einem Modul ---
Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineA" () As
String
Function xCommand() As String
Const xID = "/cmd"
xCommand = GetCommandLine()
' Null-Zeichen am Ende entfernen ...
xCommand = Replace(Expression:=xCommand, Find:=Chr(0), Replace:="",
Compare:=vbBinaryCompare)
' Linken Teil abschneiden (excel.exe, usw.) ...
xPos = InStr(xCommand, xID)
If xPos > 0 Then
xCommand = Mid(xCommand, xPos + Len(xID))
Else
xCommand = ""
End If
' Rechten Teil abschneiden (Dateiname) ...
xPos = InStr(xCommand, " ")
If xPos > 0 Then
xCommand = Left(xCommand, xPos - 1)
Else
xCommand = ""
End If
End Function
'----- Anwendung beispielsweise beim Workbook_Open-Ereignis -----
Private Sub Workbook_Open()
Select Case LCase(xCommand())
Case ""
MsgBox "Kein Parameter gefunden!"
Case "test"
MsgBox "Erwarteter Parameter 'test' gefunden!"
Case Else
MsgBox "Unerwarteter Parameter:" & vbCrLf & xCommand
End Select
End Sub
--
Funktioniert toll, bis auf eine Kleinigkeit:
Bei mir (Win98SE, Office 2000) wird - aus welchen Gründen auch immer - die
von CommandLine() übergebene Kommandozeile mit Ende des Dateipfades einfach
abgeschnitten! (Frage am Rande: Weiß jemand woran das liegt? Betriebssystem?
Office 2000?)
Also z. B. so:
statt:
"C:\Programme\Microsoft Office\Office\EXCEL.EXE" "C:\test\test.xls"
/e/Parameter
erhalte ich nur:
"C:\Programme\Microsoft Office\Office\EXCEL.EXE" "C:\test\test.xls
Die Länge des Pfades scheint dabei keine Rolle zu spielen, aber wie Du
siehst, wird sogar das abschliessende " radikal entfernt ...
Eine einfache Lösung des Problems ist es, die Reihenfolge der Parameter zu
ändern (vgl. auch meinen Beitrag in diesem Thread):
"C:\Programme\Microsoft Office\Office\EXCEL.EXE" /e/Parameter
"C:\test\test.xls"
Allerdings muß man/frau dann noch den Dateinamen, der am Ende des letzten
Parameters fälschlicherweise angefügt wird (bleibt), entfernen ...
In der Hoffnung etwas geholfen zu haben, verbleibe ich mit einem leisen
MfG Frank
_____________________________________________________
Frank Arendt-Theilen, Microsoft MVP für Excel, Hameln
E-Mail: Thei...@t-online.de
Am Thu, 20 Jul 2000 10:12:21 +0200, schrieb "Robert Gelbmann"
<rgel...@mvps.org> in microsoft.public.de.excel zu "Re:
Batchparameter an Excel übergeben und im Macro verarbeiten?":
>Hallo Frank!