2015-04-06 114 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个),它不会被解雇。