日報を快適にするVBA~結合セルのデータクリア
【今回の問題】
このような日報の一週間分のデータを消去してください。
この日報をみて、まず愕然としました。
結合セルだらけではないですか💦
結合セルのデータはどうやって消去したらいいの?
早速試行錯誤してみました。
まずは結合セルをすべて範囲で指定してデータをクリア。
とりあえず、最初の日付と業務の報告をクリアしてみましょう。
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パターンの書き方があることがわかりました。
これで、一週間分の日報のデータを消去して使いまわしができますね。
ただ、消去して上書き保存してしまうと、前のデータが残らないので、まず名前を付けて保存で、新たなファイルとして保存してからデータを消去するようにしましょう。