goo blog サービス終了のお知らせ 

半角チルダ

ExcelVBA、その他。
覚え書きや、補足資料などのスクラップブック。
end-u(1037781)

■ping&arpコマンドでIP調査

2008-08-13 22:00:00 | VBA Tips
覚え書き的。
http://www.atmarkit.co.jp の『使用中のIPアドレスを調査する』を参考に、LAN上のIPアドレス空き調査を行っている。
ちょっと古い情報かもしれないので今さら、なのだが実務でたまに使っているコード。
以前はフリーのIP調査ソフトを使っていたのだが、IPアドレスがとれない端末があった。
前述ページの『だが実際にはファイアウォール・ソフトウェアなどによって、このpingコマンドに対する応答(正確にはICMP echoプロトコル)がブロックされていることがある。』という記述を見て納得&感謝。
別にExcel VBAで実行して態々シートに取り込まなくてもよさそうなものだが、ぷちTipsとして :-)

Sub try() '参考http://www.atmarkit.co.jp/fwin2k/win2ktips/309ipuse/ipuse.html
  'arpコマンド結果logファイル
  Const WRK1 = "d:¥arp.log"
  '稼動IP抜き出しlogファイル
  Const WRK2 = "d:¥dynaip.log"
  '変数%iを0から増分1で254までLoop。 _
   pingは待ち時間1msで1回実行し、直後にarpも実行するコマンド文字列。
  Const CMD1 = "for /l %i in (0,1,254) do " _
        & "ping -w 1 -n 1 192.168.0.%i " _
        & "&& arp -a 192.168.0.%i"
  'findstrでエントリがdynamicとなっている行だけ抜き出すコマンド文字列。
  Const CMD2 = "findstr dynamic " & WRK1
  'DataObjectのClassID。事後バインディング用。 _
   参考http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=55281;id=excel
  Const CLSID_DataObject = "1C3B4210-F441-11CE-B9EA-00AA006B1A69"
  Dim tmp As String
  Dim n  As Long

  'logを追加モードで書き出すので旧logがあれば削除。
  On Error Resume Next
  Kill WRK1
  On Error GoTo 0

  'ping & arp >> .log と findstr > .log を同期実行。
  With CreateObject("WScript.Shell")
    .Run "%ComSpec% /c " & CMD1 & " >> " & WRK1, 0, True
    .Run "%ComSpec% /c " & CMD2 & " > " & WRK2, 0, True
  End With

  'WRK2(log)を開いてSheetに展開。
  If FileLen(WRK2) > 0 Then
    n = FreeFile
    Open WRK2 For Input As #n
    tmp = StrConv(InputB(LOF(n), #n), vbUnicode)
    Close #n
    tmp = Application.Trim(tmp)
    tmp = Replace(Replace(tmp, " " & vbCrLf & " ", vbCrLf), " ", vbTab)
    'RegExpを使うなら以下例。でもpingが遅いし、速度を気にしてもしょうがない。
    'With CreateObject("VBScript.RegExp")
    '  .Global = True
    '  .Pattern = " ¥r¥n "
    '  tmp = .Replace(tmp, vbCrLf)
    '  .Pattern = " "
    '  tmp = .Replace(tmp, vbTab)
    'End With
    With GetObject("new:" & CLSID_DataObject)
      .SetText tmp
      .PutInClipboard
    End With
    With Sheets.Add
      .Paste .Cells(1)
    End With
  End If
  MsgBox "end"
End Sub


(結果イメージ)

Comment    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ■WebQueryの失敗(その後 | TOP | ■Excel2007で無くなったプロ... »
最新の画像もっと見る

Recent Entries | VBA Tips