VBAデバッグの鬼

日報を快適にするVBA~結合セルのデータクリア

【今回の問題】
f:id:vba-tokepi:20210620053014j:plain

このような日報の一週間分のデータを消去してください。

この日報をみて、まず愕然としました。

結合セルだらけではないですか💦

結合セルのデータはどうやって消去したらいいの?

早速試行錯誤してみました。

まずは結合セルをすべて範囲で指定してデータをクリア。
とりあえず、最初の日付と業務の報告をクリアしてみましょう。

Sub データのクリア()

Range(Cells(4, 1), Cells(5, 1)).ClearContents
Range(Cells(5, 2), Cells(6, 5)).ClearContents


End Sub

お?!問題なくデータをクリアできますね。

ではfor文を使ってすべての日付をクリアしてみましょう。

Sub データのクリア()
Dim i As Long

For i = 4 To 29

Range(Cells(i, 1), Cells(i + 1, 1)).ClearContents
Range(Cells(i + 1, 2), Cells(i + 2, 5)).ClearContents

i = i + 4
Next

End Sub

これも問題なく動いてくれました。

それにしてもRangeの中にさらにCellsを書き込む方法だと見栄えがすっきりしませんね。
始点と終点の二つのセルを書かなきゃいけないというのも、いちいち面倒です。
結合セルは4つもあるので、無駄にセルをカウントすることなく、なんとかすっきりさせたいものです。

そこで、結合セルの扱いについてググってみたのですが、便利なプロパティを発見しましt。
MergeAreaです。

結合セルの一番左上のセルを指定してMergeAreaプロパティをくっつけてやると、指定したセルを含むすべての結合セルを選択してくれます。

Sub データのクリア()

Cells(4, 1).MergeArea.ClearContents
Cells(5, 2).MergeArea.ClearContents

End Sub

これでいいんですね。
ちょっとすっきりして見えませんか?
セルを一つしか指定しなくていいので、らくちんです。

というわけで、一週間分の日報データを消去するマクロを書いたのがこちら。

Sub データ削除テスト()
Dim i As Long, j As Long
Dim selectedButton As Long

selectedButton = MsgBox("データを消しますがいいですか?", Buttons:=vbYesNo)

If selectedButton = vbYes Then

  For i = 4 To 29

    Cells(i, 1).MergeArea.ClearContents
    Cells(i + 1, 2).MergeArea.ClearContents
    Cells(i + 1, 6).MergeArea.ClearContents
    Cells(i + 4, 1).ClearContents
    Cells(i + 4, 2).ClearContents
    Cells(i + 4, 3).ClearContents
    Cells(i + 4, 4).MergeArea.ClearContents
    Cells(i + 4, 6).ClearContents
    Cells(i + 4, 8).ClearContents
    Cells(i + 4, 9).ClearContents
    Cells(i + 4, 11).ClearContents
  
  i = i + 4

  Next

ElseIf selectedButton = vbNo Then
    Exit Sub
    
Else
    Exit Sub

End If

End Sub

ボタンを押すと一週間分のデータを消去するという仕様にしますが、ボタンを押したらいきなり消去では、間違ってボタンを押しちゃったときに取り返しつかないですよね。
誤動作確認のために、メッセージボックスで「データを消しますがいいですか?」と念押しすることにしました。
ユーザー目線大事です。マクロにも優しさと配慮を心がけましょう。

結合セルのデータを消去するには2パターンの書き方があることがわかりました。
これで、一週間分の日報のデータを消去して使いまわしができますね。

ただ、消去して上書き保存してしまうと、前のデータが残らないので、まず名前を付けて保存で、新たなファイルとして保存してからデータを消去するようにしましょう。