将文件路径变量从批处理传递到VBA

时间:2016-01-19 20:22:07

标签: excel-vba batch-file vbscript arguments environment-variables

让我先回答每个人的第一个问题......

为什么要使用批处理来调用VBA宏?

我目前有一个非常复杂的批处理,其中包括监视文件夹触发器,用于文件转换步骤的多个第三方软件调用,文件存档步骤,基于特定步骤的电子邮件触发器等。由于此批处理脚本已调用通过批处理的另外两封电子邮件 - > VBS - > Excel VBA程序,我想继续这个过程,以便我可以重用代码。 (当前的VBA代码也可以轻松添加附件。)

我的问题

我的问题是我附加的文件是由原始批处理程序生成的。因此,我需要将完整的文件名(UNC路径和文件名)作为单个字符串变量从批处理传递到VBA脚本(这意味着还要通过VBS传递它,因为从批处理调用VBA宏需要中间步骤 - - 即批处理 - > VBS - > VBA - >我的电子邮件)。

我的代码

从Batch传递变量 - > VBS

set ArchiveFullName=\\myArchivePath\myFile.rtf
cscript //NoLogo "\\myEmailAutomationFolder\myEmailAutomation.vbs"  /attachment:"%AttachmentFullName%"

**使用这种方法的想法' cscript' (从代码的第3行开始)将变量从Batch传递到VBS来自:Pass variable from Batch to VBS

将变量从VBS传递到VBA

  Dim xlApp 
  Dim xlBook 
  Dim attachmentFullName
  attachmentFullName = WScript.Arguments.Named("attachment")

  Set xlApp = CreateObject("Excel.Application") 
  Set xlBook = xlApp.Workbooks.Open("\\myPath\EmailAutomation.xlsm", 0, True) 

  xlApp.DisplayAlerts = False
  xlApp.Run "Email_Received_Files", Cstr(attachmentFullName)
  xlApp.Quit 

  Set xlBook = Nothing 
  Set xlApp = Nothing 

End Sub 

**此代码的大部分可用,因为它是我用于其他两个自动电子邮件的代码。但是,第3,4和10行是从VBS收​​集变量并尝试从VBA传递的内容。这些建议基于以下建议:Pass Argument from VBS to VBA

在VBA中接受变量

Sub Email_Received_Files(t As String)
    Dim placementAttachment As String

    'Grab attachment path from .vbs (which grabbed it from .bat)
    Set placementAttachement = t
    Set Range(C6) = placementAttachement
End Sub

上面的代码只是VBS中提供的代码的第二部分 - > VBA线程先前已链接。我刚刚添加了一个调试步骤,将字符串放在工作表上,以便我知道它是否有效(还有我的电子邮件代码,但显然只拍了快照)。

错误消息

这不是真的有助于确定它的批次 - > VBS代码或VBS - > VBA,但是当Excel开始时我得到了编译器错误。错误消息:

  

编译错误:需要对象

对代码进行疑难解答

我没有在这台PC上安装Visual Studio,因此我没有一个很好的方法来调试VBS脚本以查看是否正在从Batch接受该变量。因此,我不确定变量未正确传递的位置 - 步骤1(批处理 - > VBS)或步骤2(VBS - > VBA)。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

如果实施这些更改,您会得到什么?您应该看到值从批处理> VBS> VBA传递。

您的批处理文件:

没有变化。

set ArchiveFullName=\\myArchivePath\myFile.rtf
cscript //NoLogo "\\myEmailAutomationFolder\myEmailAutomation.vbs"  /attachment:"%AttachmentFullName%"

您的VBS文件:

注释掉Exit Sub,因为没有子声明。

添加一个msgbox,显示attachmentFullName的值(用于测试)。

Dim xlApp 
Dim xlBook 
Dim attachmentFullName
attachmentFullName = WScript.Arguments.Named("attachment")
msgbox attachmentFullName,vbokonly,"Variable value in VBS"        'added this

Set xlApp = CreateObject("Excel.Application") 
Set xlBook = xlApp.Workbooks.Open("\\myPath\EmailAutomation.xlsm", 0, True) 

xlApp.DisplayAlerts = False
xlApp.Run "Email_Received_Files", Cstr(attachmentFullName)
xlApp.Quit 

Set xlBook = Nothing 
Set xlApp = Nothing 
'Exit Sub                         'removed this

您的VBA文件:

注释掉set命令。

添加了一个用于诊断的msgbox。

Sub Email_Received_Files(t As String)
    Dim placementAttachment As String
    msgbox t,vbokonly,"Variable value in VBA"

    'Grab attachment path from .vbs (which grabbed it from .bat)
    'Set placementAttachement = t
    'Set Range(C6) = placementAttachement
End Sub

在注释掉的set行上,它们需要一个对象。 ' t'行只需要删除集合。它只是一个字符串。 placementAttachement = t

Set Range行上,如果您尝试将文件路径存储在单元格C6中,则只需丢失placementAttachement变量并直接从传递的值设置它。

Range("C6").Value = T