1

我想处理收到的邮件。

我的代码有一个冗长的条件语句,用于确定每封传入电子邮件所属的类别。

根据此条件语句的结果,代码应该读取 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

代码只是在这个阶段停止执行。

4

2 回答 2

2

这是一个老问题,我知道,但为了正确起见:VBA 的 CallByName接受字符串作为

“将在其上执行函数的对象的名称。”

在某些地方,MSDN 示例被歪曲成一个明显错误的示例。它必须是每个 si的对象。所以,而不是:

Call CallByName("itm", PAN_Source, VbGet)

去做:

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

PAN_Source 必须在可选的 Args() 中提供。

作为奖励,如果它以 Function (vbMethod) 的形式返回某些内容,请使用 Variant 接收它:

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

我主要使用它在排序算法中通过 Property Get 或 Set 将某些 Collections 迭代到 SortIt() 或检索值 - 或两者兼而有之,例如:

 ...

        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

于 2020-02-27T17:22:53.060 回答
0

CallByName函数接受以下参数:

  • 将在其上执行函数的对象的名称。
  • 一个字符串表达式,包含对象的属性或方法的名称。
  • 一个类型为 vbCallType 的常量,表示被调用的过程的类型。
  • 参数(可选)。

我会尝试使用以下内容:

Call CallByName("itm", PAN_Source, VbGet)

您可能会发现Outlook 2010 中的 VBA 入门文章很有帮助。

于 2014-12-06T14:27:05.997 回答