Updated PingCell Function for Excel

This post was previously released under a different blog and is being republished by me below. That site is no longer available. I am the original author.

I’ve updated my Microsoft Excel PingCell code that I published previously. The new function returns all results from Win32_PingStatus back to Excel. You can now ping and choose the results you’d like to see returned (example below code). The Win32_PingStatus class is documented on Microsoft’s Website.

  1Public Sub PingCell()
  2 
  3    ' Version:          1.1
  4    ' Excel Version:    Tested with 2003/2007
  5    ' Language:         English
  6    ' Description:      Function that pings a computer and returns the result to an adjacent column
  7    
  8    ' 30-Jun-2009:      Created Function
  9    ' 23-Aug-2009:      Added all other Win32\_PingStatus results to Excel
 10
 11    Dim column As Integer
 12    Dim strStatus As String
 13    Dim objPing As Object
 14    Dim objPingStatus As Object
 15    Dim r As Range
 16 
 17    ' Ask user for column number to return results to
 18    column = InputBox("Please select a column NUMBER to start the dump:", "Ping Systems")
 19 
 20    For Each r In Application.Selection
 21 
 22        Cells(r.Row, column + 0) = "Pinging ..."
 23        Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("select \* from Win32\_PingStatus where address = '" & r.Value & "'")
 24 
 25        ' Call DoEvents to stop this thing from hanging Excel on long lists
 26        DoEvents
 27 
 28        For Each objPingStatus In objPing
 29            ' Status Codes: http://msdn.microsoft.com/en-us/library/aa394350%28VS.85%29.aspx
 30            If IsNull(objPingStatus.statuscode) Then
 31                ' Not from MSDN
 32                strStatus = "Unable to Resolve Host"
 33            Else
 34                Select Case objPingStatus.statuscode
 35                    Case 0
 36                        strStatus = "Success"
 37                    Case 11002
 38                        strStatus = "Destination Net Unreachable"
 39                    Case 11003
 40                        strStatus = "Destination Host Unreachable"
 41                    Case 11004
 42                        strStatus = "Destination Protocol Unreachable"
 43                    Case 11005
 44                        strStatus = "Destination Port Unreachable"
 45                    Case 11006
 46                        strStatus = "No Resources"
 47                    Case 11007
 48                        strStatus = "Bad Option"
 49                    Case 11008
 50                        strStatus = "Hardware Error"
 51                    Case 11009
 52                        strStatus = "Packet Too Big"
 53                    Case 11010
 54                        strStatus = "Request Timed Out"
 55                    Case 11011
 56                        strStatus = "Bad Request"
 57                    Case 11012
 58                        strStatus = "Bad Route"
 59                    Case 11013
 60                        strStatus = "TimeToLive Expired Transit"
 61                    Case 11014
 62                        strStatus = "TimeToLive Expired Reassembly"
 63                    Case 11015
 64                        strStatus = "Parameter Problem"
 65                    Case 11016
 66                        strStatus = "Source Quench"
 67                    Case 11017
 68                        strStatus = "Option Too Big"
 69                    Case 11018
 70                        strStatus = "Bad Destination"
 71                    Case 11032
 72                        strStatus = "Negotiating IPSEC"
 73                    Case 11050
 74                        strStatus = "General Failure"
 75                    Case Else
 76                        strStatus = "Unknown Ping Result (" & objPingStatus.statuscode & ")"
 77                End Select
 78            End If
 79 
 80            Cells(r.Row, column + 0) = strStatus
 81            Cells(r.Row, column + 1) = objPingStatus.BufferSize
 82            Cells(r.Row, column + 2) = objPingStatus.NoFragmentation
 83            Cells(r.Row, column + 3) = objPingStatus.PrimaryAddressResolutionStatus
 84            Cells(r.Row, column + 4) = objPingStatus.ProtocolAddress                 ' IP Address
 85            Cells(r.Row, column + 5) = objPingStatus.ProtocolAddressResolved
 86            Cells(r.Row, column + 6) = objPingStatus.RecordRoute
 87            Cells(r.Row, column + 7) = objPingStatus.ReplyInconsistency
 88            Cells(r.Row, column + 8) = objPingStatus.ReplySize
 89            Cells(r.Row, column + 9) = objPingStatus.ResolveAddressNames
 90            Cells(r.Row, column + 10) = objPingStatus.ResponseTime
 91            Cells(r.Row, column + 11) = objPingStatus.ResponseTimeToLive
 92            Cells(r.Row, column + 12) = objPingStatus.RouteRecord
 93            Cells(r.Row, column + 13) = objPingStatus.RouteRecordResolved
 94            Cells(r.Row, column + 14) = objPingStatus.SourceRoute
 95 
 96            Select Case objPingStatus.SourceRouteType
 97                Case 0
 98                    strStatus = "None"
 99                Case 1
100                    strStatus = "Loose Source Routing"
101                Case 2
102                    strStatus = "Strict Source Routing"
103                Case Else
104                    strStatus = "Unknown Source Routing"
105            End Select
106 
107            Cells(r.Row, column + 15) = strStatus
108            Cells(r.Row, column + 16) = objPingStatus.Timeout
109            Cells(r.Row, column + 17) = objPingStatus.TimeStampRecord
110            Cells(r.Row, column + 18) = objPingStatus.TimeStampRecordAddress
111            Cells(r.Row, column + 19) = objPingStatus.TimeStampRecordAddressResolved
112            Cells(r.Row, column + 20) = objPingStatus.TimeStampRoute
113            Cells(r.Row, column + 21) = objPingStatus.TimeToLive
114 
115            Select Case objPingStatus.TimeStampRoute
116                Case 0
117                    strResult = "Normal"
118                Case 2
119                    strResult = "Minimize Monitary Cost"
120                Case 4
121                    strResult = "Maximize Reliability"
122                Case 8
123                    strResult = "Maximize Throughput"
124                Case 16
125                    strResult = "Minimize Delay"
126                Case Else
127                    strResult = "Unknown"
128            End Select
129 
130            Cells(r.Row, column + 22) = strResult
131 
132        Next
133 
134    Next r
135 
136End Sub

To restrict the results returned to just what you want, modify the rows where Cells(r.row, column+n) are set. For example, to return just the status and the IP Address, you’d remove all except for these two:

1Cells(r.Row, column + 0) = strStatus
2Cells(r.Row, column + 4) = objPingStatus.ProtocolAddress

You can then change the column+4 to column+1 so that they sit next to each other.