Realize,Inc.

MACアドレス一覧を取得する

ARP情報を取得して、IPアドレスとMACアドレスの対応をExcelで見える化しましょう

MACアドレスは、ネットワーク機器ごとに割り当てられている世界に一つの固有番号です。
今回は Windows の arp コマンドをVBAから実行し、パソコンが記憶している「IPとMACの対応表(ARPテーブル)」を取得します。

このVBAでできること

ARPテーブルの抽出

Windowsが通信相手を識別するために保持している一時的な名簿(ARPテーブル)を読み取ります。

機器の特定

IPアドレスだけでは分からない「どのメーカーのどの端末か」を調査する手がかりになります。

Excelへの自動整理

コマンドプロンプトの文字結果を、自動的にExcelのセルへ分割して入力します。

flowchart LR
    PC["自分のPC"]
    
    subgraph InsidePC ["PC内の記憶領域"]
        ARP["ARPテーブル
(IPとMACの対応表)"] end Device1["ルーター
192.168.1.1
AA-BB-CC..."] Device2["プリンター
192.168.1.20
11-22-33..."] PC -- 通信すると記憶される --> Device1 PC -- 通信すると記憶される --> Device2 ARP -.-> |VBAで読み取り| PC

VBAコード


Sub GetMacAddressList()

    Dim ws As Worksheet
    Dim objShell As Object
    Dim objExec As Object

    Dim strResult As String
    Dim arrLines As Variant
    Dim arrParts As Variant

    Dim i As Long
    Dim rowNum As Long
    Dim lineText As String

    Set ws = ActiveSheet

    ' 画面をクリアして見出しを作成
    ws.Cells.Clear
    ws.Range("A1:C1").Value = Array("IPアドレス", "MACアドレス", "種類")
    ws.Range("A1:C1").Font.Bold = True

    ' Windowsコマンドの実行準備
    Set objShell = CreateObject("WScript.Shell")
    ' arp -a コマンドを実行(現在のARPテーブルを表示)
    Set objExec = objShell.Exec("cmd /c arp -a")

    ' 結果をすべて読み込む
    strResult = objExec.StdOut.ReadAll

    ' 改行ごとに分割して1行ずつ処理
    arrLines = Split(strResult, vbCrLf)

    rowNum = 2

    For i = LBound(arrLines) To UBound(arrLines)
        lineText = Trim(arrLines(i))

        ' IPアドレスとMACアドレスが含まれる行か判定 (簡易パターンマッチ)
        If lineText Like "*.*.*.* *-*-*-*-*-* *" Then
            ' 連続する空白を1つに整理して分割
            arrParts = SplitBySpace(lineText)

            If UBound(arrParts) >= 2 Then
                ws.Cells(rowNum, 1).Value = arrParts(0) ' IPアドレス
                ws.Cells(rowNum, 2).Value = arrParts(1) ' MACアドレス
                ws.Cells(rowNum, 3).Value = arrParts(2) ' 種類(dynamic/static)
                rowNum = rowNum + 1
            End If
        End If
    Next i

    ws.Columns("A:C").AutoFit
    MsgBox "MACアドレス一覧を取得しました。", vbInformation

End Sub

' 連続する空白を整理して分割する補助関数
Function SplitBySpace(ByVal txt As String) As Variant
    Dim tmp As String
    tmp = Trim(txt)
    Do While InStr(tmp, "  ") > 0
        tmp = Replace(tmp, "  ", " ")
    Loop
    SplitBySpace = Split(tmp, " ")
End Function

コード解説

① arp -a を実行

WScript.Shell を通じて Windows の標準コマンドを実行し、結果をテキストとして取り込みます。

② 空白の整理(SplitBySpace)

arp コマンドの結果は項目間の空白数がバラバラなため、そのままでは分割できません。自作関数で空白を1つにまとめてから分割しています。

③ データの抽出と出力

「IPアドレス形式」と「MACアドレス形式」が並んでいる行だけを特定し、Excelの各列へ順番に書き込みます。

実務ポイント

Pingとの組み合わせが最強

事前にネットワーク内の全IPにPingを打っておくと、ARPテーブルが最新になり、網羅的なリストが作れます。

不明な通信機器の特定

MACアドレスの先頭3オクテット(6桁)を調べれば、その機器のメーカーが判明し、調査が捗ります。

定期的な実行がおすすめ

ARP情報は数分〜数十分で消えてしまうため、調査を行う直前に実行するのがポイントです。

よくあるトラブル

期待した機器がリストに出ない
その機器と最近通信していない場合、PCの記憶から消えています。一度そのIPにPingを打ってから再実行してください。
169.254.x.x などの不明なIPが出る
IPアドレスが正常に取得できていない(リンクローカルアドレス)機器の可能性があります。

まとめ

  • VBAから arp -a を実行すれば、ネットワーク内の物理的な名簿が作れます
  • 連続空白の処理(整形)を行うことで、Excelへの出力が容易になります
  • Pingツールと組み合わせることで、精度の高いネットワーク棚卸しが可能になります

ネットワーク設計・トラブル対応でお困りではありませんか?

株式会社リアライズがサポートいたします。

  • ネットワーク設計・構築
  • トラブル調査・改善
  • 業務効率化・自動化
お問い合わせはこちら