【Excel】”1行マクロ”で始めるVBA【わりと初心者向】
1行マクロというのは、Excelの1行とか1セルとか、1個だけを対象に作ったVBAを使うマクロです。一般的に使われている用語かどうか知らないので、”(ダブルコーテーション)をつけて”1行マクロ”と題名に入れました。
私が最初にマクロを使うようになったのが1行マクロからです。1行マクロで慣れていって、だんだん本格的なプログラムを書くようになっていったのですが、その最初の入口部分だった1行マクロについて、まだVBAもExcelのマクロも知らない人向けに書いてみようと思います。
VBAっていうのはVisualBasicForApplicationの略で、Basic言語がもとになっているらしいですが、私は詳しくは知りません。知らなくても使えますのでご安心を。なんといってもExcelさえ入手できればVBAはおまけでついてきます、いうなれば、ただです。ただなら使わなきゃもったいないじゃありませんか。使って使って、使い倒してみましょう。
使いどころ(テストケース)
こういう、セル結合をバリバリに使ったExcelがあったとします。
intGn1の値が同じ場合はセル結合してしまっているようです。
intGV列も同様。
これを編集して、セル結合をしてある場合は1行だけにするよう言われました。
たとえば、7行目と8行目の場合、8行目は削除してよいけど7行目はそのまま残せというお達しです。
罫線や塗りつぶし色はかえるなという指示です。
これはものの例えでして、私が今即興で作った表ですが、お役所時代にはこういう表をうんざりするほど見ました(以前地方公務員を8年やりました)。
みんな好きですね!セル結合。それから、罫線。
作った人には意味のある結合だったし、意味のある罫線だったのかもしれませんが、この資料を引き継いだ人にも意味があるかというとたいていの場合、意味なんてないです。ただの足かせです。
でも仕方がないので、言われた通りに編集しようと思います。
編集開始
8行目全体を選択し、削除しようと思います。
8行目を削除しました。
続いて、9行目を削除しようと思います。
9行目を削除しました。
この辺でもう私はいやになってきます。
「この作業、あとどれくらい繰り返せばいんだろう・・・・?」と不安になります。
そこで、Ctrl+↓で、一番下の行にまでセルを移動し、何行目まであるか確認します。
5854行目ということが判明しました。
あ、・・・もう無理!!ってなります。( ;∀;)
本当なら、こんな表なんてフィルタでデータを抽出して、空白行だけ一気に削除すればいいんです。
しかし、訳の分からないセル結合やら罫線やら塗りつぶし色をくずすな!というお達しがあるため、うかつに一気に削除してレイアウトを崩すのも怖いです。
そこで、1行マクロの出番です。
1行マクロを作る
1行マクロは、マクロの記録で作ります。
開発タブをリボンに表示する
開発タブがリボンに表示されていないとマクロの記録を使うのに不便ですので、最初にその設定をやっておきます。
すでにリボンに開発タブが表示されているなら、この工程は飛ばしてください。マクロの記録へ飛ぶ。
ファイルをクリックします。
次にオプションをクリックします。
Excelのオプション画面が開いたら、リボンのユーザ設定をクリックします。
右側のリボンのユーザ設定のところで、開発というチェックボックスがチェックされていないようでしたら、チェックします。そしてOKを押します。
これでリボンに開発タブが表示されるようになります。
マクロの記録
マクロを記録します。
その前に注意。
この作業は全部記録されてしまいます。
間違った操作をした場合でも記録されてしまいますので、間違えないよう注意してください。
最初に、セルの位置を一番下の行にあわせておきます。行全体を選んでおきます。
マクロの記録を押します。
マクロの記録は、リボンの開発タブ→マクロの記録にあります。
マクロの記録ダイアログボックスが開いたら、ショートカットキーのところに「m」と入れてください。
小文字の半角文字のmです。
なんでmかというとmacroのmというだけの意味です。ほかの文字でもよいのですが、他の文字だとすでに別の機能が割り当てられていることがあります(たとえばCtrl+ZとかCtrl+Sとか)ので、私はそれを避けるためにmにすることが多いです。
OKを押すとマクロの記録が始まります。
マクロの記録が始まると、タスクバーの表示が切り替わります。
また、開発タブのマクロの記録の表示も変わります。
対象の行を削除します。右クリックしてショートカットメニューが表示されたら、削除を選びます。
上矢印キーを1回だけ押します。
ここまで記録したら、記録終了を押します。
これでマクロの記録はおしまいです。
VBEで編集する
つづいて、今記録したコードをVBAエディタ(VBE)で編集します。
Alt+F11を押します。
VBE画面の説明を少しします。
左側にツリーがあります。これはExcelシートやブックを管理するためのものです。プロジェクトウィンドウなどと呼んでいます。
このツリーの中に「標準モジュール」というフォルダがあります。左側に+(プラス)のマークがありますので、クリックしてください。
そうすると、Module1というのが見えたと思いますので、これをダブルクリックしてください。
そうすると、右側に何やらコードっぽいものが開くと思います。これがコードペインというもので、コードの編集はここでやります。今はModule1というモジュールが開いています。
Sub Macro1()というのがマクロの名前とマクロがここから始まるよということを宣言した部分です。Subで始まり、End Subで終わります。
先頭に'(シングルクォーテーション)があるのは、コメントです。コメントというのは、プログラムに何の影響も及ぼさない、人が読んで分かるように書いた文章のことです。
この例ではプログラム部分とコメント部分がきっちり分けて書かれていますが、プログラム部分の途中にコメントを書くこともあります。
シングルクォーテーションがあったら、その後ろは改行までコメント扱いとなります。
プログラム部分のうち、Selection.Delete Shift:=xlUpというのは、選択してあるところを削除しますという命令です。Shift:=xlUpというのはDeleteがあらかじめ持っているオプションの一つでして、削除した後行全体を上に詰めますよという意味です。
Range(“A5852”).Selectというのは、セルA5852を選択しますという意味です。
つまりこのプログラムは先ほどマクロの記録で記録した作業を、Deleteという命令とSelectという命令で記述してあるのです。マクロの記録というのはこんな風に、命令(コードとも言います)を自動生成してくれる機能なんです。
でも、マクロの記録で記述したコードというのは固定的で、汎用性がありません。そのままでは使い勝手が悪いです。
そこで、コードを編集します。
Selection.Delete Shift:=xlUpのSelectionの部分をActiveCell.EntireRowに変えてください。
Range(“A5852”).SelectのRange(“A5852”)の部分を、ActiveCell.Offset(-1,0)に変えてください。
大文字小文字は気にしなくてよいです、勝手に大文字になったり小文字になったりします。
気をつけないといけないのは、不必要な半角スペースを入れたり、必要な半角スペースを入れなかったりすることです。
今回の例ですと、ActiveCell.EntireRow.Deleteの後ろに、(見えないかもしれませんが)半角スペースがあります。半角スペースが1個あって、Shift:=xlUpと続いています。この半角スペースを忘れてはダメです。逆に、例えばActiveCell. EntireRow. Deleteとするのもダメです。わかりますか?ActiveCell.の後ろに不必要な半角スペースが入っているのです。こういうダメなコードは、VBEがエラーとして教えてくれます。エラーになると赤くなるのですぐ分かると思います。
ActiveCellというのは、アクティブなセルという意味です。現在アクティブになっているセルのことです。選択されているセルとほぼ同意です(厳密な意味では違いますが)。
EntireRowというのは、行全体という意味です。
Selectionとしていた場合、選択された場所がセル1個なのか複数のセルなのか行全体なのかはたまた列全体なのか、分かりません。そこで、ActiveCell.EntireRowと表記することで、あいまいさを排除し、確実に削除したい行全体を選択してもらえるようにしたのです。
Offset(-1,0)というのは、基準となるセルから指定した数だけ移動しなさいという意味です。
基準となるセルはActiveCellです。
例えばActiveCellがセルC4だったとしますと、
- Activecell.Offset(-1,0)はセルC3です。列は変わらず、行だけが1行上になります。
- Activecell.Offset(1,0)はセルC5です。列は変わらず、行だけが1行下になります。
- Activecell.Offset(0,-1)はセルB4です。行は変わらず、列だけが1列左になります。
- Activecell.Offset(0,1)はセルD4です。行は変わらず、列だけが1列右になります。
- ActiveCell.Offset(0,0)と書けば、セルC4ということになります(普通はこういう書き方はしませんが、ループの中では結構出現する書き方だったりします。閑話休題)。
今回の場合、Activecell.Offset(-1,0)ですので、1行だけ上のセルということになります。
マクロを記録したときに、行全体を削除した後、上矢印キーを1回だけ押しました。
最初のコードではセルA5852を選択するというコードになっていましたが、毎回セルA5852を選択されても困るのです。そこで、そのときのセルの状態(位置)から判断して適切な位置に移動するコードに変更しました。
保存ボタンを押して保存してください。
上記のようなマクロなしのブックに保存できませんというメッセージが出ても、気にしないでください。
このマクロは保存しません。
あとでいくらでも作ることができますから。
1行マクロは身につけてください。どこかに保存しておく必要はないです。頭の中に保存します。毎回さっと作って、さっと使って、パッと消してしまうものです。
どうしても保存したいのなら、Ctrl+Aで全部選択し、Ctrl+Cでコピーし、どこか別のメモ帳などにCtrl+V(貼り付け)して保存してください。
1行マクロの使い方
ワークシートに戻って、Ctrl+mを押します。
すると、1行だけ削除されます。
これを繰り返します。
何回かCtrl+mを繰り返して行削除します。途中で上記のような、削除してよいのか悪いのか迷う行にぶち当たります。
そしたらCtrl+mでなく上矢印で1個上、ないし2個上へセルを移動させます。削除していいか分からないなら、仕事を発注した人に聞かないといけませんから。
このように、目視しながら1行ずつ削除できるので、安心です。
もっともCtrl+Z(元に戻す)はききませんので、作業前にシート全体をどこかに保存しておくとよいでしょう。
編集が終わったら保存して閉じましょう。
その際マクロを保存しますか?と聞かれたら、マクロ入りで保存してはいけません。
なぜかというと、仕事を依頼してきた人はマクロなんて知りませんから。
うかつにマクロまで保存すると「ウィルスに感染した!」と大騒ぎになります。あるいは、「マクロなんて属人化するツール使うな!」と怒られてしまいますので、作業が終わったらさくっと証拠隠滅しましょう。マクロなしで保存して閉じます。
まとめ
以上、1行マクロについて説明しました。
1行マクロの使いどころがわかってもらえたでしょうか・・・?
セル結合のない、罫線を使わない、生データだけのCSV的なデータだけの世界だったらこんな1行マクロも使わなくて済むのですが、現実世界ではいまだにセル結合が健在ですので(くそう、いつか撲滅したいセル結合…(;`皿´)、辛抱強くつきあってあげる必要があります。その際強力な武器となるのが1行マクロです。
コードの中身はいろいろアレンジできます。今回は削除するパターンでしたが、セルの結合を解除するマクロとか、セルの色を変えるマクロとか、それらを複数組み合わせたマクロとか・・・・。
結局、1行マクロを複数組み合わせていくと一つの大きなプログラムになっていきます。
なお、私も最初からSelectionをActiveCell.EntireRowに変更すればよいと分かっていた訳ではないです。
あちこち調べ、試行錯誤し、何回も失敗した結果たどりつきました。
皆様のそういう時間が少しでも軽減出来たら幸いです。
ここまでお読みくださりありがとうございました。
補足
Q:なんで下から削除するんですか?
A:上から削除すると、保存しておいたセーブデータとセル番地がずれてしまい、前のデータが何だったか探すのが大変になるからです。
行を削除する作業の鉄則
- データをコピーし、セーブデータを作っておく(あとで失敗したときに戻すよう)
- 削除するときは一番下の行から削除していく