Excelで特定の条件でデータを抽出できるオートフィルター。
マクロでオートフィルターを使って行削除をするという処理の流れをまとめてみました。
オートフィルターで行削除をするには?
今回の事例は仕訳データのうちから必要ないデータを消すというものです。
通常、抽出したいデータだけを検索(今回は摘要で「消費税分解」と検索)し、
表示されたデータを一括で選択して行削除をします。
これはこれでいいのですが、件数が多い場合、毎月処理が必要な場合は手間がかかります。
それをExcelマクロでやることができます。
オートフィルターで抽出して削除
今回書いてみたマクロはこういったものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
'消費税分解のデータ削除 '消費税分解のデータ削除 Sub contax_Delete() Application.ScreenUpdating = False '---画面の表示更新をオフ--- Application.Calculation = xlManual '---自動計算をオフ--- '消費税分解の摘要を抽出 Range("A1").AutoFilter Field:=13, Criteria1:="消費税分解" '行数を1つだけ減らして見出しを範囲からはずして行削除 Application.DisplayAlerts = False With Range("A1").CurrentRegion 'すべてのセル範囲 .Resize(.Rows.Count - 1).Offset(1, 0).EntireRow.Delete End With 'オートフィルタを解除 Range("A1").AutoFilter Application.Calculation = xlAutomatic '画面の表示更新をオン Application.ScreenUpdating = True '自動計算をオン End Sub |
このマクロを解説してみます。
オートフィルターで特定の行だけを表示
オートフィルターをかけるデータの1番端の列のセル、A1。
1 |
Range("A1").AutoFilter Field:=13, Criteria1:="消費税分解" |
今回、フィルターで抽出したいのは「消費税分解」はM列。
A列から数えて13列目のセルです。それを「Field:=13」としています。
で、「Criteria1:=”消費税分解”」は、M列のフィルタで検索したい文字列。
これで、オートフィルターでM列に「消費税分解」のデータが入った行だけが表示されます。
範囲をずらして見出しを除いてデータだけを選ぶ
次です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
'行数を1つだけ減らして見出しを範囲からはずして行削除 With Range("A1").CurrentRegion 'すべてのセル範囲 .Resize(.Rows.Count - 1).Offset(1, 0).EntireRow.Delete End With 'オートフィルタを解除 Range("A1").AutoFilter Application.Calculation = xlAutomatic '画面の表示更新をオン Application.ScreenUpdating = True '自動計算をオン End Sub |
「Range(“A1”).CurrentRegion」はA1セルで「Ctrl+A」で全範囲のデータを選択した状態。
シートに見出しのあるテーブルがある場合、テーブル全体が選択されます。
これはテーブルでCtrl+Aをやってみていたければわかるかと。
この時点では、見出しから一番下の行までが選択された状態です。
1 2 3 4 5 6 |
'行数を1つだけ減らして見出しを範囲からはずして行削除 With Range("A1").CurrentRegion 'すべてのセル範囲 .Resize(.Rows.Count - 1).Offset(1, 0).EntireRow.Delete End With |
範囲選択したセル範囲の行数は「.Rows.Count」でカウントします。
で「.Resize(.Rows.Count – 1)」として「-1」で一番下の行の1つ上。選択範囲を1行分サイズを小さくしています。
最後に見出し行(1行目)を削除の対象からはずすために、選択範囲の行数と列数を変えずに選択範囲を1行下にずらします。
これをOffset(行,列)を使ってやっています。1行下なのでOffset(1,0)。
結果、見出しは行削除の対象には含まれずにデータだけを選ぶことができます。
最後に「.EntireRow.Delete」で行全体を削除し、
1 2 3 |
'オートフィルタを解除 Range("A1").AutoFilter |
オートフィルターをもとに戻しています。
というわけで、オートフィルターで抽出したデータをマクロで一括削除する方法をまとめてみました。
人の手とマクロでかかる時間の比較
最後に、今回の例で1006行のデータから削除したいデータだけを抽出して、削除するのに何秒かかるかを測ってみました。
手でやるのとマクロでやった場合の比較です。
じぶんの手でやる場合には
- フィルターをクリック
- 抽出したい「消費税分解」を検索
- 1行を選択
- 表示された行を全指定
- データ一括削除
という処理を流れです。
これでかかる時間は18.75秒。わたしが遅いのかもしれませんが。
いっぽうでマクロでやった場合にかかる時間は、0.35秒。1秒かかりません。
やったのはF5キーをクリックしてマクロを動かしただけ。
ただし、前述したようにどうやって動いてほしいかは伝えています。
1回限りの処理ならともかく、その後にも何度か処理する可能性があるなら積もる時間はそれなりです。
マクロを書くのに時間はかかりますが、一度動かすことができればその効果は同じ処理をする限りはずっと続きます。
Excelマクロをやってみると、じぶんの手で何度もやっていることは自動化できないかと気づけるようにもなりますし、仕事のやり方を変えることもできます。
一部の処理だけでもじぶんが望めば自動化を目指せますから。
プログラミングは手こずってもその後に上手く動いてくれたときに、めちゃくちゃテンションが上ります。おすすめのスキルです。
【編集後記】
昨日は午後から相続の打合せ。先日買ったモバイルディスプレイを使って相続人の方全員に説明。方向性は決まりました。
あとは申告です。
【昨日の1日1新】
※「1日1新」→詳細はコチラ
珈琲屋のプリン クリームチーズ
Parallels Desktop18