オブジェクトブラウザーは VBA のオブジェクト構造を記述したものである.しかし,EXCEL 全体のオブジェクトモデルを一覧できるような機能はない.今回,全く別領域のソフトウェアを用いて EXCEL のオブジェクトモデルを表現してみたので備忘録として公開する.
Cytoscapeとは
ネットワークモデルはグラフで表現したモデルのことで,ノード(節)とエッジ(パス)からなる.特殊例として階層型モデル,木構造などがある.
Cytoscape は日本人が開発したネットワークモデルを可視化するソフトウェアである.もともとは代謝マップ,遺伝学的相互作用,タンパク質相互作用,転写制御ネットワークなど,ライフサイエンスデータを可視化するために作られた経緯がある.しかし,その汎用性はその領域に限らず,応用範囲は極めて広い.
EXCELのオブジェクト構造を可視化したい
手元にオブジェクトブラウザーの一覧がある.クラス,メンバー,戻り値の3列に参照設定のファイル名およびライブラリ名の 2 列を加えた 5 列からなるテーブルである.これを可視化してみたい.特にオブジェクト間の関係を可視化したい.
EXCEL のバージョン
EXCEL のバージョンは2104, ビルド 13929.20386 である.16.0.13929.20360 とも表記する.
Cytoscapeをインストールする
インストーラはここにある.
Cytoscapeの起動
Cytoscape初期画面
yFiles Layout Algorithms をインストール
グラフの表現においては yFiles Layout Algorithms のインストールが必須と言える.
Apps メニューの App Manager… を選択する.
App Manager ダイアログが開く.
中段を下にスクロールしていくと yFiles Layout Algorithms が見つかるのでクリックして選択し Install ボタンをクリックする.
Accept をクリックして yFiles Layout Algorithms のソフトウェアライセンスを了承する.
インストール後の Layout メニュー.yFiles Layout Algorithms が使用できるようになっている.
こちらはインストール前.グレーアウトしていて使用できない.
EXCEL ファイルをドラッグアンドドロップ
左側のペインに EXCEL のファイルをドラッグアンドドロップする.
Import Network From Table ダイアログが開く.
クラスを Source Node に,メンバーを Interaction Type に,戻り値を Target Node に指定
オブジェクトブラウザーでのクラスを Source Node と指定し,戻り値を Target Node と指定することで有向グラフとなる.
緑の丸が Source Node である.
紫の三角が Interaction Type である.
オレンジの的が Target Node である.
Source Node, Interaction Type, Target Node を指定した状態.ここで OK をクリックすると描画される.
初期設定は Prefuse Force Directed OpenCL Layout
初期設定は Prefuse Force Directed OpenCL Layout であるが,密集していて分かりづらい.様々なレイアウトを試していくことにする.
yFiles Circular Layout
yFiles Circular Layout は見た目はすっきりしている.
yFiles Hierarchic Layout
yFiles Hierarchic Layout はオブジェクトの階層関係が分かりやすい.
yFiles Organic Layout
yFiles Organic Layout は自然なレイアウトになっていると感じる.
Range オブジェクトを探す
EXCEL VBA においては Range オブジェクトの取得が必須である.上に挙げた代表的なレイアウトのうち,yFiles Hierarchic Layout から Range オブジェクトを探してみる.
中段の右寄りにある.様々なオブジェクトからエッジが集中しており,Range オブジェクト自体へもエッジが出力している.ちなみに上段の中央でエッジの集中しているのは Application オブジェクトである.
まとめ
オブジェクトブラウザーから抽出したテーブルを元に,Cytoscape を用いて有向性グラフを作成し,オブジェクト間の構造を可視化した.オブジェクトの階層関係を見るには yFiles Hierarchic Layout が有効であった.
今後の課題としては,任意のオブジェクトを選択した際,下位のオブジェクトを自動で釣り上げられるようにしたい.SQL だと再帰クエリを使うことになるが,Cytoscape 単独で可能か否か,わからない.
筆者は Cytoscape の使用法に関しては素人である.他にもっと有効な使用法があると思われるが,コミュニティの中で議論されたい.参考までに今回の可視化に使用したデータファイルを置いておく.文字コードは UTF8 である.1行目はヘッダーで REFERENCE, LIBRARY, CLASS, MEMBER, RETURN である.
制限事項として,オブジェクトモデルのみのデータファイル(1057行)であり,戻り値を持たないSubプロシージャ,Long, Single, Double, String, Object, Variant, その他単なるデータ型を返すプロパティや関数,イベントを削除してある.その際,文脈により暗黙の型変換が起こるObjectやVariantも削除されている可能性があるため,不完全なモデルである.
Property, Sub, Functionすべてを網羅したデータファイルについてはこちらを参照されたい.