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 はどこからも呼ばれていない

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