【问题标题】:Skip a line if runtime exceeds certain time limit for a single code - VBA如果运行时超过单个代码的特定时间限制,则跳过一行 - VBA
【发布时间】:2018-04-24 01:50:22
【问题描述】:

我正在创建一个表单,其中所有凭据都由访问它的任何人自动填充。但是,我在尝试获取用户的电子邮件地址时遇到了困难。

Set olApp = CreateObject("Outlook.Application")
Set olNS = olApp.GetNamespace("MAPI")

UserEmail = olNS.CurrentUser.AddressEntry.GetExchangeUser.PrimarySmtpAddress

这一行可能会在某些用户的 PC 上占用超过 1 分钟,而在其他用户的 PC 上占用几秒钟。 例如,如果它需要超过 5 秒,有没有办法跳过它?

我正在考虑申请 application.ontime 但不知道如何从那里开始。

【问题讨论】:

  • 你想要达到的不是微不足道的。通常,您的所有 VBA 代码都在单个线程中运行。这意味着每当任何功能卡住一段时间,您的整个代码执行都会停止。 This question is about asynchronous calls in VBA 基本上说:这是不可能的。因此,您要么需要找到一种方法来修改返回电子邮件地址的函数以提前返回。或者启动第二个 VBA 主机并让它为您检索地址。如果它没有及时提供,就继续没有它。
  • 启动第二个 vba 主机的好主意。我试试看。

标签: vba outlook


【解决方案1】:

VBA 不是为运行多线程调用而设计的。如果您想优化 Outlook VBA 解决方案的性能,您可以考虑改为创建 COM 加载项。请参阅Chapter 12: Migrating VBA Solutions to VSTO 了解更多信息。

在访问地址条目对象之前,我建议获取Address 属性值。它返回一个字符串,表示收件人的电子邮件地址。如果它对应于 SMTP 地址,那么您可以跳过不必要的调用。

【讨论】:

    猜你喜欢
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2014-06-24
    • 2011-12-25
    • 2011-11-23
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多