2015-04-06 110 views
1

這裏有很多關於此問題的問題已得到解答,但我一直未能找到任何與我的情況相關的問題。由於我是VBA的新手,我確信這很簡單,我錯過了。我甚至通過這裏的步驟運行,以確保我(對我來說3.6)訪問DAO:構建VBA宏時的運行時錯誤'424'

http://support.microsoft.com/en-us/kb/163475

有人可以幫我找出與我下面的VBA腳本的問題呢?

我試圖從電子郵件的主題行中刪除一些無用的文本,因爲它進入我的收件箱。需要注意的是這個主題的項目將在各種重要的子文件夾在我的收件箱中的情況下降落:

Sub ChangeSubject() 

If Left(Item.subject, 31) = "Your Work Item Changed: " Then 
Item.subject = Right(Item.subject, Len(Item.subject - 31)) 
End If 

End Sub 

試圖從運行時錯誤「424」消息VBA編輯器運行結果這一點。請注意,我位於Windows上的Outlook 2013中。

+0

將'Option Explicit'作爲代碼模塊的第一行,修復任何錯誤,然後查看剩下的內容。 – GSerg

+2

GSerg也可能指的是,它不知道「Item」是什麼。您可能需要將Item作爲參數傳遞給Sub或從某處獲取它。你可以找到一些代碼,只要有電子郵件進入(這不是當前的),就會使這個事件成爲事件,然後你可以使用該代碼訪問該項目。 – OpiesDad

+0

「Your Work Item Changed:」的文字長度爲24個字符,所以目前還不清楚爲什麼它與主題的前31個字符相比 – barrowc

回答

0

下面是代碼來查看我引用的新項目。

Private Sub Items_ItemAdd(ByVal Item As Object) 

     On Error GoTo ErrorHandler 
     Dim Msg As Outlook.MailItem 
     Dim emailSubject As String 

     If TypeOf Item Is MailItem Then 
      Set Msg = Item 
      emailSubject = Msg.Subject 
      'put additional code here 
     End If 

ErrorHandler: 
    MsgBox Err.Number & " - " & Err.Description 
End Sub 

*根據GSerg的評論編輯MailItem檢查。

+0

'如果TypeName(Item)=「MailItem」' - >'如果TypeOf Item是MailItem' – GSerg

+0

@GSerg我猜你的代碼的重點是速度優化? – OpiesDad

+0

這樣,編譯器會告訴你是否拼錯了MailItem,並且如果有人傳遞了一個名爲MailItem的自定義對象,這個自定義對象與Outlook的MailItem無關,它不會給出錯誤的肯定。第二個想法是,如果你的目標是使用遲綁定(否則爲什麼'As Object'?),那麼你應該保留'TypeName'。 – GSerg

0

目前還不清楚在Outlook中處理新郵件的事件是什麼。反正,我可以建議通過以下方式來完成這項工作:

  1. 在Outlook中創建一個規則可以運行VBA宏在那裏你可以更改主題行。沒有必要以編程方式檢查每個收到的郵件。只有當收到的電子郵件滿足您的條件時纔會調用VBA宏。宏子應該看起來像下面這樣:

    public sub text(mail as MailItem) 
        ' do whatever you need 
    end sub 
    

    郵件對象代表傳入電子郵件。

  2. 處理收件箱中收到新項目時觸發的Application類的NewMailEx事件。 NewMailEx事件在新郵件到達收件箱時以及發生客戶端規則處理之前觸發。您可以使用EntryIDCollection數組中返回的Entry ID調用NameSpace.GetItemFromID方法並處理該項目。請謹慎使用此方法,以儘量減少對Outlook性能的影響。但是,根據客戶端計算機上的設置,新郵件到達收件箱後,像垃圾郵件過濾和客戶端規則這樣的過程將新郵件從收件箱移動到另一個文件夾可能會異步發生。您不應該認爲在這些事件觸發後,收件箱中的項目數量總會增加一個項目。

ItemAdd也可以使用。但是,如果多個項目同時添加(超過16個),它不會被解僱。