将文件路径变量从批处理传递到 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
我先回答大家心中的第一个问题...
为什么要使用批处理调用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