【VBAリファレンス】VBA練習問題VBA100本ノック 魔球編:2桁の最小公倍数を極めるアルゴリズム設計

スポンサーリンク

概要:数学的思考をVBAのロジックに落とし込む

VBA100本ノック「魔球編」として取り上げる今回のテーマは、2つの数値の「最小公倍数(LCM)」を求めるという、一見シンプルながら奥の深い課題です。単にループで値をインクリメントして判定するだけでは、プログラミングとしての美しさに欠けます。本稿では、数学の知恵である「最大公約数(GCD)を利用した計算式」をVBAで実装し、効率的かつ拡張性の高いコードを作成する手法を解説します。業務効率化において、数学的な裏付けを持つロジックは、予期せぬエラーを防ぎ、計算速度を飛躍的に向上させる鍵となります。

詳細解説:ユークリッドの互除法という武器

最小公倍数(Least Common Multiple)を求める際、最も効率的な方法は、最大公約数(Greatest Common Divisor)を先に求めることです。数学の公式として、以下の関係式が成り立ちます。

「2つの自然数 A, B の最小公倍数 = (A × B) ÷ 最大公約数」

この最大公約数を求めるために用いるのが「ユークリッドの互除法」です。これは、AをBで割った余りをrとしたとき、「AとBの最大公約数は、Bとrの最大公約数に等しい」という性質を利用します。VBAでこれを実装する場合、再帰処理を用いるか、あるいはWhileループを使用することで、極めて短時間で解を導き出せます。2桁の数値であれば計算負荷は皆無ですが、このアルゴリズムを習得しておくことで、将来的に大量のデータセットを扱う際や、複雑なロジックを組む際にも応用が利くようになります。

サンプルコード:洗練されたロジックの実装

以下に、最大公約数を求める関数と、それを利用して最小公倍数を算出するプロシージャを記述します。保守性と再利用性を考慮し、関数を独立させた設計にしています。


Option Explicit

' メイン処理:セル上の2つの数値から最小公倍数を計算する
Sub CalculateLCM_Main()
    Dim val1 As Long, val2 As Long
    Dim result As Long
    
    ' セルA1とB1から値を取得
    val1 = Cells(1, 1).Value
    val2 = Cells(1, 2).Value
    
    ' 0除算防止のチェック
    If val1 = 0 Or val2 = 0 Then
        MsgBox "数値を入力してください"
        Exit Sub
    End If
    
    ' 最小公倍数を計算
    result = GetLCM(val1, val2)
    
    ' 結果を表示
    Cells(1, 3).Value = result
End Sub

' 最小公倍数を求める関数
Function GetLCM(a As Long, b As Long) As Long
    ' 公式: (A * B) / GCD(A, B)
    ' オーバーフローを防ぐため、先に除算を行ってから乗算する工夫を推奨
    GetLCM = (a / GetGCD(a, b)) * b
End Function

' ユークリッドの互除法で最大公約数を求める関数
Function GetGCD(a As Long, b As Long) As Long
    Dim temp As Long
    Do While b <> 0
        temp = a Mod b
        a = b
        b = temp
    Loop
    GetGCD = a
End Function

実務アドバイス:なぜ「型」と「順序」が重要なのか

実務におけるVBA開発では、単に答えが合っているだけでは不十分です。本コードにおいて特に注意すべきは「オーバーフロー対策」と「計算順序」です。

1. 型の選択: 今回は2桁の数値という前提ですが、将来的に数値が大きくなる可能性があるなら、Long型(長整数型)を使用するのは鉄則です。Integer型では32,767までしか扱えず、少し大きな数値を扱うだけでエラーになります。
2. 計算順序の最適化: サンプルコード内で「(a / GetGCD(a, b)) * b」という順序にしているのは、先に掛け算を行うと一時的に巨大な数値となり、オーバーフローを招く可能性があるためです。小さな数値から処理するこの「割り算先行」のテクニックは、金融系のVBA開発現場でも頻繁に使われる防御的プログラミングの一種です。
3. 可読性の維持: GetGCDのような汎用的な関数は、標準モジュールにストックしておきましょう。プロジェクトごとに書き直すのではなく、共通のライブラリ(Personal.xlsbなど)に保存しておくことで、今後の開発スピードが劇的に向上します。

まとめ:ロジックの積み重ねがプロへの道

VBA100本ノックのような練習問題は、単なるクイズではありません。一つひとつの問題に対して、どのようなアルゴリズムが最適か、どのようにエラーを回避するか、そしてどうすれば他人が読みやすいコードになるかを考え抜くプロセスこそが、エンジニアとしての実力を高めます。

今回の「2桁の最小公倍数」というテーマを通じて、ユークリッドの互除法という強力な武器を手にしました。これは、単なる数学の問題を解くためではなく、業務の自動化において遭遇する「数値の規則性」を紐解くための重要な第一歩です。ぜひ、このコードをベースに、3つ以上の数値の最小公倍数を求めるように拡張したり、エラーハンドリングを強化したりするなど、自分なりのアレンジを加えてみてください。思考をコードに昇華させる習慣こそが、あなたをExcel VBAのスペシャリストへと導く唯一の道となります。日々の練習を積み重ね、魔球を自在に操れるレベルまでスキルを高めていきましょう。

タイトルとURLをコピーしました