Excel VBAで共通関数を作る方法!再利用性の高いコードを書くための設計術
生徒
「VBAで色々なツールを作っているのですが、いつも同じような計算式や処理を何度も書いていて、正直めんどくさいです……。」
先生
「それは『共通関数(きょうつうかんすう)』を作るタイミングですね!一度作れば、どのプログラムからでも呼び出せる便利な道具箱のようなものです。」
生徒
「道具箱ですか!なんだかプロっぽくてかっこいいですね。パソコン初心者の私でも、そんな再利用できるコードって書けますか?」
先生
「もちろんです。共通化の考え方は、お家の中で使う道具を整理するのと似ていますよ。効率的な設計術を一緒に学んでいきましょう!」
1. 共通関数とは?なぜ必要なのかを解説
Excel VBAにおける共通関数とは、特定の作業だけでなく、いろいろな場面で使い回せるように設計された「プログラムの部品」のことです。プログラミング用語では、一度書いたコードを何度も使うことを「再利用(さいりよう)」と呼びます。
例えば、料理をするときに「毎回いちから出汁をとる」のではなく、「作り置きの万能だし」を冷蔵庫に入れておくようなイメージです。これがあれば、お吸い物にも煮物にも、サッと使うことができますよね。VBAも同じです。よく使う処理(消費税の計算、日付の変換、文字の抜き出しなど)を一つの関数として独立させておくことで、作業時間が短縮され、記述ミスも劇的に減らすことができるのです。
2. 再利用性が高いコードと低いコードの違い
「再利用性が高い」と言われても、初心者の方には少しピンとこないかもしれません。簡単に言うと、「特定の場所に依存していないかどうか」が分かれ道になります。
例えば、「セルA1の値を読み取って計算する」というコードは、セルA1にしか使えないため再利用性が低いです。一方で、「渡された数字を1.1倍にして返す」というコードは、どのセルの数字に対しても使えるため再利用性が高いと言えます。共通関数を作るときは、特定のシート名やセル番地を直接書かないようにするのが鉄則です。これを意識するだけで、あなたの書くVBAコードはプロ級の設計に一歩近づきます。
3. 基本!標準モジュールに共通関数を配置する
共通関数をどこでも使えるようにするには、VBAの画面(エディタ)で「標準モジュール」という場所に書く必要があります。ここは、Excelブック全体から見える「共有スペース」のような場所です。
共通関数を作る際は Public Function(パブリック・ファンクション)という宣言を使います。Public は「みんなが見える」という意味です。これにより、別のシートや別のボタンからでも、その関数を呼び出すことが可能になります。まずは、どこからでも使える「数字をチェックする」簡単な部品を作ってみましょう。
' 数字がマイナスかどうかを判定する共通関数
Public Function IsNegative(val As Long) As Boolean
If val < 0 Then
IsNegative = True
Else
IsNegative = False
End If
End Function
' 呼び出し側のテスト用コード
Sub CheckStock()
Dim stockCount As Long
stockCount = -5 ' 在庫がマイナスの想定
' 共通関数を呼び出して判定
If IsNegative(stockCount) Then
MsgBox "在庫が不足しています!"
End If
End Sub
4. 設計のコツ:入力と出力を明確にする
良い共通関数を作るためには、「何を入れて(入力)、何を出すか(出力)」をはっきりさせることが重要です。これをプログラムの世界では「インターフェースの設計」と呼んだりします。
初心者の方は、まず「一つの関数には一つの仕事だけ」をさせるようにしましょう。例えば、「計算をして、その結果をメッセージボックスで表示する」という二つの仕事を一つの関数に詰め込むのはおすすめしません。計算は計算だけ、表示は表示だけ、と分けることで、あとから「計算結果だけをメールで送りたい」となったときに、計算部分の関数をそのまま再利用できるからです。
5. 実践!汎用的な日付フォーマット作成関数
実務でよくある「日付を特定の形式の文字に変換する」処理を共通化してみましょう。Excelのシリアル値を、「〇〇年〇月〇日(曜日)」という丁寧な形式に変える道具を作ります。
' 日付を日本語のフル形式に変換する共通部品
Public Function GetJapaneseDate(targetDate As Date) As String
' Format関数を使って形を整える
GetJapaneseDate = Format(targetDate, "yyyy年mm月dd日(aaaa)")
End Function
' メインの処理
Sub ShowToday()
Dim todayStr As String
' 今日の日付を渡して、変換された文字を受け取る
todayStr = GetJapaneseDate(Date)
MsgBox "本日は " & todayStr & " です。"
End Sub
この関数 GetJapaneseDate は、日付さえ渡せばどこでも使えます。見積書の作成でも、ログの記録でも、日付を綺麗に表示したいときにいつでも呼び出せる、まさに「再利用性の高い」コードです。
6. 引数を活用してカスタマイズ性を高める
共通関数をもっと便利にするには、「引数(ひきすう)」を上手に使います。引数とは、関数に渡す「味付けの指示」のようなものです。指示のバリエーションを増やすことで、一つの関数が対応できる幅が広がります。
例えば、消費税計算の関数を作るとき、税率を引数として渡せるようにしておけば、将来税率が変わっても、呼び出す側の数字を変えるだけで対応できます。このように、中身を直接書き換えるのではなく、外からの指示で動きを変えられるように作るのが設計の腕の見せどころです。
7. 実践!安全に数値へ変換する「エラー回避」関数
パソコンの操作に慣れていない人がデータ入力をすると、数字を入れる場所に全角文字や空白が入ってしまうことがあります。そんなとき、そのまま計算するとエラーで止まってしまいますよね。これを防ぐための「安全な数値変換」共通関数を作ってみましょう。
' 文字を数値に変換する。変換できない場合は0を返す安全な関数
Public Function SafeVal(inputData As Variant) As Double
' 数字として認識できるか確認
If IsNumeric(inputData) Then
SafeVal = CDbl(inputData)
Else
SafeVal = 0
End If
End Function
' 集計処理などで使う例
Sub SumCells()
Dim rawData As String
rawData = "123" ' 全角文字が入ってしまった場合
Dim cleanValue As Double
' 安全に関数を通して数値化
cleanValue = SafeVal(rawData)
MsgBox "計算に使う数値は " & cleanValue & " です。"
End Sub
8. 共通関数を管理する「名前の付け方」のルール
共通関数が増えてくると、どれが何をするものか分からなくなってしまうことがあります。そうならないために、自分なりのネーミングルールを決めましょう。一般的には、「動詞+名詞」の形で名前を付けると分かりやすいです。
- Get~:何かを取得して返すとき(例:GetName, GetPrice)
- Is~:YesかNoかを判定するとき(例:IsFinished, IsValid)
- Calc~:複雑な計算をするとき(例:CalcTax, CalcSalary)
このように名前を統一しておくと、あとで自分がコードを読み返したときに、「あ、これは値を取得する関数だな」とすぐに判断できます。パソコン初心者の方も、この「整理整頓のルール」を守るだけで、驚くほど読みやすいプログラムが書けるようになります。
9. メンテナンスを楽にする「一箇所修正」の魅力
共通関数の最大のメリットは、修正が一度で済むことです。例えば、社内の計算ルールが変更になったとき、共通関数を使わずに10個のプログラムにバラバラに計算式を書いていたら、10箇所すべてを直して回らなければなりません。これは非常に大変ですし、直し忘れのミスも起きます。
しかし、共通関数を呼び出す形にしていれば、直すのは共通関数のたった一箇所だけで完了します。修正した瞬間、その関数を呼び出しているすべてのプログラムに新しいルールが適用されるのです。この「一箇所を直せば全部が直る」という感覚を味わうと、もう共通化なしのプログラミングには戻れなくなりますよ。
10. 最後に:自分だけのライブラリを作ろう
これまで学んだ共通関数を一つの「標準モジュール」に溜めていくと、それはあなただけの最強の「ライブラリ(図書館・蔵書)」になります。新しいツールを作るときに、そのモジュールをコピーするだけで、過去に作った便利な部品がすぐに使えるようになるのです。
最初は一行のコードでも構いません。「これ、また使うかもな」と思ったら、積極的に関数として切り出してみてください。その積み重ねが、将来のあなたの仕事を何倍も速く、そして正確にしてくれるはずです。焦らず、一歩ずつ自分専用の便利な道具箱を豊かにしていきましょう!