僕は仕事でよくエクセルを使うのですが、今回はエクセルの効率を上げる技を紹介します。
というか自分のメモ代わりに書いていきます。
※参考ファイルをダウンロードできるようにしておきます。
空白行を削除するEXCELファイル
エクセルの表の空白行を自動で削除するVBA
VBAっていうのはプログラミングみたいなもんで、マクロとか言ったりする人もいます(意味は全然違いますが)。
で、具体的にどういったことをするのかを説明します。
エクセルは表ってよく使うじゃないですか。その最後の方の行が空白になってる事ってよくありますよね。以下の画像のように。
この空白行をワンクリックで削除する方法を説明しようと思います。
VBAを使うと以下のように簡単に表が完成します。
▲ワンクリックで空白行が消えます
この作業って一回限りであればすぐ終わるから手間に感じないんですけど、イチイチ毎回やらなきゃいけない場面が出てくる人っていると思うんですよ。(←僕)
その毎回の手間を少しでも省けるようにVBAを使って自動化するってわけです。
では、これからVBAコードの公開とそのコードの説明をしていきます。
エクセルの表の空白行を自動で削除するVBAコード
改めてエクセルファイルがどのようなものかを確認しておくと
- シートが二つ
- 2つ目のシートの空白行を削除したい
- 最終行が合計セルとかがあって、空白行が間にある
このような特徴があります。ちょっとわかりづらいですが、シートが何個あろうが、そのファイルによってコードを替えれば全く問題ありません。
ただ、今回はこういう状況下でのコードですよ、って話でした。
VBAコード
コードは以下です。
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 |
Sub a56_print() Worksheets("Sheet2").Copy After:=Worksheets(2) ActiveSheet.Name = "印刷" Worksheets(3).Activate Cells.Select Cells.Copy Cells.PasteSpecial Paste:=xlPasteValues Dim LastRow As Long LastRow = Cells(Rows.Count, 2).End(xlUp).Row Dim ws As Worksheet Dim a, b, c, i Set ws = Worksheets(3) a = ws.UsedRange.Rows(ws.UsedRange.Rows.Count).Row b = a - 1 c = LastRow + 1 For i = c To b Step 1 Rows(c).Delete Next i Worksheets(3).PrintOut Application.DisplayAlerts = False Worksheets(3).Delete Application.DisplayAlerts = True Worksheets(1).Activate End Sub |
余計なコードが入ってしまっているので、わかりづらいかと思いますので、コードの説明を簡単にしようと思います。
コードの意味
おおまかな流れを言いますと
- 印刷したい(行を削除したい)シートをコピー
- 空白行を削除
- 印刷
- シートを削除
となります。
シートをコピー
1 2 |
Worksheets("Sheet2").Copy After:=Worksheets(2) ActiveSheet.Name = "印刷" |
まずは扱うシートをコピーします。
“Sheet2″という名前のシートを2つめのシートの右にコピーする、という意味です。
そのコピーしたシートの名前を”印刷”にします。(これはどうでも良いです)
表を値として張りつける
1 2 3 4 5 |
Worksheets(3).Activate Cells.Select Cells.Copy Cells.PasteSpecial Paste:=xlPasteValues |
コピーしたシートをアクティブにして、シート全体をコピー、そして値の張りつけをしておきます。
これについてはあまり今回意味をなしていませんが、気にしないでください。
最終行を取得
1 2 |
Dim LastRow As Long LastRow = Cells(Rows.Count, 2).End(xlUp).Row |
(2列目における)最終行を取得します。
Cells(Rows.Count, 2)の2の部分を変えれば違う行の最終行を取得できます。
ただ注意点として、ここで言う最終行と言うのは最初に見つかる空白行の直前の行のことです。
つまりLastRowには51が代入されます。
表の最終行を取得
次に本当の最終行(合計の60行目を取得)します。
1 2 3 4 5 6 |
Dim ws As Worksheet Dim a, b, c, i Set ws = Worksheets(3) a = ws.UsedRange.Rows(ws.UsedRange.Rows.Count).Row b = a - 1 c = LastRow + 1 |
なにやらたくさん書かれていますが、深い意味はありません。
1 2 3 |
Dim ws As Worksheet Dim a, b, c, i Set ws = Worksheets(3) |
wsやa,b,c,iといった変数を定義して、wsに3つ目のシートを代入します。
1 |
a = ws.UsedRange.Rows(ws.UsedRange.Rows.Count).Row |
シートの最終行を取得するコードです。
詳しくはググってください。(僕も良くわかりません)
1 2 |
b = a - 1 c = LastRow + 1 |
これはちょっとダサいですけど、自分で後から見てわかるようにしました。
空白行を削除する
1 2 3 |
For i = c To b Step 1 Rows(c).Delete Next i |
まとめて削除する方法もあるんでしょうけど、For文を使っても問題ありませんでした。
指定した行を順番に消していきます。
印刷する・シートを削除する
1 2 3 4 |
Worksheets(3).PrintOut Application.DisplayAlerts = False Worksheets(3).Delete Application.DisplayAlerts = True |
印刷したあとにシートを削除するのですが、エクセルのシートを削除するときって警告が出ますよね。
1 2 3 |
Application.DisplayAlerts = False Worksheets(3).Delete Application.DisplayAlerts = True |
これは一時的に警告を出なくして、シートを削除したら、警告が出るように戻すコードです。
ググって見つけたんですが、ホント何でもありますね。VBAは万能です。
指定のシートをアクティベートする
1 |
Worksheets(1).Activate |
最後はどうでもいいっちゃいいんですが、アクティブにしておくシートを指定します。
なんか締めはきっちり、みたいな感じです。(任意です。)
最後に
あ、ワンクリックとか言ってしまっていたので、それはボタン作成するなりして下さい。僕がVBA実行するときはボタンは使わず「Alt + F8 ⇒ Enter」なのでツークリックみたいな感じですね。
実際にやってみたりして、さらにはコードをいじると「あーなるほど」ってなると思います。
最終行の定義が色々なので、最終行を取得したらMsgBoxで出力して確認しながら作業を進めるとわかりやすくて良いですよ。
以上です。
コメント