【问题标题】:Excel VBA make a script asynchronousExcel VBA使脚本异步
【发布时间】:2014-08-25 19:51:56
【问题描述】:

我有一个脚本,可以 ping 计算机列表并根据它获得的结果更改它们的背景颜色。

我的问题是,它在运行时会阻塞整个 excel 文件。

所以我的问题是,我怎样才能让它异步运行?

代码如下:

'ping
Function sPing(sHost) As String

Dim oPing As Object, oRetStatus As Object

Set oPing = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery _
  ("select * from Win32_PingStatus where address = '" & sHost & "'")

For Each oRetStatus In oPing
    If IsNull(oRetStatus.StatusCode) Or oRetStatus.StatusCode <> 0 Then
        sPing = "timeout" 'oRetStatus.StatusCode <- error code
    Else
        sPing = sPing & vbTab & oRetStatus.ResponseTime & Chr(10)
    End If
Next
End Function

Sub pingall_Click()
Dim c As Range
Dim p As String

Application.ScreenUpdating = True

For Each c In ActiveSheet.Range("A1:N50")
    If Left(c, 7) = "172.21." Then
    p = sPing(c)
        If p = "timeout" Then
            c.Interior.ColorIndex = "3"
        ElseIf p < 16 And p > -1 Then
            c.Interior.ColorIndex = "4"
        ElseIf p > 15 And p < 51 Then
            c.Interior.ColorIndex = "6"
        ElseIf p > 50 And p < 4000 Then
            c.Interior.ColorIndex = "45"
        Else
            c.Interior.ColorIndex = "15"

        End If
    End If
Next c

Application.ScreenUpdating = False

【问题讨论】:

  • 呃,我认为这不可能。

标签: vba excel asynchronous


【解决方案1】:

不幸的是,您不能对此做太多,因为 VBA 在单线程中运行。

但是,您可以通过放置来引入一定程度的响应能力

VBA.DoEvents()

在代码中的各个地方,最好是在紧密的循环中。在您的情况下,将它们放在包含For 的行之后。这会暂停 VBA 并刷新事件队列,这将使 Excel 响应。

(切换屏幕更新是个坏主意,因为如果函数意外终止,您可能会使事情处于不良状态。如果我是你,我会删除执行此操作的行。)

【讨论】:

  • 如果出现问题,脚本会弹出错误,因为其中没有“On Error Resume Next”。但是我听从了你的建议,所以我把它拿出来了。我也会尝试应用你的代码。希望它有效:-)
  • DoEvents 让它更快了一点,但它在等待来自离线地址的响应时仍然阻塞。
  • 我们能做的就这些了吗?
  • 感谢这对我帮助很大。这正是我正在寻找的解决方案,我这样使用它: call subroutineX() call VBA.DoEvents()
【解决方案2】:

Excel 可以“异步”计算。将sPing 作为函数调用。

我不确定为什么您的范围是 A1:N50。我假设其中一列是 IP 地址,我将其假设为 A。所以 M 列中的公式看起来像 =sPing(A1)

至于颜色编码,可以使用条件格式。

【讨论】:

  • 但它被称为函数p = sPing(c) 其中c 是IP 地址。我使用 A1:N50 是因为我使用带有多个工作表的动态脚本以及更多信息。根据 ping 值识别和着色 IP 地址。
  • 您是否暗示 A1:N50 是一个 2D 网格,其中每个单元格都包含 IP 地址?如果没有,我的建议是在 Excel 工作簿本身中使用您的函数,您可以在公式中调用自己的函数。
  • 它有多个表,其中包含工作表上随机位置的 IP 地址。当我开始编写脚本时,我已经为整个工作簿尝试了它,但 excel 已被阻止。我只有 3 周的 vba 经验,所以我发现这种方式更容易。但我会尝试你的建议,谢谢你的提示! :-)
  • 免费提示:让你的VBA自定义函数volatile,这样它就可以连续计算。否则,一旦计算出来,它将保持不变。
【解决方案3】:

虽然严格来说,您无法让 Excel 按您的需要运行,但有一个技巧可以解决它。解决方案是创建另一个 Excel 实例。然后,您可以在其中一个实例中运行宏,并在另一个实例中独立工作。 您可以从运行提示符(按 Windows + R)打开另一个 Excel 实例,然后键入 Excel /x,然后输入

【讨论】:

    猜你喜欢
    • 2015-06-13
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2012-10-19
    • 2014-01-14
    • 2023-03-13
    相关资源
    最近更新 更多