作者:iamlaosong

单位中客服人员一般都不太懂计算机,为了出现问题时有个初步了解,需要知道是网络问题还是程序问题。其实多数情况下都是网络问题,可是他们连简单的Ping命令都不会,为此,我用VBA做了个工具,测试网络是否通达。

工具使用VBA执行ping命令和API测试IP,并将结果保存到工作表中,程序界面如下:

本工具下载地址:点击打开链接

使用方法:

将需要测试的地址所在行的“状态”列改为y(C列,表示要测试这个IP),然后点击测试按钮即可。
“IP测试”调用API测试,速度快,但只能测试数字IP地址。
“Ping测试”用DOS命令测试,域名和数字IP都可以,但有弹窗,速度也慢一点。

程序如下:

'通过Ping命令检查IP是否通达
Public Sub get_data()'根据工作表中的查询语句读取数据Dim oExec As Object, oShell As ObjectDim Ip, Stat As StringDim i, k, kk, lineno, row1 As Long'On Error Resume Nextlineno = [A65536].End(xlUp).Row      '行数maxrow = Sheets("查询结果").UsedRange.Rows.CountIf maxrow >= 2 ThenSheets("查询结果").Range("A2:F" & maxrow).ClearContentsEnd If'创建对象Set oShell = CreateObject("Wscript.shell")kk = 0For i = 2 To linenoStat = Cells(i, 3)If UCase(Stat) = "Y" Thenkk = kk + 1Ip = Cells(i, 2)result = ""If Ip = "" Then Exit Forcmdping = "ping " & Ip & " -n 1"Set oExec = oShell.exec(cmdping)'result = vbaPing(Ip)Do Until oExec.stdout.AtEndOfStreamresult = result & oExec.stdout.readline() & Chr(13)Loop'Debug.Print result'XP反馈:Lost = 0 (0% loss)  Win7反馈:丢失 = 0 (0% 丢失)If InStr(result, "Lost = 0 (0% loss)") > 0 Or InStr(result, "丢失 = 0 (0% 丢失)") > 0 ThenCells(i, 3) = "OK"ElseCells(i, 3) = "no"End IfSheets("查询结果").Cells(i, 1) = IpSheets("查询结果").Cells(i, 2) = resultEnd IfNext iSet oExec = NothingSet oShell = Nothingmsg = MsgBox("查询完毕,共查询" & kk & "个IP地址!", vbOKOnly, "AHEMS:iamlaosong")End Sub

用这个方法不仅可以测试数字IP,域名也可以测试,缺点是有弹窗,速度慢。另一种办法是用API测试,没有弹窗,速度很快,但是只能测试数字IP,程序如下:

