Синтаксис 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".