【问题标题】:Passing a File Path Variable from Batch to VBA将文件路径变量从批处理传递到 VBA
【发布时间】:2016-01-19 20:22:07
【问题描述】:

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

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

我目前有一个非常复杂的批处理,其中包括监视文件夹触发器、文件转换步骤、文件存档步骤、基于特定步骤的电子邮件触发器等的多个第 3 方软件的调用。由于此批处理脚本已经调用另外两封通过 Batch -> 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(Batch -> VBS)或步骤 2(VBS -> VBA)。

任何帮助将不胜感激!

【问题讨论】:

  • Excel 带有内置调试器,前提是安装了宏编辑器。有关 VBScript 调试,请参阅here。第一步是使用MsgBox 来显示相关变量的值。至于您的错误信息:请显示完整的错误信息,包括错误号。哪一行引发了错误?对于调试,我还建议设置 xlApp.DisplayAlerts = TruexlApp.Visible = True
  • 声明Set placementAttachement = t 可能是问题所在。 Set 只能用作对象;您正在将其与字符串一起使用。请改用placementAttachement = t

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


【解决方案1】:

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

您的批处理文件:

没有变化。

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

您的 VBS 文件:

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

添加一个显示附件全名值的 msgbox(用于测试)。

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 文件:

注释掉设置的命令。

添加了一个用于诊断的 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

【讨论】:

  • 太棒了,经过一点点调整后,我就可以使用我当前的电子邮件自动化代码了 - 谢谢@RLH! (也像使用 msgbox 进行 vbs 调试)。
  • @TMY,最好发布固定代码,以便其他人在查看相同问题时可以看到它。
  • 您上面的代码有效/是解决方案(以防其他人遇到此问题)。我的调整只是基于更改伪变量名称和路径以将您的代码合并到我现有的代码中,然后删除调试 msgbox,以便该过程可以在没有人为干预的情况下运行。
猜你喜欢
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
相关资源
最近更新 更多