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