Ошибка в Application_ItemSend с использованием .To при отправке приглашения: объект не поддерживает это свойство или метод - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь заблокировать отправку писем в определенную группу.

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)

    Dim prompt As String
    Dim GROUP1 As String
    Dim GROUP2 As String

    GROUP1 = "GROUP of People"
    GROUP2 = "personx@yahoo.com"

    If InStr(Item.To, GROUP1) > 0 Or InStr(Item.To, GROUP2) Then
        prompt = "This Email is sent to the wrong person/Groups in .To"
        MsgBox (prompt)
        Cancel = True
    End If

    If InStr(Item.CC, GROUP1) > 0 Or InStr(Item.CC, GROUP2) Then
        prompt = "This Email is sent to the wrong person/Groups in .Cc"
        MsgBox (prompt)
        Cancel = True
    End If

End Sub

Это приводит к ошибке при отправке приглашения через календарь Outlook.

Номер ошибки: 438 «объект не поддерживает это свойство или метод»

Ошибка в строке: If InStr(Item.To, GROUP1) > 0 Or InStr(Item.To, GROUP2) Then

Как это исправить?

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Сама ошибка означает, что свойство .To недопустимо для Item при отправке приглашения.

Это потому, что при отправке приглашения Object, используемый для Item, равен olAppointmentItem (что отличается от olMailItem, используемого при отправке электронного письма).

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

If TypeName(Item) = "your desired type" Then
    'your code to check the recipients here
End If

Если у вас разные коды в зависимости от типа Item, вы можете использовать переключатель:

Select Case TypeName(Item)
    Case "Outlook.MailItem":
        'check .To
    Case "Outlook.AppointmentItem":
        'check .Recipients
   'etc.
End Select

Чтобы получить точные типы, я предлагаю вам установить точку останова в вашем коде, а затем использовать непосредственное окно для печати Debug.Print TypeName(Item) поверх ваших различных вариантов использования. Обратите внимание, что с решением Select вы также можете использовать оператор Case Else (где вы попадете, если встретится какой-либо из предыдущих Case), где вы просто вызовете «необработанное исключение» или что бы вы ни делали как делать, когда вы не знаете, как обращаться с указанным типом объекта.

0 голосов
/ 12 марта 2019

В дополнение к ответу @Matteo NNZ, параметр Cancel должен быть объявлен ByRef:

Private Sub Application_ItemSend(ByVal Item As Object, ByRef Cancel As Boolean)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...