【发布时间】: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 = True和xlApp.Visible = True。 -
声明
Set placementAttachement = t可能是问题所在。Set只能用作对象;您正在将其与字符串一起使用。请改用placementAttachement = t。
标签: excel vba batch-file vbscript environment-variables