在excel中使用环境变量

时间:2016-09-01 13:32:43

标签: excel vba excel-vba batch-file

所以我在excel中使用此代码在启动时读取环境参数:

@Injectable()

export class TestService{
  constructor(){
    console.log('Service')  
  }

}

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

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

问题是,如果我运行批处理文件一次,保持excel打开,将excelargs更改为CREO,无论是批处理文件还是重新运行批处理文件,都不会更新!

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

链接有关将参数传递给excel的一些信息: https://superuser.com/questions/640359/bat-file-to-open-excel-with-parameters-spaces

2 个答案:

答案 0 :(得分:2)

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

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

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

在您的情况下,当您启动excel时,新进程会获得cmd进程的环境块的副本。稍后,当您更改cmd环境时,已经运行的excel实例看不到环境中的更改,并且由于打开excel的新请求被转换为对先前进程的请求,因此没有带有更改的cmd环境的新副本的新流程。

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

但这取决于excel版本。据我所知,2013版本包含一个/x开关,用于强制单独的进程使用。对于以前的版本,可能this questionthis one可以为您提供帮助。

答案 1 :(得分:0)

Excel已打开 Excel is open

然后我启动批处理脚本:

batch start

默认情况下它不会以只读方式打开它,而是提示我,不是一个大问题,而是有点烦人,而且它也无法循环运行批处理多次以获取不同的输入参数。< / p>

enter image description here

有点不确定我应该如何发布这个,无法在评论中粘贴图片,并编辑原始问题,这是如何在新实例中使用环境变量启动excel(/ x做了诀窍),但现在/ r不起作用,我应该发布新问题并参考这个问题,还是可以留下作为答案?