2015-04-06 4 views
1

Есть несколько вопросов об этом здесь, на которые были получены ответы, но я не смог найти никого из них, имеющего отношение к моей ситуации. Поскольку я новичок в VBA, я уверен, что это нечто простое, чего мне не хватает. Я даже побежал через шаги здесь, чтобы убедиться, что я имел доступ к DAO (3.6 в моем случае):Ошибка во время выполнения '424' при создании макроса VBA

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 

Попытка запустить это из результатов редактора VBA в ошибке времени выполнения «424» сообщения. Обратите внимание, что я нахожусь в Outlook 2013 на Windows.

+0

Поместите «Option Explicit» в первую строку вашего модуля кода, исправьте все ошибки и посмотрите, что осталось. – GSerg

+2

Проблема, о которой, вероятно, касается GSerg, заключается в том, что она не знает, что такое «Item». Вам либо нужно передать элемент в качестве параметра в подпрограмму, либо получить его откуда-то. Вы можете найти код, который сделает это событие всякий раз, когда приходит электронное письмо (в настоящее время оно отсутствует), а затем вы можете получить доступ к элементу с помощью этого кода. – OpiesDad

+0

Текст «Ваш рабочий элемент изменен:» имеет длину 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 

* Отредактированная проверка MailItem на комментарии GSerg.

+0

'Если TypeName (Item) =" MailItem "' -> 'Если ItemOf Item Is MailItem' – GSerg

+0

@GSerg Я предполагаю, что точка вашего кода - это оптимизация скорости? – OpiesDad

+0

Это, а также компилятор скажет вам, если вы пропустите «MailItem», и он не даст ложных положительных результатов, если кто-то передает пользовательский объект с именем «MailItem», который не связан с «MailItem» Outlook. С другой стороны, если ваша цель заключалась в использовании позднего связывания (в противном случае, почему «как объект»?), Вы должны сохранить 'TypeName'. – GSerg

0

Неясно, какое событие используется для обработки новых почтовых отправлений в Outlook. Во всяком случае, я могу предложить следующие способы получить работу:

  1. Создать правило в Outlook, который может запустить макрос VBA, где вы можете изменить сюжетную линию. Нет необходимости проверять каждый входящий почтовый элемент программно. Макрос VBA будет вызываться только в том случае, если входящая электронная почта удовлетворяет вашим условиям. И макрос должен выглядеть следующим образом:

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

    Если почтовый объект представляет входящее письмо.

  2. Обращение с событием класса NewMailEx класса Приложения, которое запускается при получении нового элемента в папке «Входящие». Событие NewMailEx запускается, когда новое сообщение приходит в папку «Входящие» и до обработки правила клиента. Вы можете использовать идентификатор записи, возвращаемый в массиве EntryIDCollection, для вызова метода NameSpace.GetItemFromID и обработки элемента. Используйте этот метод с осторожностью, чтобы свести к минимуму влияние на производительность Outlook. Однако в зависимости от настройки на клиентском компьютере после поступления нового сообщения в папку «Входящие» процессы, такие как фильтрация спама и правила клиента, которые перемещают новое сообщение из папки «Входящие» в другую папку, могут выполняться асинхронно. Вы не должны предполагать, что после этих событий вы всегда будете увеличивать количество элементов в папке «Входящие» на один элемент.

Элемент ItemAdd также может использоваться. Но он не запускается, если одновременно добавляется несколько элементов (более 16).