エクセルにはマクロの記録という便利な機能がついています。しかし、その本当の使い方を知らず、「作業を記録することで簡単に自動化できる機能」と勘違いしてしまっている方が多いように思います。
今回はマクロの記録の本来的な使い方(と同時に本当に価値のある機能であること)について解説します。
この記事は中級~上級です。
レベルについてはExcel VBAの実力(レベル)を定義してみる 初心者~三段をご参照ください。
目次
マクロの記録の本来的な使い方
辞書的に調べるのに使う
マクロの記録の本来的な使い方は、「調べること」です。開発者の作業をコードとして記録してくれる、と言う事はやりたいことを書く方法が分かると言う事です。ただし、こう書けばいいよ、と教えてくれているわけではありません。その書き方を使って「自分の言葉で」書く必要があります。
オブジェクト名を調べる
コードを書いていて、インターネットで書き方を調べることは良くある事だと思います。しかし、そもそも何というキーワードで調べれば良いかすら分からない事はありませんか?
例えばコレです。
表の下の方まで行くとヘッダの行が見えなくなるので、画面を分割をした状態でマクロを終わりたいとします。でもあの、分割する為のバーみたいな灰色のヤツの名前が分かりません。こんな時こそマクロの記録機能の出番です。
マクロの記録で生成されたコードがこちら。
Sub Macro1() ' ' Macro1 Macro ' ' Range("A2").Select With ActiveWindow .SplitColumn = 0 .SplitRow = 1 End With End Sub
なる程ね!ActiveWindowってのをSplitColumnとSplitRowで分割してるって訳です。つまりあの灰色のヤツをどこに出すかではなく、どこで分割したいかが大事なんですね!(ここが言語の仕様として限界だと思います。たぶんMVPの人でもVBAだけではこのウィンドウを分割する線をピンク色にはできないはず。)結局灰色の部分の名前は分からなかったけど。。。
ウィンドウに対してこうやってオブジェクト名を調べるのが辞書的な使い方です。
でも、これ、コピペしたらダメですよ。まだ終わりじゃないから。
プロパティの値を調べる
一行目と二行目の間で分割したかったのでRange(”A2”)を選択してます。でもマクロの記録で生成されたコードをよく見て下さい。
.SplitColumn = 0 .SplitRow = 1
With~End Withの中身が、.SplitColumn = 0と.SplitRow = 1です。値が代入されていると言うことはこれはプロパティだったのですね。メソッドだったら.Split Column:=0みたいになるはずですもんね。
と、言うことは・・・・初めにRange("A2").Selectと書いてあるのはいらないって事です。
Sub 余計な部分を消した1() With ActiveWindow .SplitColumn = 0 .SplitRow = 1 End With End Sub
このコードを実行しても1行目と2行目の間で分割する事ができました。余計なSelectする必要が無くなりました。(でも、プログラミングの時は要らなくても普通に分割する時は分割したい場所でクリックしますよね。どんだけエクセルさんがユーザーに、忖度しているかということです。余談長すぎですみません。)
ちょっと待てよ、列方向は分割してない・・・と言う事は、.SplitColumn = 0って要らないんじゃ??てことはそもそもWith~End With使う必要ないのでは??
Sub 余計な部分を消した2() ActiveWindow.SplitRow = 1 End Sub
できました。たったの一行になりました。メンテナンス性も可読性も絶対こっちの方がいいですよね。
やたら長いプロパティの設定は、中身をちゃんと調べる
マクロの記録を使うと、上記のように不要な記述がたくさんある事が分かりました。これはエクセルさんが悪いわけではありません。ただ記録しただけです。なので、その中から必要な情報を抽出することが大事です。
しかし、不要な記述が多すぎて困る場合があります。例えばセルに記入されている値の一部の色だけを変更したい場合です。イメージとしては、「セルの書式設定で色を変える方法は分かるんだけど、セルの中の一部だけ目立たせたいんだよな~」と言う状況です。
そして記録されたVBAのコードがこちら↓
Sub Macro2() ' ' Macro2 Macro ' ' Range("A1").Select ActiveCell.FormulaR1C1 = "このセルの値のココだけ赤くしたい" With ActiveCell.Characters(Start:=1, Length:=7).Font .Name = "游ゴシック" .FontStyle = "標準" .Size = 11 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ThemeColor = xlThemeColorLight1 .TintAndShade = 0 .ThemeFont = xlThemeFontMinor End With With ActiveCell.Characters(Start:=8, Length:=2).Font .Name = "游ゴシック" .FontStyle = "標準" .Size = 11 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .Color = -16776961 .TintAndShade = 0 .ThemeFont = xlThemeFontMinor End With With ActiveCell.Characters(Start:=10, Length:=7).Font .Name = "游ゴシック" .FontStyle = "標準" .Size = 11 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ThemeColor = xlThemeColorLight1 .TintAndShade = 0 .ThemeFont = xlThemeFontMinor End With ActiveCell.Characters(6, 1).PhoneticCharacters = "アタイ" ActiveCell.Characters(12, 1).PhoneticCharacters = "アカ" Range("A2").Select End Sub
なんじゃこりゃ!長すぎる!!でも今回やりたいのは色変えるだけですよね。だから、フォント名とかどうでもいいです。色をつけているところだけ着目すると下記の部分です。
With ActiveCell.Characters(Start:=1, Length:=7).Font .ThemeColor = xlThemeColorLight1
どこが関係ある部分かなんて分からない!と嘆くことは無いです。Colorって書いてあるからココかな?って引っ張ってきただけです。ActiveCellでは無く、セルをちゃんと指定してあげて、プロシジャにするとこうなります。
Sub 余計な部分を消した3() Cells(1, 1).Characters(Start:=8, Length:=2).Font.Color = -16776961 End Sub
無事にできました。これでStart:=やLength:=の所は何文字目から何文字分って意味なんだなーと言う発見がありました。ここまで調べると、「これらの引数の値を変数で与えてあげるよう」とか「Colorの値がコードを見たときに何色か分からないからColorIndexを使う事にしよう」、などと実際のコードに生かすことができます。
自分の力で書く
ここまで調べれば、実務のコードに使う事ができますよね。これが自分の力で書く、と言う事です。マクロの記録の中身を調べることで、自分の力になりました。マクロの記録をそのまま使ったり切り貼りするのでは無く、こうやってさらに書き換えることによって自分の力になりました。
マクロの記録は素晴らしい機能です。その理由は、コードの中を調べることによって自分の力を伸ばせるからなのです。マクロの記録機能の本当の価値はここにあります。ショートカットキーに設定してそのまま使うことじゃありません。
ここまで理解できれば、次は話題のRPAも視野に入ってきます。
しつこいですが、もう一回だけ。自動記録は辞書的に使う。これがぶれなければ、コーディングフリーで自動化可能!見たいなRPAベンダーに騙されません。彼らはこの記事のように、自動記録と実際の差を利用してトレーニング講座やコンサルを売るのが目的です。
RPAの自動記録も、辞書的に使って行きましょう。