【发布时间】:2018-02-13 05:32:09
【问题描述】:
调试以下代码时遇到问题。
我正在尝试自动化宏以根据命名范围发送多个附件。
Sub Test()
Dim objol As New Outlook.Application, objMail As MailItem
Dim MyArr As Variant, i As Long
Set objol = New Outlook.Application
Set objMail = objol.CreateItem(olMailItem)
With objMail
MyArr = Sheets("Sheet1").Range("A2:A9").Value
.To = ("test@test.com")
.Subject = "Test"
.Body = ""
.NoAging = True
For i = LBound(MyArr) To UBound(MyArr)
If Dir(MyArr(i, 1), vbNormal) <> "" Then .Attachments.Add MyArr(i, 1)
Next i
.Display
End With
End Sub
在我正在测试的示例中,我在范围内只有两个输入(分别在单元格 A2 和 A3 中的“Sheet2”和“Sheet3”)。似乎代码在i=3 处起作用,该行为空白。但我需要这样才能好。由于它所指的列已设置 (A2:A9),因此用户输入他们想要通过电子邮件在工作簿中找到的工作表的名称。有时用户可以输入 2 个名称或 3 个名称 - 最多为 A9。如果范围中有空白,我只需要代码来结束循环,并发送范围中已经定义的附件。
到目前为止,它一直给我一个类型不匹配的错误? (类型不匹配发生在If Dir(MyArr(i, 1), vbNormal) <> "" Then .Attachments.Add MyArr(i, 1)
编辑 - 由于Dir 也可能是一个问题 - 范围内的值是工作表名称,因此 Sheet1、Sheet2
【问题讨论】:
-
这里发生了两件事:1) 如果
A2:A9中的值实际上是only 工作表名称Dir将不起作用,.Attachments.Add也不会,因为它们都需要一个有效的文件路径名。 2) 例如,要在单元格为空白时退出循环,您可以写If myArr(i,1) = vbNullString。还有其他方法可以做到这一点,包括循环遍历范围本身。数据集太小了,在这种情况下没有真正的区别。 -
感谢@ScottHoltzman 的回复 - 为什么
Attachments.Add不接受工作表名称?可以这样工作吗:Set rRange = Sheets("Sheet1").Range("A2:A9") For Each rcell In rRange If rcell.Value <> "" Then Sheets(rcell.Value).Copy End If Debug.Print rcell.Value -
如果您设置了一个对象,您必须在完成后再次将其设置为 Nothing。