Excel wird mit /Parameter geöffnet-Parameter in Zelle einfügen
#11
Hallo André,

das Abtrennen ist auch auf der von mir verlinkten Seite erklärt.

Gruß Uwe
Top
#12
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 Wink

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)
Top
#13
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
Top
#14
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
Top
#15
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:
  • holg620
Top
#16
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!
Top
#17
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:
  • holg620
Top
#18
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!
Top
#19
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.
Top
#20
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
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste