Как сослаться на элемент, который запускает 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 = "[email protected]"
        .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 = "[email protected]"
        .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?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
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

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