MS Accessで作られた古いシステムの移行
MS AccessとVBAを使って構築されたレガシーシステムを、C#へ移行するために調べた記録
2024年5月3日
レガシーシステムの移行担当になった。
私の働いている会社では20年以上使われているMicrosoft Accessのシステムがあります。開発された当時は社内にシステム担当部署はなく、現場で詳しい人が手近にあるExcel/Accessで開発したものでした。当然コーディング規約や設計書などは無く、今となっては完全にブラックボックスで、技術的負債になってしまっています。
Accessのバージョンが上がるたびに不具合が発生し、複数社員が同時実行するとファイルが破損するなどの問題があるので、今回新システムへの移行を命じられました。
現在のシステム開発技術をつかって、どうすれば早く、不具合なく移行できるのか調べた結果を記事にしたいと思います。
Doxygenを使ったドキュメントの自動作成
移行対象のレガシーシステムは開発同時の設計書がないだけでなく、長年にわたって多くの人がコードを書き換えてきたため、まさしくスパゲッティーコードの状態です。そのため既存コードから設計書を生成するリバースエンジニアリングを実施して、システムの内部構造を理解したいと思いました。設計書の生成には、Doxygenを利用します。
Doxygen は、C++、C、Java、Objective-C、Python、IDL (Corba、Microsoft 風)、Fortran、VHDL、PHP、C# 向けのドキュメンテーション・システムです。 D にもある程度対応しています。
Doxygen には、次の3つの利点があります。
文書化されたソースファイルのセットから、 オンライン・ドキュメント・ブラウザ (HTML形式) やオフラインのリファレンス・マニュアル (形式) を生成することができます。 RTF (MS-Word)、PostScript、ハイパーリンク PDF、圧縮 HTML、Unix man ページ形式の出力もサポートされています。ドキュメントは、ソースから直接抽出されます。これにより、ドキュメントとソースコードの一貫性を保つことがとても容易になります。
Doxygen日本語公式サイトより引用
このDoxygenを使うため、Docker環境で動かせるようにして、GitHubへリポジトリを作成しました。docker-doxygen
DoxygenのVBA対応
Doxygenは標準ではMS ExcelやMS Accessで使われているVBAに対応していません。公式ページでは、VBAをDoxygenが理解できる言語に変換する方法が案内されています。
この方法で調査を続けるとsevoku氏がGitHubで公開しているdevoku/doxygen-vb-filterへ行き着いた。公式サイトでも案内されているMathias Henze氏のawkスクリプトを改良しているようだが、変換後のコードからメソッドの内部処理は削除されてしまう仕様になっています。
<summary>some function</summary> Public Function SampleFunction(ByVal > pFirst As Double) As Double Dim val As Double val = pFirst * 3 / 2 ' stupid example Return val End Function
and passed to doxygen as:
/** * <summary>some function</summary> */ public Function Double SampleFunction (Double pFirst) ;
sevoku/doxygen-vb-filter/wiki/Features-and-Limitationsより引用
Doxygenにはメソッドの呼び出し/被呼び出しの関係を図にしてくれる機能があり、これが内部処理の理解にとても役に立つと期待している。そのため、メソッドの内部処理は残したまま変換してもらえるとありがたです。
一方でVBAより仕様が新しいVB.NETならば、C#に変換できるオンラインサービスがいくつかありました。
VBA(VB6)からVB.NETへの変換
VBAから他の言語に変換するソフトウェアはなかなか見つかりませんでしたが、そんな中でもwwdenis氏のwwdenis/vbconverterが使えそうでした。
VisualStudoでビルドして実行するとダイアログが表示されて、VBA(VB6)のコードをペーストしてConvert
を実行するとC#に変換されたコードが出力されました。
まとめ
VBAのコードを移行する前段階として、wwdenis/vbconverterでC#へ変換し、Doxygenでドキュメントを作成して大まかに内部構造を理解するのが楽そうでした。