初めて質問します。マクロ初心者です。
ある複数のIPアドレスに対してpingを送信し、
●正常ならば正常
●”宛先ホストに到達できません”、もしくは”受信=0”のときエラー
をそれぞれ返すマクロを作成したいと考えております。
ネットで検索して下記のマクロを作成したのですが、正常と”受信=0”は判別できても
”宛先ホストに到達できません”も正常として返してしまうので困っております。
どなたかご教授くださいませ。宜しくお願い致します。
※マクロの概要です。
D5~D89にIPアドレスを入力。
正常ならばそれぞれ対応した行のE列に”0”を。
異常ありならば、それぞれ対応した行のE列に”1”、F列に”エラー”を入力。
Sub ping送信マクロ
For i = 5 To Cells(Rows.Count, 4).End(xlUp).Row
cmd = "cmd.exe /c ping " & Cells(i, 4)
Set objWSH = CreateObject("WScript.Shell")
If objWSH.Run(cmd, vbNormalFocus, True) Then
Cells(i, 5) = "1"
Cells(i, 6) = "エラー"
Else
Cells(i, 5) = "0"
End If
Set objWSH = Nothing
Next
End Sub
アドバイスはもちろんですが、何分マクロ触りたてですので”例”として完成したものを
載せて頂けると非常に助かります!
部分的な完成形ですが、下記を読んでみてください。
コマンドプロンプトの標準出力を取得する
http://www.moug.net/tech/exvba/0150123.html
Result にコマンドの出力結果が格納されます。
これを、
If Instr(Result,"宛先ホストに到達できません")> 0 then
のように調べれば良いでしょう。
こちら(Win7)で少し見た限りでは
"が見つかりませんでした。ホスト名を確認してもう一度実行してください。" や
"転送に失敗しました。一般エラーです。"
などエラーメッセージの拾い出しを行う必要がありそうです。
また、WinXPではそっけない英文メッセージでしたが、Win7では日本語ですので
Vistaの場合はどうなんでしょう。
もしかしたら日本語でも少し表現が異なっている場合も考えられます。
・・・と考えましたが、疎通の確認だけならば
成功した場合には、"ラウンド トリップの概算時間(ミリ秒):"が含まれますので
これを頼りに
Sub ping送信マクロ弐()
Dim objWSH As Object, oEx As Object
Dim i As Integer
Dim sCmd As String
Dim sResult As String
Set objWSH = CreateObject("WScript.Shell")
For i = 5 To Cells(Rows.Count, 4).End(xlUp).Row
sCmd = "%ComSpec% /c ping -n 1 " & Cells(i, 4)
Set oEx = objWSH.Exec(sCmd)
Do While oEx.Status = 0
DoEvents
Loop
sResult = oEx.StdOut.ReadAll
If InStr(sResult, "ラウンド トリップの概算時間") = 0 Then
Cells(i, 5) = "1"
Cells(i, 6) = "エラー"
Else
Cells(i, 5) = "0"
Cells(i, 6) = ""
End If
Next
Set objWSH = Nothing
End Sub
補足
"ラウンド トリップの概算時間(ミリ秒)" の半角括弧があると
Instr関数がなぜか働かないので、 (ミリ秒) は削りました。
Ping は一回しか打ってません ping -n 1
なお、コマンドのウィンドウが出てきて煩わしいので、
下記のような方法もあります。
http://okwave.jp/qa/q2352463.htmlhttp://www.wmifun.net/sample/win32_pingstatus.html
お礼
ありがとうございます。 ”ラウンドトリップの概算時間”は盲点でした。 また、わざわざマクロも組んで頂いて感謝です。 無事理想のものができました! 誠にありがとうございました。