Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、
「VBA100本ノック」に対する私の回答と解説のページです。
100本ノックの出題リストはこちらから
excel-ubara.com
出題:セル結合を解除
#VBA100本ノック 12本目
A1から始まる表範囲のC列に金額が入っています。
しかし、ところどころに結合されたセルがあります。
セル結合を解除し、入っている金額を整数で均等に割り振ってください。(2枚目画像)
端数処理方法は任意とします。
※結合セルには正の整数しか入っていません。

◇ 出題ページはこちら
ソースコード
Option Explicit ' 100本ノック012:セル結合を解除 Sub 金額列のセル結合を解除して金額を均等に配分する() Dim 結合セル範囲 As Range Dim 合計金額 As Long, 分配セル数 As Long, Int等分金額 As Long, 不足金額 As Long ' データ全行をループ Dim R As Long For R = R1stデータ To Get最終行(WSデータ) ' 結合先頭セルに対して処理 If Is結合先頭セル(WSデータ.Cells(R, CNoデータ.金額)) Then ' 範囲を取得して結合解除 Set 結合セル範囲 = WSデータ.Cells(R, CNoデータ.金額).MergeArea 結合セル範囲.UnMerge ' 各種計算 合計金額 = 結合セル範囲.Cells(1).Value 分配セル数 = 結合セル範囲.Cells.Count Int等分金額 = Int(合計金額 / 分配セル数) ' 各セルに一旦切り捨てた等分値を入力 結合セル範囲.Value = Int等分金額 ' 足りない値を上から1ずつ追加 不足金額 = 合計金額 - Int等分金額 * 分配セル数 結合セル範囲.Resize(不足金額) = Int等分金額 + 1 End If Next End Sub
解説
セル結合して数値を按分する問題でした。
特にコード上の注意点はないかなと思います。
按分の計算はかなり丁寧に説明変数を用意しました。
複雑な計算を行う場合はこういった変数を用意しておくと、
最初は面倒ですが完成はかえって早くなったりします。
最初からこういった変数を使っていない場合でも、
置き換えてみるとロジックを整理しやすくなりますので、
困ったらこの方法を採用してみてください。