Excelマクロをあれこれとトレーニングしています。
かんたんではないのですが、基本を何度も繰り返しやっていくのが、何だかんだいっても効率がいいと感じています。
Excelマクロに挑戦
インプットした以上にアウトプットして実践を重ねることで、自分のチカラとして蓄積されていきます。
で、今挑戦しているのがExcelのマクロ。
マクロを使えば、データ量が膨大で数時間がかりでやるような繰り返しの仕事も、わずかな時間で終えることができるというもの。
独立後にひとりで仕事をするなら、身につけておきたいスキルとは思いながらも、重い腰が上がったのが今年になってから…というのはひとまずおいて置き…。
やりきったらブログに書こうなどと考えてはいましたが、マクロは思いのほか奥が深すぎて、それだといつになったら記事にできるのかわからない…。そんな思いもあって、今年になってから少しずつ記事に書くということをやっています。
で、今回は基本の「き」のおさらいしつつ、IF関数とXLookup関数をマクロで書くには?ということについて書いてみます。
マクロを書くのも最初のうちは基本的なことの繰り返し
Excelでマクロを書くには、まず設定の変更が必要です。
Excelの設定を変えておく
まずは、開いたExcelの画面で[ファイル]→[オプション]をクリックし、
[リボンのユーザー設定]をクリックして、
[開発]にチェックを入れましょう。
次に、セキュリティの設定もしておきましょう。
[トラスト センター]をクリックし、
[トラスト センターの設定]をクリック、
[警告して、VBA マクロを無効にする]が選択されているか確認しましょう。
こうすることで、ネットからダウンロードしたExcelがマクロを含んでいても、「名前を付けて保存」で別ファイルとして保存しておけば、最低限のセキュリティを踏まえつつ、そのマクロが使えるようになります。
VBEを起動→VBAを使ってマクロを書く
マクロを書くという場合、「VBA」というプログラミングに使う言語を「VBE」という白いキャンバスに書いていきます(細かい話ですけど)。
まず、VBEの画面を起動します。
ショートカットキーの Alt + F11を押すとVBEが起動します。
次に、マクロを書く場所となる白いキャンバス(=標準モジュール)を表示させます。
[挿入]→[標準モジュール]でもいいのですが、ショートカットキー( Alt → I → Mの順)で表示してみましょう。
標準モジュール(白いキャンバスのような画面が表示されました。
ここにマクロを書いていきます。
試しに書いていきます。
書き出しは、「Sub マクロ名」。Subのあとはスペースキーで1文字あけます(ここでは「sample」に)。
Enterを押すと、
Sub sample()
|
End Sub
「End Sub」まで自動で表示されます。
で、カーソルがある真ん中の位置からマクロを書いていきます。
たとえば、
「B3セルに1000を表示する」だと、Range(“B3”)=1000
「C4セルに5を表示する」だと、Range(“C4”)=5
「D5セルにB3セルとC4セルの乗数を表示する」だと、Range(“5”)=Range(“B3”)*Range(“C4”)
と書いて、F8キーを押すごとに、1つずつマクロが実行されます。
書き方が間違っていると、赤く反転するのでそれで気づけますし、
F8キーで1つずつ実行しても、該当の箇所でこのように「ここ違うよ」という感じで教えてくれます。
ただ、マクロの場合、1度実行してしまうと、Ctrl + Zで1つ元に戻すというのができません。
書きおわったら、実行する前にCtrl+Sで保存しておきたいところです。
ちなみに、新しく保存するときは、ファイルの種類を「Excelマクロ有効ブック」にして保存しましょう。
わたしの場合、Excelの「応答なし」現象で過去に何度か手痛い目にあっているので、こまめに保存するクセがついていてそこまで気にもしてませんが、そうでないようでしたら、「実行前に保存!」を合言葉に忘れないようにしておきましょう。
IF関数とVLookup関数をマクロで書くには?
マクロを書く場合、普段のExcelとやることが違うため、どう書いていけばいいのかがわからない、というのが最初の1歩で正直つまづくところ。
購入した書籍やChatGPTに書いてもらうコードを参考にしながら、かれこれ1ヶ月。
日々同じようなマクロを書く、というのを繰り返しやっています。
高校時代、物理でF=m*aなどの公式たちを暗記していたのですが、その感覚に似ています(わたしだけかもしれませんが…)。
書いているのはこういった感じのものです。
D列(チーフ)とE列(ランク)に所定の内容をマクロで入力していきます。
「チーフ」のシートから、店舗名とチーフの名前をリストにしています。
で、この表に、
・チーフ名は店舗名をキーにVLookupで名前を入力
・ランクは「A」→売上100万円以上、「B」→売上100万円未満
というように表示させたいという場合。
Excelの関数でやるとなると、
D列のチーフは、
=XLOOKUP(A2,チーフ!A:A,チーフ!B:B)
E列ランクだと、
=IF(C2>=1000000,”A”,”B”)
D列(チーフ)はVLookup関数よりXLookup関数が楽で便利です。
E列(ランク)はIF関数で、100万円以上はA、そうでなければBと書けば目的は果たせるわけです。
で、それはさておき。
これをマクロで書くとこんな感じに(書き方はいろいろあるようですが)。
書いたマクロをF5キーで実行すると、
このように一瞬でD列(チーフ)とE列(ランク)が表示されました。
ちなみにF8キーだとマクロを1つずつ動かせるというのは前述したとおりです。
実際書いたのはこういったものです。
Sub sumple()
Dim i
With Sheets(“売上”)
For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
.Cells(i, 4) = WorksheetFunction.VLookup( _
.Cells(i, 1), Sheets(“チーフ”).Range(“A:B”), 2, 0)
If .Cells(i, 3) >= 1000000 Then
.Cells(i, 5) = “A”
Else
.Cells(i, 5) = “B”
End If
Next
End With
End Sub
「Dim i」で変数を宣言し、「i =2」で2行目から、そのあとの「To . Cells(.Rows.Count, 1).End(xlUp).Row」でデータが入力されている行まで、と書きます。
その前後にある「For」と「Next」で、その間に書いた処理を繰り返します。
今回は、VLookupとIFを2行目からデータが入力されている最終行まで繰り返すという意味です。
マクロで関数を書く場合、VLookup関数だと、「WorksheetFunction.」という前置きが必要です(ほかにはSumなども必要)が、IF関数ではそういった前置きはいりません(Yearなどの日付の関数も同様に)。
で、If .Cells(i, 3) >= 1000000 ThenからEnd ifまでがマクロで書く場合のIF関数の書き方です。
ifではじまってEnd ifでおわります。
3列目、つまりC列の売上金額が100万円以上であれば、5列目にあたるE列ランクに「A」を、そうでなければ「B」というのを「Else」でつないでいるようなイメージです。
といったように、書籍などでざっと流れをインプットして、そのあとに実際に手を動かして実践してみるというパターンがじぶんには合っているかなとは感じています。
ただ、注意点としては最初から細かいことを追いかけないことも大事かなと。
最初のうちはわからないながらも、基本形を真似して繰り返し書いてみるわけですが、日々触れているうちになんとなく見えてきます。
そのうち何も見ないでも書けるようになりはしますが、何かが抜けていたりしてエラーが出ることもしばしば。
改行するときに「_(アンダーバー)」の手前にスペースを入れ忘れるとかもありますし。
といっても、
・地道に真似してやってみる
・間違えたところをやり直す
・反復継続する
というのが、上達への近道だったりもします。
最初はまったくできなくても、日々触れていけば少しずつでも慣れてはきますし、マクロに限らず、あらゆることに共通することかなと。
今回のサンプルデータ、動画も載せておきます。
■編集後記
昨日は朝の習慣とHPのカスタマイズ、会計士業のコンサルで資料作成、カー用品店で車のメンテナンス、ブログ執筆などを。
■息子(10歳)
学校の宿題(プリント)と学研のチャレンジをじぶんから進んでやっています。点数やステージクリアのゲーム感覚が楽しめているようです。
■昨日の1日1新
・とあるマックで読書
・イエローハットで車のメンテナンス