Excel VBAを複数人で開発するコツ!プロジェクト構成と共有運用のルールを徹底解説
生徒
「先生、職場のチームみんなで一つのExcelマクロを作ることになったんです。でも、誰かが直している間に他の人が上書きしちゃいそうで怖いです。」
先生
「それは大切な視点ですね。Excel VBAは普通に使うと一人用ですが、工夫次第で複数人でも安全に開発できるんですよ。」
生徒
「プロジェクト構成や運用ルールを決めればいいって聞いたんですけど、具体的にどうすればいいんですか?」
先生
「まずは、プログラムの部品をどう分けるか、そして誰がどこを触るかの『約束事』を作ることです。初心者の人にも分かりやすく解説しますね!」
1. 複数人でのVBA開発が難しい理由とは?
Excel VBA(ブイビーエー)は、一つのExcelファイルの中にプログラムを書き込んでいく仕組みです。この「一つのファイルに全部入っている」という特徴が、複数人で作業するときに大きな壁となります。
例えば、同じファイルを共有フォルダに置いて、AさんとBさんが同時に開いてプログラムを書き換えたとしましょう。後から保存した人の内容で上書きされてしまい、先に作業した人のプログラムが消えてしまうのです。これを「先祖返り」や「上書き競合」と呼びます。
また、プログラムが巨大な一塊になっていると、どこを誰が直したのか分からなくなり、エラーが起きたときの原因究明も困難になります。これらの問題を解決するために、「プロジェクト構成」と「運用ルール」をしっかり決める必要があるのです。
2. プロジェクト構成の基本「モジュール分割」
複数人で開発をスムーズに進めるための第一歩は、プログラムを適切な単位で切り分けることです。VBAでは、プログラムを書く場所を「モジュール」と呼びます。一つの大きなモジュールに全てを書くのではなく、機能ごとに「標準モジュール」を分けて作成しましょう。
例えば、以下のように役割を分担します。
- Mainモジュール:全体の流れを制御する担当
- Importモジュール:外部データを取り込む処理の担当
- Calcモジュール:計算やデータ加工を行う担当
- Exportモジュール:結果をファイルに出力する担当
このように分けておけば、「今日はAさんが計算担当、Bさんが出力担当」というように、触る場所を物理的に分けることができます。まずは、誰でも読める簡単なプログラムでモジュールを分けるイメージを見てみましょう。
'【Calcモジュール】に記述する例
Function CalculateTax(price As Long) As Long
' 消費税を計算する専用の部品
CalculateTax = price * 1.1
End Function
'【Mainモジュール】に記述する例
Sub MainProcess()
Dim total As Long
' 別モジュールの部品を呼び出して使う
total = CalculateTax(1000)
MsgBox "税込価格は " & total & " 円です。"
End Sub
3. 開発用と本番用ファイルを分離するルール
パソコン操作に慣れていない方がやりがちなのが、今みんなが使っている「本番ファイル」を直接作り変えてしまうことです。これは非常に危険です。改造中にエラーが出ると、業務が止まってしまいます。
必ず「開発用ファイル(マスタ)」と「実行用ファイル(配布用)」を分けましょう。開発者は自分のパソコンにコピーした開発用ファイルで作業し、テストが終わって完成したときだけ、中身を本番用として更新します。
ファイルを分ける際は、ファイル名に日付やバージョンを付けるのも良いルールです。例えば 業務自動化_v1.0_20240501.xlsm のように管理します。これなら「どれが最新か分からない!」という混乱を防げます。
4. インポート・エクスポート機能を活用した共有方法
VBAのプログラム(モジュール)は、実はファイルとして書き出したり、取り込んだりすることができます。これを「エクスポート」と「インポート」と言います。
複数人で開発する場合、Excelファイルそのものをやり取りするのではなく、修正した「モジュールファイル(.bas形式など)」だけをやり取りするのがスマートです。Aさんが修正した Calc.bas を、プロジェクトリーダーがメインのExcelファイルに取り込んで統合する、という流れを作ると上書きミスが減ります。
初心者のうちは難しく感じるかもしれませんが、「プログラムだけを抜き出して交換する」というイメージを持っておくだけで、チーム開発の質がぐんと上がります。
5. 変数の命名規則とコメントの徹底
一人で書いているときは自分さえ分かれば良いですが、複数人ではそうはいきません。他人が書いたプログラムを見て「この x っていう箱(変数)には何が入っているの?」と迷わせないようにしましょう。プログラムの中で値を入れておく箱を「変数(へんすう)」と言います。
変数の名前は、中身がひと目で分かる名前にします。また、プログラムの冒頭には「誰が」「いつ」「何の目的で」作ったのかを、「コメント」として残すルールを作りましょう。VBAでは '(シングルクォーテーション)を付けると、その行はプログラムとして動かなくなり、メモ書きとして使えます。
' 作成者:田中
' 作成日:2024/05/20
' 概要:売上データから合計値を算出する
Sub CalculateTotalSales()
Dim totalSalesAmount As Long ' 合計売上金額を入れる箱
Dim rowCount As Integer ' データの行数を数える箱
' ここに処理を書いていく
End Sub
6. 共通して使える「便利ツール」を外出しする
複数人でバラバラに作っていると、似たような処理(例えば「最終行を取得する」や「メッセージを表示する」など)を全員が別々に書いてしまうことがあります。これは効率が悪いです。そこで、誰でも使える「共通関数(ユーティリティ)」を用意しましょう。
共通の道具箱を作っておけば、開発スピードが上がるだけでなく、バグが見つかったときもその道具箱を一箇所直すだけで全員分が修正されます。これを「部品の再利用」と呼び、プログラミングではとても重要な考え方です。
'【Commonモジュール】誰でも使える共通の道具箱
Function GetLastRow(sh As Worksheet) As Long
' 指定したシートの最後の行番号を教えてくれる便利な道具
GetLastRow = sh.Cells(sh.Rows.Count, 1).End(xlUp).Row
End Function
'【Userモジュール】各担当者が使う
Sub ProcessData()
Dim lastRow As Long
' 共通の道具を呼び出す
lastRow = GetLastRow(ActiveSheet)
MsgBox "データは " & lastRow & " 行目まであります。"
End Sub
7. 変更履歴(ログ)をシートに残す運用
最後に、システムの中に「いつ、誰が、何をしたか」を記録する隠しシート(履歴シート)を作る運用をおすすめします。複数人で開発・運用していると、「急に動かなくなったけれど、最後に誰がどこを触ったのか分からない」という事態が必ず起きます。
「4月1日に佐藤さんが消費税率を10%に変更した」といった履歴が残っていれば、トラブル時の復旧が圧倒的に早くなります。これはプログラムの修正履歴だけでなく、マクロを実行した記録を残すのにも役立ちます。
8. 参照設定の共有エラーを防ぐ注意点
VBAには、Excel以外の機能(Outlookでメールを送る、PDFを作るなど)を使うための「参照設定」という設定項目があります。これはパソコンごとに設定が保存される場合があるため、Aさんのパソコンでは動くのに、Bさんのパソコンでは「参照不可」というエラーで動かない、ということがよくあります。
チームで開発する場合は、できるだけこの参照設定を使わずに済む「実行時バインディング(Late Binding)」という書き方を使うか、使う設定をチーム内で統一してドキュメントに記しておく必要があります。これは少し高度な話ですが、「人のパソコンでは動かないことがある」という点だけは覚えておきましょう。
9. 開発完了後のピアレビュー(読み合わせ)
一人で完成させて終わりにするのではなく、最後に他のメンバーにプログラムを読んでもらう「レビュー」の時間を持ちましょう。自分では完璧だと思っていても、他の人が見ると「ここはもっと簡単に書けるよ」「ここにエラーが起きそうな隙があるよ」と気づけるものです。
この読み合わせをすることで、チーム全体のVBAスキルも向上し、誰かが急に休んでも他の人がメンテナンスできる「強いチーム」になれます。プログラミング未経験の方でも、他の人のコードを見ることは非常に勉強になりますよ。