我需要访问 Excel VBA 宏中的命令行参数,并发现了许多变体,但只有一个与 Excel-2010 一起使用,似乎 API 随着时间的推移而发生了变化。我尝试了我在“外面”找到的这段代码:
Dim pCmdLine As Long ' Pointer to the Comand-line string
Dim strCmdLine As String ' Command line string
Dim CmdLine As String ' Command line string
' Get the pointer to the command line string
pCmdLine = GetCommandLineA
' Fill the string with zeros
' (300 characters for command line seems to be enough)
strCmdLine = String$(300, vbNullChar)
' Copy from the pointer to VBA-style string
lstrcpynA strCmdLine, pCmdLine, Len(strCmdLine)
' At this point we got the string,
' now skip the rest of it filled with 0 characters.
CmdLine = Left(strCmdLine, InStr(1, strCmdLine, vbNullChar) - 1)
MsgBox "Length of the command line = " & Len(CmdLine) '' Debug
MsgBox "Command Line:: " & CmdLine '' Debug
我将其放入电子表格的 Auto_open 宏中。如果我尝试这个电话:
start excel TestMacro.xlsm /e/abcd/xyz
它似乎通常有效并且宏观报告:
Command line = " C:/.../excel.exe TestMacro.xlsm"
所以我得到了调用部分,但是参数丢失了。
部分解决方案: 我发现如果我将调用更改为:
start excel /e/abcd/xyz TestMacro.xlsm
它可以工作,除了必须更改解析代码以忽略不在末尾的文件名,而且这种形式似乎不允许任何参数中的任何空格,即使引用。系统似乎将它们解释为目标 excel 文件的文件名并给出错误。例如:
start excel /e/abc/"my sheet"/ TestMacro.xlsm
给出错误:
file 'sheet"/.xlsx' not found
尽管在虚假启动错误之后,预期的工作表确实打开并让整条生产线都可以使用。