VBA运行时错误13types不匹配

我正尝试从Excelmacros中select的Outlook文件夹中生成电子邮件。

在下面的代码中,“TestDraft1”工作,在用户通过Namespace.PickFolder方法select的文件夹中生成一个电子邮件。

但是,由于我想在同一个文件夹中生成许多电子邮件,我需要用户只能select一次文件夹。 在下面的“TestDraft2”中,我尝试将文件夹保存为对象,然后将其传递给移动function。 这会因“运行时错误13,types不匹配”而失败。 “文件夹”variables给出types“MAPIFolder”。

我在这里错过了什么? 我分配给“文件夹”的对象与我传​​递给“Mailitem.move”的对象有何不同?

编辑请注意,我使用迟绑定,这就是为什么我定义我的variables作为对象。 我宁愿保持这种方式,因为我希望能够分发它没有特别的configuration。 我真正想知道的是为什么第一个版本成功,而第二个版本失败。 更多细节:我的雇主使用Office 2007。

编辑2这个问题与PickFolder返回的对象的types无关。 这与我滥用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 

这显示了我如何新的VBA语法。

更换:

 OlMail.Move (folder) 

 OlMail.Move folder 

解决了这个问题。

这是我所相信的: MailItem.Move不返回结果,所以它使用非括号语法。

请参阅: http : //msdn.microsoft.com/en-us/library/office/gg278645

因此,(文件夹)被解释为一个expression式,并返回括号内文件夹名称的文本值。 证据:

 Dim testobj as Object Set testobj = (folder) ' fails: Object required Dim testvar as Variant testvar = (folder) MsgBox (VarType(testvar) = vbString) ' returns True 

所以,虽然folder是正确types的对象, (folder)是一个expression式,它是一个string。

也许你只是在移动它之前错过了objmail.save。

和你的定义是肯定的问题:改变你的Sub的第一行如下(未经testing):

 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 

这可以帮助…