Option ExplicitPrivate Const IP_SUCCESS As Long = 0
Private Const IP_STATUS_BASE As Long = 11000
Private Const IP_BUF_TOO_SMALL As Long = (11000 + 1)
Private Const IP_DEST_NET_UNREACHABLE As Long = (11000 + 2)
Private Const IP_DEST_HOST_UNREACHABLE As Long = (11000 + 3)
Private Const IP_DEST_PROT_UNREACHABLE As Long = (11000 + 4)
Private Const IP_DEST_PORT_UNREACHABLE As Long = (11000 + 5)
Private Const IP_NO_RESOURCES As Long = (11000 + 6)
Private Const IP_BAD_OPTION As Long = (11000 + 7)
Private Const IP_HW_ERROR As Long = (11000 + 8)
Private Const IP_PACKET_TOO_BIG As Long = (11000 + 9)
Private Const IP_REQ_TIMED_OUT As Long = (11000 + 10)
Private Const IP_BAD_REQ As Long = (11000 + 11)
Private Const IP_BAD_ROUTE As Long = (11000 + 12)
Private Const IP_TTL_EXPIRED_TRANSIT As Long = (11000 + 13)
Private Const IP_TTL_EXPIRED_REASSEM As Long = (11000 + 14)
Private Const IP_PARAM_PROBLEM As Long = (11000 + 15)
Private Const IP_SOURCE_QUENCH As Long = (11000 + 16)
Private Const IP_OPTION_TOO_BIG As Long = (11000 + 17)
Private Const IP_BAD_DESTINATION As Long = (11000 + 18)
Private Const IP_ADDR_DELETED As Long = (11000 + 19)
Private Const IP_SPEC_MTU_CHANGE As Long = (11000 + 20)
Private Const IP_MTU_CHANGE As Long = (11000 + 21)
Private Const IP_UNLOAD As Long = (11000 + 22)
Private Const IP_ADDR_ADDED As Long = (11000 + 23)
Private Const IP_GENERAL_FAILURE As Long = (11000 + 50)
Private Const MAX_IP_STATUS As Long = (11000 + 50)
Private Const IP_PENDING As Long = (11000 + 255)
Private Const PING_TIMEOUT As Long = 500
Private Const WS_VERSION_REQD As Long = &H101
Private Const MIN_SOCKETS_REQD As Long = 1
Private Const SOCKET_ERROR As Long = -1
Private Const INADDR_NONE As Long = &HFFFFFFFF
Private Const MAX_WSADescription As Long = 256
Private Const MAX_WSASYSStatus As Long = 128Public PingTime As Long
Private Type ICMP_OPTIONSTtl             As ByteTos             As ByteFlags           As ByteOptionsSize     As ByteOptionsData     As Long
End TypePrivate Type ICMP_ECHO_REPLYAddress         As Longstatus          As LongRoundTripTime   As LongDataSize        As LongDataPointer     As LongOptions         As ICMP_OPTIONSData            As String * 250
End TypePrivate Type WSADATAwVersion As IntegerwHighVersion As IntegerszDescription(0 To MAX_WSADescription) As ByteszSystemStatus(0 To MAX_WSASYSStatus) As BytewMaxSockets As LongwMaxUDPDG As LongdwVendorInfo As Long
End TypePublic Declare Function timeGetTime Lib "winmm.dll" () As Long
Private Declare Function WSAStartup Lib "wsock32" (ByVal wVersionRequired As Long, lpWSADATA As WSADATA) As Long
Private Declare Function WSACleanup Lib "wsock32" () As Long
Private Declare Function IcmpCreateFile Lib "icmp.dll" () As Long
Private Declare Function inet_addr Lib "wsock32" (ByVal s As String) As Long
Private Declare Function IcmpCloseHandle Lib "icmp.dll" (ByVal IcmpHandle As Long) As Long
Private Declare Function IcmpSendEcho Lib "icmp.dll" (ByVal IcmpHandle As Long, ByVal DestinationAddress As Long, ByVal RequestData As String, ByVal RequestSize As Long, ByVal RequestOptions As Long, ReplyBuffer As ICMP_ECHO_REPLY, ByVal ReplySize As Long, ByVal Timeout As Long) As Long
'Private Declare Function WSAGetLastError Lib "wsock32" () As Long
'Private Declare Function gethostname Lib "wsock32" (ByVal szHost As String, ByVal dwHostLen As Long) As Long
'Private Declare Function gethostbyname Lib "wsock32" (ByVal szHost As String) As Long
'Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (xDest As Any, xSource As Any, ByVal nbytes As Long)Private Function GetStatusCode(status As Long) As StringOn Error GoTo ErrLineDim Msg As StringGetStatusCode = ""Select Case statusCase IP_SUCCESS:               Msg = "ip success"Case INADDR_NONE:              Msg = "inet_addr: bad IP format"Case IP_BUF_TOO_SMALL:         Msg = "ip buf too_small"Case IP_DEST_NET_UNREACHABLE:  Msg = "ip dest net unreachable"Case IP_DEST_HOST_UNREACHABLE: Msg = "ip dest host unreachable"Case IP_DEST_PROT_UNREACHABLE: Msg = "ip dest port unreachable"Case IP_DEST_PORT_UNREACHABLE: Msg = "ip dest port unreachable"Case IP_NO_RESOURCES:          Msg = "ip no resources"Case IP_BAD_OPTION:            Msg = "ip bad option"Case IP_HW_ERROR:              Msg = "ip hw_error"Case IP_PACKET_TOO_BIG:        Msg = "ip packet too_big"Case IP_REQ_TIMED_OUT:         Msg = "ip req timed out"Case IP_BAD_REQ:               Msg = "ip bad req"Case IP_BAD_ROUTE:             Msg = "ip bad route"Case IP_TTL_EXPIRED_TRANSIT:   Msg = "ip ttl expired transit"Case IP_TTL_EXPIRED_REASSEM:   Msg = "ip ttl expired reassem"Case IP_PARAM_PROBLEM:         Msg = "ip param_problem"Case IP_SOURCE_QUENCH:         Msg = "ip source quench"Case IP_OPTION_TOO_BIG:        Msg = "ip option too_big"Case IP_BAD_DESTINATION:       Msg = "ip bad destination"Case IP_ADDR_DELETED:          Msg = "ip addr deleted"Case IP_SPEC_MTU_CHANGE:       Msg = "ip spec mtu change"Case IP_MTU_CHANGE:            Msg = "ip mtu_change"Case IP_UNLOAD:                Msg = "ip unload"Case IP_ADDR_ADDED:            Msg = "ip addr added"Case IP_GENERAL_FAILURE:       Msg = "ip general failure"Case IP_PENDING:               Msg = "ip pending"Case PING_TIMEOUT:             Msg = "ping timeout"Case Else:                     Msg = "unknown msg returned"End SelectGetStatusCode = MsgExit Function
ErrLine:
End FunctionPrivate Function Ping(sAddress As String, sDataToSend As String, ECHO As ICMP_ECHO_REPLY) As LongOn Error GoTo ErrLineDim hPort As LongDim dwAddress As LongdwAddress = inet_addr(sAddress)If dwAddress <> INADDR_NONE ThenhPort = IcmpCreateFile()If hPort ThenCall IcmpSendEcho(hPort, dwAddress, sDataToSend, Len(sDataToSend), 0, ECHO, Len(ECHO), PING_TIMEOUT)Ping = ECHO.statusCall IcmpCloseHandle(hPort)End IfElsePing = INADDR_NONEEnd IfExit Function
ErrLine:Ping = INADDR_NONE
End FunctionPublic Function PingIP(ByVal szIp As String) As Boolean
On Error GoTo ErrLine
Dim WSAD As WSADATA
Dim ECHO As ICMP_ECHO_REPLY
Dim ret As Long
'Delay 150
PingIP = False
PingTime = Empty
If WSAStartup(WS_VERSION_REQD, WSAD) = IP_SUCCESS Thenret = Ping(Trim(szIp), "tanaya", ECHO)PingTime = ECHO.RoundTripTimeIf InStr(1, GetStatusCode(ret), "success") <> 0 ThenWSACleanupPingIP = TruePingTime = ECHO.RoundTripTimeExit FunctionEnd If
End If
Exit Function
ErrLine:
End Function'主程序:通过API检查IP是否通达,不支持域名解析。
Public Sub NetCheck()'根据工作表中的查询语句读取数据Dim Ip, Stat As StringDim i, k, kk, lineno As Long'On Error Resume Nextlineno = [B65536].End(xlUp).Row      '行数kk = 0For i = 2 To linenoStat = Cells(i, 3)If UCase(Stat) = "Y" Thenkk = kk + 1Ip = Cells(i, 2)If Ip = "" Then Exit ForIf PingIP(Ip) ThenCells(i, 3) = "OK"ElseCells(i, 3) = "no"End IfEnd IfNext iStat = MsgBox("查询完毕,共查询" & kk & "个IP地址!", vbOKOnly, "AHEMS:iamlaosong")End Sub

