【问题标题】:excel vba ping list of computersexcel vba ping 计算机列表
【发布时间】:2014-06-27 10:23:14
【问题描述】:

我正在做一个项目。我的目标是,从 excel 列表中对所有计算机执行 ping 操作,但无法弄清楚为什么它不起作用。我对这种编程语言很陌生,我确信我错过了一些东西,因为我收到错误消息:需要对象

这是我的代码

主要:

Sub pingall_Click()
Dim c As Range
c = Target.Name

For Each c In Range("A1:N50")
    If (Left(c, 1) = "C" Or Left(c, 1) = "T") And IsNumeric(Right(c, 6)) And Len(c) = 7 Then
    c = sPing(c)
        If c = "timeout" Then
            MsgBox "timeout"
        ElseIf c < 16 And c > -1 Then
            MsgBox "ok"
        ElseIf c > 15 And c < 51 Then
            MsgBox "not ok"
        ElseIf c > 50 And c < 4000 Then
            MsgBox "big delay"
        Else
            MsgBox "error"

        End If
    End If
Next c
End Sub

功能:

Public 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
    Else
        sPing = sPing & vbTab & oRetStatus.ResponseTime & Chr(10)
    End If
Next
End Function

如果我写 sPing("") 可以得到结果,但我希望它得到列表中 pc-s 的名称。 这只是脚本的测试版本,我现在用一台电脑测试它,这就是我使用“MsgBox”的原因。

谢谢

【问题讨论】:

    标签: vba excel ping


    【解决方案1】:

    Sub pingall_Click() 子例程中的第二行是引发Object Required 错误的行。即以下行。

    c = Target.Name
    

    如果您将其注释掉或删除它,它会起作用。 (我试过了。)

    此外,您不应将函数sPing 的返回值分配回c。 因为这样做会覆盖单元格中的服务器/IP 地址的名称,因为 forloop 使用 c 变量一次循环超过 1 个单元格。

    因此,请将其分配回一个新的字符串变量,然后对它做任何你想做的事情。

    【讨论】:

    • 非常感谢!我不敢相信这就是问题的全部。现在一切都如我所愿! :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多