- ベストアンサー
エクセル2010マクロ ping送信マクロ作成
- エクセル2010で、複数のIPアドレスに対してpingを送信し、正常とエラーを判別するマクロの作成方法を教えてください。
- ネットで検索して見つけたマクロは、正常と受信=0の場合は正常と判定できるが、「宛先ホストに到達できません」というエラーも正常として判定してしまう問題があります。
- マクロの概要は、D5~D89にIPアドレスを入力し、正常ならば対応した行のE列に「0」を、エラーがある場合はE列に「1」、F列に「エラー」と入力するものです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
部分的な完成形ですが、下記を読んでみてください。 コマンドプロンプトの標準出力を取得する 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.html http://www.wmifun.net/sample/win32_pingstatus.html
お礼
ありがとうございます。 ”ラウンドトリップの概算時間”は盲点でした。 また、わざわざマクロも組んで頂いて感謝です。 無事理想のものができました! 誠にありがとうございました。