Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 在excel中使用环境变量_Vba_Excel_Batch File - Fatal编程技术网

Vba 在excel中使用环境变量

Vba 在excel中使用环境变量,vba,excel,batch-file,Vba,Excel,Batch File,因此,我在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") The

因此,我在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
问题是,如果我只运行一次批处理文件,请保持excel打开,在批处理文件中将excelargs更改为CREO,wqhatever,然后重新运行批处理文件excelargs,dos不会得到更新

因此,我的理论是excel要么缓存掉环境变量,要么如果一个实例正在使用它,批处理脚本无法设置它

链接有关向excel传递参数的一些信息:

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

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

这有什么不同?环境变量不共享。每个进程都有自己的环境块,在创建进程时初始化环境块(可以是自定义块或父进程环境的副本),并且为进程创建环境后,只有此进程才能更改其环境

在您的情况下,当启动
excel
时,新进程将获得
cmd
进程的环境块的副本。稍后,当您更改
cmd
环境时,已经运行的
excel
实例在环境中看不到任何更改,并且,当打开excel的新请求转换为对上一个进程的请求时,不会有一个新的进程具有带有更改的
cmd
环境的新副本

我认为使其工作的唯一方法是强制excel启动一个新流程(该流程将继承
cmd
实例中的更改),而不是重用以前的流程

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

Excel已打开

然后启动批处理脚本:

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

默认情况下,它不会以只读方式打开它,而是会提示我,这不是一个大问题,但有点烦人,而且它还使得无法针对不同的输入参数循环多次运行批处理


我有点不确定该如何发布此内容,无法将图像粘贴到注释中,并编辑原始问题,即如何在新实例中使用环境变量启动excel(/x完成了此操作),但现在/r不起作用,我应该以新问题的形式发布并引用此问题,还是可以将其作为答案?

如果您从批处理文件中复制了hier中的代码,请让我告诉您,在您的
set
-指令后缺少双引号。有了这些,很多东西都会被视为字符串,而它们本不应该是字符串,也不应该是字符串。这几乎肯定与批处理文件中环境变量的范围有关。这可能是一个很好的起点。只要看看您的整体设计,就可以找到一个解决方案,我想知道您为什么要单独传递参数。您是否可以只发送一次逗号分隔的项目的完整列表,并在
拆分
数组中处理所有项目?或者这个例子是简化的/人为的来举例说明这个问题,所以你的总体设计依赖于这种行为,这样的解决方法是不可能的?你能试试
…\excel.exe/x/r“…
?这样shift/x就行了!但是如果我已经打开了personal.xlsb(即运行excel的一个实例)然后,如果我想取消或以只读方式打开此问题框,是否可以使用开关来避免此问题?/x/r因某些原因不起作用:(交换机的顺序重要吗?@skatun,我已经用
.xlsx
.xlsb
文件在本地和网络驱动器中进行了测试,
/x/r
/r/x
,文件关闭,或者已经以写或只读方式打开。对我来说,第二个请求在单独的进程中以只读模式打开文件在所有情况下都有效。我无法重现您的问题。@skatun,对不起,可能是我没有正确解释。我知道您的错误是什么(可能是任何在网络环境中使用excel的人)。但我无法重现您的问题。正如我指出的,我已经在我的环境中测试了所有组合,我不能让它失败。对我来说,它是有效的。