01. august 2004 - 21:53Der er
22 kommentarer og 2 løsninger
Checke kommandolinie
Kan man i Excel ikke checke kommandolinien for parametre sendt med til et regneark? Jeg har brug for den facilitet for at kunne skifte forskellige indstillinger i et ark afhængig af hvilke parametre arket er startet med.
I Access er det ikke noget problem, men jeg synes ikke at kunne finde den samme kommando i Excel.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
Det er nogen jeg selv vil sende med til arket ved opstart. Groft sagt så er situationen følgende: Jeg har et ark hvor der er nogen persondata og diverse opsætningsdata som jeg gemmer i en .INI fil så det er nemt at hente dem ind hvis jeg laver en opdatering af arket og sender ud. Nu er der så sket det at der er nogle personer der har en fælles computer, men skal køre med meget forskelligt opsætning. Så vil jeg gerne kunne starte mit regneark op med en parameter på kommandolinien der gør at når arket er startet, så er det den rigtige setupfil der indlæses.
There is a way for an auto-start macro to read the arguments on the command line (with Excel 97).
Assume that you want to read the command line argumentsfrom an Auto_open sub in the workbook "c:\temp\test.xls" opened by a batch file (or by a Win95 shortcut).
i.e. : after excel.exe, the name of the workbook containing the Auto_open, then the switch /e **immediately** followed by your own arguments. These arguments should be separated by "/" and form a continuous string without spaces.
For instance, if you want to pass the arguments "c:\temp\file1.dbf", "all" and "exclusive" to Excel, your command-line should look like:
2. In Test.xls, 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
Sub Auto_open()
Dim CmdLine As String 'command-line string Dim Args() As String 'array for storing the parameters Dim ArgCount As Integer 'number of parameters Dim Pos1 As Integer, Pos2 As Integer
CmdLine = GetCommandLineA 'get the cmd-line string On Error Resume Next 'for the wksht-function "Search" Pos1 = WorksheetFunction.Search("/", CmdLine, 1) + 1 'search "/e" Pos1 = WorksheetFunction.Search("/", CmdLine, Pos1) + 1 '1st param
If you use the command-line above, this Auto_open sub will automatically 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 could fail (Excel can believe that these "pseudo-arguments" are the names of workbooks to open at startup...).
Med nogen besvær er det lykkedes mig at flikke noget sammen. Det var lidt ekstra svært, for der skal stå Excel for filnavnet på kommandolinie - ellers kommer alle paramtrene ikke med.
Men her lidt kode at prøve med (jeg kan anbefale at lave en testfil til at prøve funktionen og hvordan den virker i):
Option Base 1 Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineA" () As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long) Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
Dim Args() As String 'Array der indeholder argumenterne fra kommandolinien
Sub Auto_open() Dim CmdLine As String 'Streng, der indeholder kommandolinien Dim ArgCount As Integer 'Tæller, der tæller antallet af argumenter i kommandolinien Dim Pos1 As Integer, Pos2 As Integer
CmdLine = GetCommLine Pos1 = InStr(1, CmdLine, "/") If Pos1 = 3 Or Pos1 = Len(CmdLine) Then Exit Sub Pos1 = Pos1 + 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) + 1) - Pos1) Pos1 = Pos2 + 1 Loop On Error Resume Next Worksheets(1).Range("A1:A" & ArgCount) = WorksheetFunction.Transpose(Args) On Error GoTo 0 End Sub
Private Function GetCommLine() As String Dim RetStr As Long 'Pointer til den streng, der indeholder kommandolinien Dim SLen As Long 'Længden af denne streng Dim Buffer As String
RetStr = GetCommandLine SLen = lstrlen(RetStr) If SLen > 0 Then GetCommLine = Space$(SLen) CopyMemory ByVal GetCommLine, ByVal RetStr, SLen End If
Nedenstående skal stå i dine deklarationer - dvs. uden for funktioner og sub'er (burde være med, hvis du har kopieret hele ovenstående kode ind i dit ark) Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
Hvis jeg putter koden ind i en modul i en workbook og gemmer den og så kalder den med kommandolinien "C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE" H:\Book1.xls /USER1 , så får jeg ikke nogen indikation af at /USER1 er med i kommandolinien. Hvis jeg sætter en MsgBox CmdLine lige efter at den er hentet, så siger den "C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE" H:\Book1.xls
prøv lige nedenstående kode. virker for mig. excel startet således fra Start/Run excel.exe H:\Book1.xls /e/USER1
Option Base 1 Declare Function GetCommandLineA Lib "Kernel32" () As String
Sub Auto_open() Dim CmdLine As String 'command-line string Dim Pos1, Pos2 CmdLine = GetCommandLineA 'get the cmd-line string Pos1 = Split(CmdLine, "/") Pos2 = Pos1(2) MsgBox Pos2 End Sub
Hjælper ikke en sk.. jeg kan fint få det til at funke fra Start/Run, men hvis jeg laver det som et shortcut ( som jeg tror du ønsker ) virker det ikke. Den sidste del af parameteren (efter /E) kommer ikke med
Et alternativ til dette er at oprette en (tom) fil for hver af dine folk, der så åbner fællesfilen med de parametre der er brug for og lukker sig selv. Lidt a'la det her:
Const MinBruger As String = "USER1"
Sub auto_open()
Dim wb As Workbook Set wb = Workbooks.Open("c:\FælleFil.xls") Call hent_data_fra_inifil(MinBruger) ThisWorkbook.Close savechanges:=False
Jeg har nu afprøvet din fil bak - og den ser ud til at virke på Excel XP, men på Excel 2003 crasher den Excel totalt. Problemet er at flere af dem der skal bruge min applikation, allerede har skiftet til 2003, så jeg er nødt til at finde en løsning der kan løse det problem. Dit sidste forslag kan du kommentere i almindelig tale hvad den gør :-)
Jeg synes I skal deles om points da begge løsninger jo sådan set virker (bare ikke på 2003 :-( ) Jeg ender nok med at bruge bak's sidste forslag med en fælles opstartsfil.
Jeg fik nu mit forlag til at virke med en genvej (dvs. uden at bruge Start/Run/Kør eller hvad det nu hedder). Det vil sige at der under destination i genvejen står hele følgende smøre:
"C:\Programmer\Microsoft Office\Office\EXCEL.EXE" "D:\Documents and Settings\Administrator\Dokumenter\test.xls" /e/a/x/sds
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.