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

Passing a File Path Variable from Batch to VBA

我先回答大家心中的第一个问题...

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

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

我的问题

我的问题是我附加的文件是由原始批处理程序生成的。因此,我需要将完整文件名(UNC 路径和文件名)作为单个字符串变量从批处理传递到 VBA 脚本(这意味着自从调用 VBA 宏后也通过 VBS 传递它来自批处理需要中间步骤——即批处理 -> 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 线程中提供的代码的第二部分。我刚刚添加了一个调试步骤,将字符串放在工作表上,所以我知道它是否有效(还有我的电子邮件代码,但显然只是拍了一张快照)。

错误信息

这并不能真正帮助确定它是 Batch -> VBS 代码还是 VBS -> VBA,但是当 Excel 启动时我得到一个编译器错误。错误信息:

Compile error: Object required

代码疑难解答

我在这台 PC 上没有 Visual Studio,所以我没有调试 VBS 脚本以查看 Batch 是否接受变量的好方法。因此,我不确定变量在哪里没有正确传递 - 第 1 步(批处理 -> VBS)或第 2 步(VBS -> VBA)。

如有任何帮助,我们将不胜感激!

如果您实施这些更改,您会得到什么?您应该看到从 Batch>VBS>VBA.

传递的值

你的批处理文件:

没有变化。

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

您的 VBS 文件:

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

添加显示 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 文件:

注释掉设置命令。

添加了用于诊断的消息框。

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