【VBA研究】用Ping命令测试IP地址是否通达相关推荐

  1. Linux arping命令测试IP地址冲突

    arping命令可以用来测试局域网各个主机之间的连通性,测试局域网中某个特定的IP地址是否已经被占用,进而可以有效检测局域网内的IP地址冲突问题. 如下图示例:arping -c 3 -f -D *. ...

  2. Linux ping 测试IP地址与 telnet 测试IP端口

    文章目录 一.ping命令使用 二.telnet 端口使用 转载文章 一.ping命令使用 原文地址:https://www.cnblogs.com/FengZeng666/p/15093267.ht ...

  3. 通过ping命令测试主机与虚拟机之间是否连通

    一.查询本机.虚拟机Windows IP地址 1.本机的Windows IP地址 方法一:控制面板>网络和Internet>网络和共享中心>更改适配器设置>以太网>详细信 ...

  4. iphone7测试软件,iPhone7如何测试网速 ping命令测试网速方法介绍

    电脑设备测试网速的方法有很多,了解的小伙伴应该都知道那么几种.但是如果我们想要测试iPhone手机的网速,该怎么弄呢?这个估计就没有多少小伙伴知道了.下面小编来教一教大家怎么使用ping来测试网速. ...

  5. ping命令测试网络_如何执行计算机Ping测试命令以检查网络连接?

    ping命令测试网络 Computer networking provides a lot of features for remote usage. But remote access may ha ...

  6. 如何测试本地计算机与网关是否连通,教你使用ping命令测试连接

    教你使用ping命令测试连接 Ping命令有助于验证IP级的连通性,发现和解决问题时,可以使用Ping向目标主机名或IP地址发送ICMP回应请求.在需要验证主机能否连接到 TCP/IP网络和网络资源时 ...

  7. 阿里云服务器18个数据中心测试IP地址以及测试方法

    阿里云服务器18个数据中心测试IP地址以及测试方法 2018-09-27 分类:阿里云应用 阅读(3710) 评论(0) 我们用户在选择阿里云服务器的时候是不是感觉阿里云的数据中心太多太多,确实阿里云 ...

  8. window系统批量测试IP地址的bat脚本

    当碰到测试大量的IP地址时,一个一个去ping的工作量太大,那么使用bat脚本来实现批量测试脚本的是最佳的选择了. 使用bat脚本测试IP地址的方法: ① 将需要测试的IP地址写入 IP.txt 文件 ...

  9. 如何ping网站的IP地址

    如何ping网站的IP地址 什么是ping 操作案例 什么是ping ping是Windows下的一个命令.在Unix和Linux下也有这个命令.ping也属于一个通信协议,是TCP/IP协议的一部分 ...

