簡體   English   中英

VBA 運行時錯誤 13 類型不匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM