在Excel中使用环境variables

所以我在Excel中使用这个代码来读取启动时的环境参数:

Dim ExcelArgs As String Dim arg As String ExcelArgs = Environ("ExcelArgs") MsgBox ExcelArgs If InStr(UCase(ExcelArgs), "CREO") >= 0 Then Application.DisplayAlerts = False If Len(ExcelArgs) > Len("CREO") Then arg = Split(ExcelArgs, ",")(1) Call Creo.addNewPartToPartslist(arg) End If Application.DisplayAlerts = True End If 

和我的批处理脚本中的这一行:

 echo "Launch excel" Set "ExcelArgs=CREO,DXFWITHOUTDRW "C:\Program Files (x86)\Microsoft Office\OFFICE16\Excel.exe" /r "%APPDATA%\Microsoft\Excel\XLSTART\PERSONAL.XLSB" exit 0 

问题是,如果我运行一次batch file,请保持excel打开将excelargs更改为CREO,无论在batch file和重新运行batch file的excelargs,DOS不会更新!

所以我的理论是,Excel或者caching环境variables,或者如果它被一个实例使用,批处理脚本不能设置它

链接与关于传递parameter passing给Excel的一些信息: https : //superuser.com/questions/640359/bat-file-to-open-excel-with-parameters-spaces

通常,excel会查看是否有前一个实例正在运行,并让此实例处理文件打开。

这很重要吗? 是的,在你的情况下,两个打开文件的请求都由同一个excel进程处理。

它是如何起作用的? 环境variables不共享。 每个进程都有自己的环境块,在创build进程时可以进行初始化(可以是自定义块或父进程环境的副本),一旦为进程创build了环境,只有该进程可以更改其环境。

在你的情况下,当你启动excel的时候,新进程获得了cmd进程的环境块的一个副本。 后来,在更改cmd环境时,已经运行的excel实例在环境excel不到任何更改,并且,由于新的打开excel的请求被转换为对前一个进程的请求,因此没有新的进程cmd环境的变化。

我看到使它工作的唯一方法是强制excel开始一个新的进程(这将inheritancecmd实例中的更改),而不是重复使用前一个。

但是这取决于excel版本。 据我所知,2013版本包含一个/x开关来强制单独的进程使用。 对于以前的版本,也许这个问题 ,或者这个可以帮助你。

Excel是开放的 Excel是开放的

然后我开始批处理脚本:

批量启动

它不会打开它作为默认只读,但提示我,而不是一个大问题,但有点烦人,它也使得不可能循环运行批次几次不同的input参数。

在这里输入图像说明

有点不确定我应该如何发布这个,不能粘贴图像的评论,并编辑原来的问题,这是如何在新实例环境variables启动Excel(/ X做了诡计),但现在/ R不起作用,我应该作为新的问题发布,并参考这一个或我可以离开它作为一个答案?