Синтаксис CallByName Outlook VBA

Я пишу код в MS Outlook для обработки входящих писем.

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

Затем, основываясь на результате этого условного оператора, предполагается, что код считывает соответствующее свойство объекта MailItem.

Я хочу использовать функцию CallByName для достижения этой цели.

x = CallByName(itm, PAN_Source, VbGet)

Где "itm" - это объект MailItem, переменная "PAN_Source" содержит строку, которая ссылается на конкретное свойство из "itm".

Например, если входящее письмо имеет вложение, то для PAN_Source присваивается значение "Attachments.Item(1).DisplayName". Я хочу, чтобы CallByName(itm, PAN_Source, VbGet) возвращал itm.Attachments.Item (1).DisplayName

Outlook VBA просто останавливает выполнение на этом этапе выполнения.

Можете ли вы помочь в выявлении ошибки в приведенном выше коде?

Спасибо

1 ответ

Я знаю, что это старый вопрос, но для правильности: CallByName VBA не принимает строку как

"Имя объекта, на котором будет выполняться функция".

Кое-где пример MSDN искажен до заведомо неправильного. Это должен быть объект per si. Итак, вместо:

Call CallByName("itm", PAN_Source, VbGet)

Сделай это:

Call CallByName(itm, "NameMethodThatUsesString_PAN_Source" , VbGet, PAN_Source)

PAN_Source должен быть предоставлен в необязательном Args().

В качестве бонуса, если он возвращает что-то как функцию (vbMethod), получите это с помощью Variant:

auxVar = CallByName (itm, "NameMethodThatUsesString_PAN_Source" , VbGet, PAN_Source)

Я использую его в основном для перебора некоторых коллекций в SortIt() или получения значений - или и того, и другого - через свойство Get или Set в алгоритме сортировки, например:

 ...

        If IsMissing(CallByNameArg0) Then
            If VarType(CallByName(this, SortPropertyName, VbGet)) = vbObject Then
                Set thisValue = CallByName(this, SortPropertyName, VbGet)
            Else
                thisValue = CallByName(this, SortPropertyName, VbGet)
            End If
        Else
            If VarType(CallByName(this, SortPropertyName, VbGet)) = vbObject Then
                Set thisValue = CallByName(this, SortPropertyName, VbGet, CallByNameArg0)
            Else
                thisValue = CallByName(this, SortPropertyName, VbGet, CallByNameArg0)
            End If
        End If
 ...

где this - это объект, который мы хотим вызвать, и CallByNameArg0 это вариант (чтобы IsMissing(CallByNameArg0 ))

И в случае, если кто-то попытается вызвать CallByName против стандартного модуля, он не будет работать; вместо этого попробуйте Application.Run

Функция CallByName принимает следующие аргументы:

  • Имя объекта, над которым будет выполняться функция.
  • Строковое выражение, содержащее имя свойства или метода объекта.
  • Константа типа vbCallType, представляющая тип вызываемой процедуры.
  • Аргументы (необязательно).

Я бы попробовал использовать следующее вместо:

Call CallByName("itm", PAN_Source, VbGet)

Может оказаться полезной статья " Начало работы с VBA в Outlook 2010".

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