和風スパゲティのレシピ

日本語でコーディングするExcelVBA

12本目:セル結合を解除

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

解説

セル結合して数値を按分する問題でした。

特にコード上の注意点はないかなと思います。


按分の計算はかなり丁寧に説明変数を用意しました。

複雑な計算を行う場合はこういった変数を用意しておくと、
最初は面倒ですが完成はかえって早くなったりします。


最初からこういった変数を使っていない場合でも、
置き換えてみるとロジックを整理しやすくなりますので、
困ったらこの方法を採用してみてください。