derhulk
Goto Top

Paramter übergeben, Code funktioniert nicht unter Windows 10

Guten Tag,
es geht darum, einen Paramter, der aus einem Programm an die Kommandozeile übergeben wird, an Excel weterzugeben, so dass der Wert dort automatisch weiterverarbeitet wird.
Aus dem Programm heraus wird silent.vbs gestartet, welches w4atoexcel.cmd, daraufhin öffnet sich Excel und zeigt den Paramter an, der im Programm gewählt wurde.
Untenstehender Code funktioniert auf Windows7 wunderbar, doch seit Windows10 installiert wurde, klappt es nicht mehr.
Wisst ihr, an welcher Stelle der Code angepasst werden muss, damit es auch auf Windows10 funktioniert? Vielen Dank.

silent.vbs (VBScriptdatei):
Set WshShell = CreateObject("WScript.Shell")  
Redim args(WScript.Arguments.Count-1)
args(0) = WScript.Arguments(0)
WshShell.Run chr(34) & "\\Excel\w4atoexcel.cmd" & Chr(34) & Join(args) , 0  
Set WshShell = Nothing

w4atoexcel.cmd (Windows-Befehlsskript):
@echo off

START excel "\\Excel\Einzelansicht.xlsm" /e/%1  

Content-Key: 301951

Url: https://administrator.de/contentid/301951

Printed on: April 25, 2024 at 21:04 o'clock

Member: emeriks
Solution emeriks Apr 15, 2016 at 12:31:46 (UTC)
Goto Top
Hi,
  1. da fehlt ein Leerzeichen. s.u. Code
  2. Und Chr(34) kannst Du einfacher haben: Ein " innerhalb eines Strings muss man doppelt setzen. Bsp: "Blablabla ""xyz"" blablavbla"
  3. Was soll "\\Excel\w4atoexcel.cmd" sein? Wenn das ein UNC sein soll, Servername wäre dann "EXCEL", dann fehlt noch die Freigabe --> \\Excel\Freigabe\w4atoexcel.cmd"

WshShell.Run """\\Excel\w4atoexcel.cmd"" " & Join(args) , 0  

E.
Member: DerHulk
DerHulk Apr 15, 2016 at 13:16:57 (UTC)
Goto Top
Danke, korrekt heißt der Pfad:
"\\Servername\Ordner\Excel\w4atoexcel.cmd"
Ich habe es nun mit " " ausprobiert.
Leider besteht das Problem immer noch. Excel startet, aber der Parameter wird nicht ausgegeben. Unter Windows 7 funktioniert es aber.
Member: DerHulk
DerHulk Apr 15, 2016, updated at Apr 19, 2016 at 08:03:13 (UTC)
Goto Top
falls es an Excel selbst liegt, hier noch der VBA Code:

Modul
Option Explicit

Declare PtrSafe Function GetCommandLine Lib "kernel32" Alias "GetCommandLineW" () As Long  
Declare PtrSafe Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long  
Declare PtrSafe 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

Arbeitsmappe
Private Sub Workbook_Open()
Dim CmdRaw As Long
Dim CmdLine As String
CmdRaw = GetCommandLine
CmdLine = CmdToSTr(CmdRaw)
If InStr(1, CmdLine, "/e/") > 0 Then Sheets("Projekt-Status").[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)

myParam = Right(CmdLine, 6)

Selection.AutoFilter Field:=1, Criteria1:=myParam

End Sub
Mitglied: 114757
Solution 114757 Apr 15, 2016, updated at Apr 19, 2016 at 07:39:41 (UTC)
Goto Top
Moin,
oh man wer hat diesen Murks denn konstruiert?? Das ist ja vollkommen umständlich um 10 Ecken gedacht, da reicht doch das folgende VBS als einziges Skript vollkommen aus. Die Sub in dem Excelfile kannst du dann ebenfalls komplett rauslöschen, das macht in diesem Fall ebenfalls die VBS ...
Du brauchst also nur noch dieses VBS und das reine Excelfile ohne den Makro-Code im Sheet.
set objExcel = CreateObject("Excel.Application")  
objExcel.DisplayAlerts = False
set wb = objExcel.Workbooks.Open("\\Excel\Einzelansicht.xlsm")  
wb.Sheets("Projekt-Status").Range("D4").Value = WScript.Arguments(0)  
wb.Save
objExcel.DisplayAlerts = True
objExcel.Quit
Gruß jodel32
Mitglied: 116301
Solution 116301 Apr 16, 2016 updated at 07:54:57 (UTC)
Goto Top
Hallo Jodel!

Dein Code entpricht auch meiner Vorstellung von silentface-wink Allerdings ist der Paramter /e/ hier völlig überflüssig. Der wird ja erst im Cmd-Script generiert und sollte ja nur dazu dienen, im VBA-Code den an das VB-Script übergebene Argument aus der Command-Line zu extrahieren...

Gruß Dieter
Mitglied: 114757
114757 Apr 16, 2016 updated at 08:06:28 (UTC)
Goto Top
Seh ich gerade auch, Danke Dieter face-smile

jodel
Member: DerHulk
DerHulk Apr 19, 2016 updated at 07:42:49 (UTC)
Goto Top
Hallo Zusammen,

erstmal sorry für die späte Antwort, ich war etwas erkältet und lag im Bett.

Vielen Dank für die Hilfe, der Paramter wird korrekt übergeben. Nun möchte ich nur noch erreichen, dass das Workbook nicht gespeichert wird, sondern stattdessen direkt geöffnet wird.

Quasi eine VB Variante von START excel "\\Excel\Einzelansicht.xlsm"
Mitglied: 114757
Solution 114757 Apr 19, 2016 updated at 07:40:35 (UTC)
Goto Top
Zitat von @DerHulk:
Vielen Dank für die Hilfe, der Paramter wird korrekt übergeben. Nun möchte ich nur noch erreichen, dass das Workbook nicht gespeichert wird, sondern stattdessen direkt geöffnet wird.

Quasi eine VB Variante von START excel "\\gs05\Work4All\Excel\Einzelansicht.xlsm"
Kein Problem:
set objExcel = CreateObject("Excel.Application")  
set wb = objExcel.Workbooks.Open("\\gs05\Work4All\Excel\Einzelansicht.xlsm")  
wb.Sheets("Projekt-Status").Range("D4").Value = WScript.Arguments(0)  
objExcel.Visible = True
Member: DerHulk
DerHulk Apr 19, 2016 updated at 07:48:45 (UTC)
Goto Top
Jetzt klappts super, vielen lieben Dank :D
Mitglied: 114757
114757 Apr 19, 2016 updated at 07:50:50 (UTC)
Goto Top
Nö, musst du nicht. Du hattest bestimmt noch irgendein anderes Excel-Object in der Prozessliste "hängen", das musst du erst abschiessen, das ist 100% deinen diversen Versuchen geschuldet, das ist normal wenn dann das dann Excel verrückt spielt.
Member: DerHulk
DerHulk Apr 19, 2016 at 07:56:58 (UTC)
Goto Top
Könnte man es noch hinkriegen, dass die Datei direkt im Vordergrund, am besten im Vollbildmodus erscheint? Im Moment liegt die Ansicht hinter der momentan aktiven Applikation
Mitglied: 114757
Solution 114757 Apr 19, 2016 at 08:01:29 (UTC)
Goto Top