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段階です。
-
関数・Subの定義を探す
Public Function Foo() Private Sub Bar()↓
Foo,Barを取得 -
重複を削除
Foo Bar Foo↓
Bar Foo -
関数ごとに検索
Foo(をVBAファイル全体から探す。
-
自分自身の定義行を除外
Public Function Foo()は「呼び出し」ではないので除外。
-
呼び出し箇所に目印を付ける
Module1.bas:25: Debug.Print Foo() [呼び出し: Foo]
つまり最終的には、
Foo はここで呼ばれている
Bar はここで呼ばれている
Baz はどこからも呼ばれていない
という情報を調べるためのスクリプトです。