[英]VBA Runtime Error 13 Type Mismatch
我正在嘗試從 Excel 宏在選定的 Outlook 文件夾中生成電子郵件。
在下面的代碼中,“TestDraft1”起作用,通過用戶通過 Namespace.PickFolder 方法在用戶選擇的文件夾中生成電子郵件。
但是,由於我想在同一個文件夾中生成許多電子郵件,因此我需要用戶只能選擇該文件夾一次。 在下面的“TestDraft2”中,我嘗試將文件夾另存為對象,然后將其傳遞給移動函數。 失敗並顯示“運行時錯誤 13,類型不匹配”。 'folder' 變量給出了類型“MAPIFolder”。
我在這里缺少什么? 我分配給 'folder' 的對象與我傳遞給 'Mailitem.move' 的對象有何不同?
編輯請注意,我使用的是后期綁定,這就是我將變量定義為對象的原因。 我更願意保持這種方式,因為我希望能夠在沒有特殊配置的情況下分發它。 我真正想知道的是為什么第一個版本成功而第二個版本失敗。 更多詳細信息:我的雇主使用 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
這表明我對 VBA 語法是多么陌生。
更換:
OlMail.Move (folder)
和
OlMail.Move folder
解決了這個問題。
這就是我認為正在發生的事情: MailItem.Move 不返回任何結果,因此它使用非括號語法。
請參閱: http : //msdn.microsoft.com/en-us/library/office/gg278645
因此, (folder) 被解釋為一個表達式,並返回括號內文件夾名稱的文本值。 證據:
Dim testobj as Object
Set testobj = (folder) ' fails: Object required
Dim testvar as Variant
testvar = (folder)
MsgBox (VarType(testvar) = vbString) ' returns True
因此,雖然folder
是正確類型的對象,但(folder)
是一個計算結果為字符串的表達式。
也許您只是在移動它之前錯過了 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
那可以幫助...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.