Как сослаться на элемент, который запускает ItemAdd?

Я пытаюсь отправить сообщение на свой телефон, когда получаю почту на работе.

Макрос должен отправлять почту в службу смс, которая преобразует почту в смс и отправляет ее на мой телефон. Сообщение будет содержать адрес отправителя почты и время отправки и получения.

Я собрал два макроса, которые нашел в Интернете.

Первый код находится по этой ссылке tachytelic.net

Второй я нашел здесь stackoverflow.com

Вот часть кода, которая не работает.

'variable for select case
Dim EmailFrom As String
Dim OldMessage As Outlook.MailItem

Set OldMessage = Application.ActiveInspector.CurrentItem

'Puts sender mail address in variable both ordinary mail and Exchange emails.
Select Case OldMessage.SenderEmailType
    Case "EX"
       EmailFrom = OldMessage.Sender.GetExchangeUser.PrimarySmtpAddress
    Case Else
       EmailFrom = OldMessage.SenderEmailAddress
End Select

'Sends E-mail to sms service.
If TypeName(Item) = "MailItem" Then
    With olEmail
        .BodyFormat = olFormatPlain
        .To = "some@mail.com"
        .Subject = "You got a new E-mail!"
        .Body = EmailFrom & vbCrLf & "Sendt: " & Item.SentOn & vbCrLf & "Modtaget: " & Item.ReceivedTime
        .Send
    End With
End If

я получил

runtime error 91 - Object variable or With block variable not set.

Я пытался использовать клавишу F8, но это невозможно, не знаю почему.

Затем я взял исходный код и вставил его в модуль. Затем я могу использовать клавишу F8, чтобы просмотреть код.

Ошибка возникает, когда я дохожу до этой строки.

Set OldMessage = Application.ActiveInspector.CurrentItem

Вот весь код

Option Explicit
Private WithEvents inboxItems As Outlook.Items
Sub Application_Startup()
  Dim outlookApp As Outlook.Application
  Dim objectNS As Outlook.NameSpace
  
  Set outlookApp = Outlook.Application
  Set objectNS = outlookApp.GetNamespace("MAPI")
  Set inboxItems = objectNS.GetDefaultFolder(olFolderInbox).Items
End Sub

Sub inboxItems_ItemAdd(ByVal Item As Object)

On Error GoTo ErrorHandler

'variable for if statments
Dim olApp As Outlook.Application
Dim olEmail As Outlook.MailItem

Set olApp = New Outlook.Application
Set olEmail = olApp.CreateItem(olMailItem)

'variable for select case
Dim EmailFrom As String
Dim OldMessage As Outlook.MailItem

'Deletes sms status mails I recieve when I mail to sms service
If InStr(Item.Subject, "SMS status") > 0 Then
    Item.UnRead = False
    Item.Save
    Item.Delete
    End
End If

'Puts sender mail address in variable both ordinary mail and Exchange emails.
Select Case OldMessage.SenderEmailType
    Case "EX"
       EmailFrom = OldMessage.Sender.GetExchangeUser.PrimarySmtpAddress
    Case Else
       EmailFrom = OldMessage.SenderEmailAddress
End Select

'Sends E-mail to sms service.
If TypeName(Item) = "MailItem" Then
    With olEmail
        .BodyFormat = olFormatPlain
        .To = "some@mail.com"
        .Subject = "You got a new E-mail!"
        .Body = EmailFrom & vbCrLf & "Sendt: " & Item.SentOn & vbCrLf & "Modtaget: " & Item.ReceivedTime
        .Send
    End With
End If

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

Тогда легче получить обзор.

Как заставить ActiveInspector просматривать полученную почту и сохранять ее в OldMessage?

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
0
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если нет никакого открытого окна элемента, ActiveInspector будет Nothing. Кроме того, исходя из предоставленного вами примера кода, переменная Item нигде не объявлена ​​и не установлена, поэтому вы, вероятно, также получите сообщение об ошибке в этой строке:

If TypeName(Item) = "MailItem" Then

Но если я закомментирую случай выбора и переменные к нему. код отлично работает с переменной Item. Когда я получаю электронное письмо, я получаю смс, в котором говорится, что «у вас есть новое время отправки / получения почты», поэтому я добавил выбор регистра, чтобы видеть, от кого оно.

lfdk 23.05.2019 08:17

Переменная Item объявлена ​​в «Sub inboxItems_ItemAdd (ByVal Item As Object)».

lfdk 23.05.2019 13:07

Спасибо за обновленный код. Теперь ясно, что вы удаляете электронное письмо, которое передается как параметр Item в событии ItemAdd, и вы вообще ничего не устанавливаете для переменной OldMessage. ActiveInspector бесполезен - он только для открытых элементов. Электронная почта, добавляемая в эту папку, не открывается.

Eric Legault 24.05.2019 05:11

Извините моя ошибка. Я случайно удалил строку кода, которая вызывает проблему. Под «Dim OldMessage As Outlook.MailItem» не должно было быть «Set OldMessage = Application.ActiveInspector.CurrentItem». Что вы имеете в виду, что я удаляю почту, которая передается как Item. Я удаляю элемент только в том случае, если он содержит «Статус SMS» в строке темы. Но как мне получить Item. Я попытался сделать «Dim olType As Outlook.MailItem» и «Set olType = Item.ActiveInspector.CurrentItem», вставленный в OldMessage. Затем я получаю эту ошибку 438 - Объект не поддерживает это свойство или метод.

lfdk 24.05.2019 13:25

У вас уже есть доступ к объекту Item — вы даже читаете его свойства. Если вы хотите привести это к переменной MailItem, просто добавьте «Set OldMessage = Item». Опять же, вы НЕ МОЖЕТЕ ИСПОЛЬЗОВАТЬ ActiveInspector — элемент НЕ открыт в своем собственном окне инспектора.

Eric Legault 24.05.2019 19:52

Эрик Лего Спасибо за вашу помощь и время. Теперь это работает.

lfdk 28.05.2019 08:44

Привет еще раз Эрик. Что делать, если я хочу проверять почту не только во входящих, но и во вложенных папках.

lfdk 28.05.2019 08:54

Создайте другой обработчик событий для события Items.ItemAdd для коллекции Items этой папки.

Eric Legault 28.05.2019 16:14

Другие вопросы по теме