最新文章

  1. Android View measure(0,0)的作用
  2. 终端多窗口管理旗舰------screen
  3. Oracle Index
  4. 安装rational rose
  5. MySql 触发器同步备份数据表记录
  6. 【译】Typescript的类型(二)
  7. [转载] 1022 D进制的A+B (20分)【java题解】【80ms】
  8. 关于vs2008设计视图假死的原因及解决方案总结
  9. 吴孟达肝癌逝世:肝被透支的全过程曝光!
  10. python当输入0时结束_python输入-1时结束-女性时尚流行美容健康娱乐mv-ida网
  11. 微服务:更愉快还是更嘈杂?
  12. javascript小实例,阻止浏览器默认行为,真的能阻止吗?支持IE和标准浏览器的阻止默认行为的方法...
  13. 大学 计算机 试题,【分享】《大学计算机基础》试题题库及答案 ~~~~~~~~~~~...
  14. Oracle 查询重复字段
  15. 微软苏州二期全面封顶,明年投入使用!三期开工时间已定,研发人才将达5000余人!...
  16. 33个地区发iPhone5,老外纳闷中国没人排队_-Chaz-_新浪博客
  17. 计算机网络双绞线实验报告
  18. 【excel vba】拆分表格
  19. 机顶盒开发助手Tvbox
  20. spark union 会引起shuffle吗_Spark高性能Job

热门文章

  1. 获取经纬度中心点函数工具,经纬度面积算法,D3js,xy轴转为经纬度算法,六代度坐标转换为经纬度
  2. Mysql(三)索引、视图、存储过程、触发器、分区表
  3. java为word、excel、pdf、ppt、图片添加图片水印(文字水印同理)
  4. 基于BIM轻量化的智能建造OA管理系统
  5. 网易2016笔试(3)
  6. 博世传感器调试笔记(三)加速度及地磁传感器BMC156
  7. 博世传感器BMM150数据读取
  8. Dual Super-Resolution Learning for Semantic Segmentation解读
  9. 50款拥有超赞用户体验的精美移动UI设计
  10. 台式机插上耳机没有声音