Excelで既存の表を再利用しようとした時、下図のような表しかなく、愕然としたことはないでしょうか。

見ばえを良くしようとした結果(?)、セルが上下左右に結合されまくっていて、オートフィルターもまともに機能しない、集計もできない、VLOOKUPもちゃんとひっかからない、あげく、コピー&ペーストすらうまくいかなかったり・・・
私も事務仕事に従事している都合上、このようなダメダメデータに困らされることがありましたので、一発で使えるデータに整形するマクロをVBAで作成しました。
完成したマクロの動作
作成したマクロの動作は下記のような感じです。
ダメダメな結合しまくり表が、一発で整ったデータに整形できます。

使い方
こちらからダウンロードしてご利用ください。
以下、一番簡単な方法のみ説明します。
- ダウンロードした「結合された表をどうにかする.xlsm」を開く
- 整形したい表が含まれているExcelファイルを開く
- 整形したい表の範囲を選択した状態で ALT キーを押しながら f8 キーを押す
- 結合された表をどうにかする.xlsm!結合された表を整形するを選択し実行(R)

上記手順を行えば、新しいシートに整形後の表が作成されます。
ソースコード
拙いですが、ソースコードを掲載します。
私のプログラミング能力は全然高くないので、不備とか改善点などあるかと思います。お気づきの点などありましたら、コメント欄等でご連絡いただけますと幸いです。
Option Explicit
Sub 結合された表を整形する()
'初期処理
Application.ScreenUpdating = False
'選択範囲の確認
If Selection.Count = 1 Then
MsgBox ("処理する対象範囲を選択してから実行してください")
Exit Sub
End If
'選択範囲の情報取得/コピー
Dim RowCnt As Long: RowCnt = Selection(Selection.Count).Row - Selection(1).Row + 1
Dim ColCnt As Long: ColCnt = Selection(Selection.Count).Column - Selection(1).Column + 1
Selection.Copy
'処理結果シートの作成
Dim OutWs As Worksheet
Set OutWs = Worksheets.Add(After:=Worksheets(Worksheets.Count))
'処理結果シートに元表をペースト
OutWs.Paste Destination:=Range("A1")
'Excel方眼紙を通常の表に修正する
Dim r As Long
For r = RowCnt To 1 Step -1
If WorksheetFunction.CountA(Range(Cells(r, 1), Cells(r, ColCnt))) = 0 Then
Rows(r).Delete
RowCnt = RowCnt - 1
End If
Next r
Dim c As Long
For c = ColCnt To 1 Step -1
If WorksheetFunction.CountA(Range(Cells(1, c), Cells(RowCnt, c))) = 0 Then
Columns(c).Delete
ColCnt = ColCnt - 1
End If
Next c
'結合解除/データ複製
Dim MgArea As Range
Dim Rng
For r = 1 To RowCnt
For c = 1 To ColCnt
If Cells(r, c).MergeCells Then
Set MgArea = Cells(r, c).MergeArea
MgArea.UnMerge
Cells(r, c).Copy
For Each Rng In MgArea
Rng.PasteSpecial
Next Rng
End If
Next c
Next r
'外観を整える
Cells.Rows.AutoFit
Cells.Columns.AutoFit
Range(Cells(1, 1), Cells(RowCnt, ColCnt)).Borders.LineStyle = True
'終了処理
Application.ScreenUpdating = True
MsgBox ("表の整形が完了しました")
End Sub
このコードの主な部分は、下記の部分だと思います。
If Cells(r, c).MergeCells Then
Set MgArea = Cells(r, c).MergeArea
MgArea.UnMerge
Cells(r, c).Copy
For Each Rng In MgArea
Rng.PasteSpecial
Next Rng
End If
表の左上からスタートして、右下に向かって全セルをチェックしていく中で、
セルが結合されているかどうかを、.MergeCellsで判定します。
結合されていた場合は、.MergeAreaで結合されているセルのRangeを取得します。
その後、.Unmergeで結合を解除。
結合を解除すると、結合されていたセルは一番左上のセル以外は空白になってしまうので、一番左上のセルをコピー・ペーストします。
これを表の全セル分行えば、整形が完了です。
まとめ
Twitterでたくさんの方に反応していただいて、セル結合された表に対して、思うところがある人が多いんだなぁ・・・とあらためて思いました。
この記事が少しでも役に立てば幸いです。

コメント