Registriert seit: 17.04.2014
Version(en): MS Office 365(32)
Hallo André,
das Abtrennen ist auch auf der von mir verlinkten Seite erklärt.
Gruß Uwe
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
19.02.2015, 20:45
(Dieser Beitrag wurde zuletzt bearbeitet: 19.02.2015, 22:51 von schauan.)
Hallo Uwe, ich hab vorhin am Handy geschrieben, der Link hat mich an den Anfang der ganzen Geschichte gebracht und auf dem Handy sah mir das doch recht umfangreich aus Ich kann jedoch bestätigen, dass der code so nicht funktioniert, jedenfalls auch bei mir nicht. Der Parameter kommt nicht .... Im Ursprünglichen code würde das funktionieren: Code: If InStr(1, CmdLine, "/e/") > 0 Then Sheets("Tabelle1").[D4] = Split(CmdLine, "/e/")(1)
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
Registriert seit: 14.04.2014
Auch Hallo, möglicherweise hast Du da ein WideChar Problem mit der Kommandozeile, d.h. die benutzt 16 Bit breite, nicht 8 Bit breite Zeichen. Versuche denn einfach mal so etwas, vielleicht geht das ja? Debug.Print schreibt in das VBA-Direktfenster. cu, Bernd -- Code: Option Explicit
Private Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineW" () As Long Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal codepage As Long, ByVal dwFlags As Long, lpWideCharStr As Any, ByVal cchWideChar As Long, lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpDefaultChar As String, ByVal lpUsedDefaultChar As Long) As Long Private Declare Function lstrlenW Lib "kernel32" (lpString As Any) As Long
Const CP_ACP = 0
Sub x() ' Rufe das manuell auf oder starte es aus VBA heraus mit F5 Debug.Print GetStrFromPtrW(GetCommandLine) End Sub
Public Function GetStrFromPtrW(lpszW As Long) As String Dim sRtn As String, lLen As Long lLen = lstrlenW(ByVal lpszW) ' Länge ohne der abschließenden 0 sRtn = String$(lLen, 0) ' mit cchWideChar = -1 liefert dieses einen String bis (inklusive) der abschliessenden 0. Dieser ist um ' 1 Zeichen länger als lLen, was IMHO aber nichts macht, da genau in diesem Zeichen ja die 0 stehen würde ' d.h. hier wird die 0 einfach nicht mitkopiert und muss deshalb auch nicht extra gesucht werden ' ob das so allerdings wirklich zu 100% korrekt ist, ????? Call WideCharToMultiByte(CP_ACP, 0, ByVal lpszW, -1, ByVal sRtn, Len(sRtn), 0, 0) GetStrFromPtrW = sRtn End Function
Registriert seit: 16.12.2014
Version(en): 2010
Hallo zusammen, Ja, es soll nur die Zahl am Ende, z.B. 4533 weitergegeben werden. Ich habe nun den Code von Bernd verwendet, leider konnte ich nirgendwo etwas finden/sehen. Also habe ich noch Zitat:Sheets("Projekt-Status").[D4] = GetStrFromPtrW(GetCommandLine) eingefügt. Nach dem Ausführen wurde dann das eingetragen: Zitat:"C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE" /dde Beim Verwenden des Codes von schauan kommt eine Compiler-Fehlermeldun. LG Holger
Registriert seit: 14.04.2014
Hi Holger,
hier in einer Virtualbox mit win xp und xl 2003 funktioniert das. Sowohl für:
excel /e/der-test cmdTest.xls
als auch für:
excel cmdTest.xls /e/der-test
wird die korrekte Kommandozeile im VBA angezeigt.
Sonderzeichen im Parameter hinter /e - insbesondere Leerzeichen - machen allerdings Probleme.
Was passt bei Dir nicht?
Und, hast Du beide Varianten ausprobiert, also den /e Teil vor und hinter dem Dateinamen?
cu, Bernd
Folgende(r) 1 Nutzer sagt Danke an bst für diesen Beitrag:1 Nutzer sagt Danke an bst für diesen Beitrag 28
• holg620
Registriert seit: 16.12.2014
Version(en): 2010
Habe das VBA-Direktfenster nun gefunden und auch dort erscheint diese Meldung: "C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE" /dde
Egal, ob ich den Parameter durch die Software beim Aufruf mitgeben lasse, oder ob ich den Parameter testweise durch eine Verknüpfung anfüge. Also: \\....\Einzelansicht.xlsm /e/4533
Komisch, das beides nicht klappt...die Software zumindest müsste das ja fehlerfrei weitergeben!
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
24.02.2015, 19:18
(Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2015, 19:19 von schauan.)
Hallo zusammen, also, hier der komplette code nach meinen Hinweisen. Bei mir klappt es. Aufrufen tue ich die Mappe mit Excel so: excel.exe c:\test\getcommandline /e/1234 Der Teil im DieseArbeitsmappe: Code: Private Sub Workbook_Open() Dim CmdRaw As Long Dim CmdLine As String 'i can now open the file in the run comm box using '"C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE" "{path}" /e/myPar CmdRaw = GetCommandLine CmdLine = CmdToSTr(CmdRaw) If InStr(1, CmdLine, "/e/") > 0 Then Sheets("Tabelle1").[D4] = Split(CmdLine, "/e/")(1) End Sub Private Sub Workbook_POpen() Dim CmdRaw As Long Dim CmdLine As String Dim myParam As String
CmdRaw = GetCommandLine CmdLine = CmdToSTr(CmdRaw)
'at this point we have the command line as a string myParam = Right(CmdLine, 6)
'use last 6 digits to filter, as param will ALWAYS be len 6 Selection.AutoFilter Field:=1, Criteria1:=myParam
End Sub
und der Teil in ein Modul Code: Option Explicit
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)
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
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:1 Nutzer sagt Danke an schauan für diesen Beitrag 28
• holg620
Registriert seit: 16.12.2014
Version(en): 2010
Hallo schauan, ja, in der Tat, es funktioniert! Danke!
Ich habe die Verknüfung nun strukturell verändert in : "C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE" "\\....\Einzelansicht.xlsm" /e/4533
So klappt es jetzt.
Mit der Software klappt es noch nicht, das werde ich klären müssen. Dazu werde ich auch nochmal Rückmeldung geben.
Bis dahin vielen Dank!
Registriert seit: 16.12.2014
Version(en): 2010
Tja, die Entwickler sagen, es kann wahrscheinlich nur ein dynamischer Parameter weitergeben werden, ohne Zusatz.
e/[P] = " /e/4533" geht also nicht, sondern nur [P] = " /4533"
Ich halte euch auf dem Laufenden.
Registriert seit: 14.04.2014
Morgen, wie rufst Du das denn auf, aus einer Batchdatei heraus? Dann mache Dir das Leben doch viel einfacher, nimm eine Umgebungsvariable. Für so etwas sind die denn da... cu, Bernd -- Code: @echo off
set MYEXCELPAR=ich bin ein Parameter excel e:\test\environ.xls
Und im Excel dann einfach: Code: Option Explicit
Private Sub Workbook_Open() MsgBox Environ("MYEXCELPAR") End Sub
|