CATEGORY: EXCEL

VBA関数依存調査

  • この方法は、関数呼び出しに()を使っている前提
  • call Methodを取りたい場合は\bで挟むなど工夫が必要
fns=$(grep -hoE '^[[:space:]]*(Public[[:space:]]+|Private[[:space:]]+)?(Function|Sub)[[:space:]]+[[:alnum:]_]+' vba/*.bas |
      awk '{print $NF}' |
      sort -u)

for fn in $fns; do
    grep -nE "\b${fn}[[:space:]]*\(" vba/*.bas |
    grep -vE "^[^:]+:[0-9]+:[[:space:]]*(Public[[:space:]]+|Private[[:space:]]+)?(Function|Sub)[[:space:]]+${fn}\b" |
    sed "s|$| [呼び出し: ${fn}]|"
done

簡単にいうと、VBA(Visual Basic for Applications)の各 Function / Sub を見つけて、「それがどこで呼ばれているか」を一覧表示する処理です。

流れはこの5段階です。

  1. 関数・Subの定義を探す

    Public Function Foo()
    Private Sub Bar()
    

    ↓ Foo, Bar を取得

  2. 重複を削除

    Foo
    Bar
    Foo
    

    ↓

    Bar
    Foo
    
  3. 関数ごとに検索

    Foo(
    

    をVBAファイル全体から探す。

  4. 自分自身の定義行を除外

    Public Function Foo()
    

    は「呼び出し」ではないので除外。

  5. 呼び出し箇所に目印を付ける

    Module1.bas:25: Debug.Print Foo() [呼び出し: Foo]
    

つまり最終的には、

Foo はここで呼ばれている
Bar はここで呼ばれている
Baz はどこからも呼ばれていない

という情報を調べるためのスクリプトです。