我正在尝试从Excel宏中选择的Outlook文件夹中生成电子邮件。
在下面的代码中,'TestDraft1'有效,在用户通过Namespace.PickFolder方法选择的文件夹中生成电子邮件。
但是,由于我想在同一个文件夹中生成许多电子邮件,我需要用户只能选择一次该文件夹。在下面的'TestDraft2'中,我尝试将文件夹保存为Object,然后将其传递给move函数。这会因“运行时错误13,类型不匹配”而失败。 'folder'变量给出类型“MAPIFolder”。
我在这里缺少什么?我分配给'文件夹'的对象与我传递给'Mailitem.move'的对象有何不同?
编辑请注意,我正在使用后期绑定,这就是我将变量定义为Objects的原因。我宁愿保持这种方式,因为我希望能够在没有特殊配置的情况下分发它。我真正想知道的是为什么第一个版本成功而第二个版本失败。更多细节:我的雇主使用Office 2007。
编辑2 问题与PickFolder返回的对象类型无关。这与我滥用VBA语法有关。我已经回答了下面的问题,我正在重命名它以更好地解决我真正要求的问题。原始标题是:使用PickFolder在Excel VBA中返回Outlook文件夹对象
Sub test()
Call TestDraft1("test@example.com", "test1") ' succeeds
Call TestDraft2("test@example.com", "test2") ' fails
End Sub
Sub TestDraft1(recip As String, subj As String)
Dim OlApp As Object
Dim NS As Object
Dim OlMail As Object
Set OlApp = CreateObject("Outlook.Application")
Set NS = OlApp.GetNamespace("MAPI")
Set OlMail = OlApp.createitem(0) 'olMailitem = 0
OlMail.Subject = subj
OlMail.Recipients.Add (recip)
OlMail.Move (NS.PickFolder) ' pass the results of the folder-picker directly
End Sub
Sub TestDraft2(recip As String, subj As String)
Dim OlApp As Object
Dim NS As Object
Dim folder As Object
Dim OlMail As Object
Set OlApp = CreateObject("Outlook.Application")
Set NS = OlApp.GetNamespace("MAPI")
Set folder = NS.PickFolder ' save the results of the folder-picker...
' MsgBox (TypeName(folder)) ' returns "MAPIFolder
Set OlMail = OlApp.createitem(0) 'olMailitem = 0
OlMail.Subject = subj
OlMail.Recipients.Add (recip)
OlMail.Move (folder) ' ... and use the saved results of the folder-picker -> runtime error
End Sub
答案 0 :(得分:2)
这显示了我对VBA语法的新态度。
更换:
OlMail.Move (folder)
与
OlMail.Move folder
修复了问题。
我相信这是正确的: MailItem.Move不返回任何结果,因此它使用非括号语法。
请参阅:http://msdn.microsoft.com/en-us/library/office/gg278645
因此,(文件夹)被解释为表达式,并在括号内返回文件夹名称的文本值。证据:
Dim testobj as Object
Set testobj = (folder) ' fails: Object required
Dim testvar as Variant
testvar = (folder)
MsgBox (VarType(testvar) = vbString) ' returns True
因此,虽然folder
是正确类型的对象,但(folder)
是一个计算结果为字符串的表达式。
答案 1 :(得分:0)
也许你在移动之前就错过了objmail.save。
您的定义肯定是个问题: 更改Sub的第一行,如下所示(未经测试):
Sub TestDraft2(recip As String, subj As String)
Dim olApp As Outlook.Application
Dim NS As Outlook.Namespace
Dim folder As Outlook.MAPIFolder
Dim OlMail As Outlook.mailitem
Set OlApp = CreateObject("Outlook.Application")
Set NS = OlApp.GetNamespace("MAPI")
Set folder = NS.PickFolder
这可能会有所帮助......