让我先回答每个人的第一个问题......
为什么要使用批处理来调用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)。
非常感谢任何帮助!
答案 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