前回の記事ではマクロを組んでみた話でした。
今回はそのマクロの設計図であるVBAを解読してみましょう。
@_reime さん、ありがとうございます。
マクロを動かすためのプログラム言語がVBA、今日はそのVBAの中身を見ていきましょう!
Contents
VBA編集画面の開き方
VBAの編集画面を開くには開発タブの「Visual Basic」から入っていきます。
すると、VBAの編集画面が開きます。
こんな画面が開きます。この赤枠のところがマクロの処理内容を記述したVBAです。
では、酒井なりの読み方を解説していきますね。
VBAの読み方
酒井なりの読み方は、「VBAはブロックに分けて読む」です。
どういうことかというと、こんな感じに分けていきます。
このように分けてやると、それぞれの文章の役割が見えてきます。
では一つ一つ見ていきましょう。
【緑】マクロの開始宣言と終了宣言
まず、一番基本的なルールです。
マクロは開始宣言「Sub マクロタイトル()」で始まり、終了宣言「End Sub」で終わる、2つでセットの構文です。
これが無いと始まらないし終わらないってやつですね。
【青】マクロを実行する範囲の選択
今回の場合だと、特定のセルに対してコピー・ペースト・削除といった処理を行いますので、まずは実行する範囲を選択する必要があります。
今回の場合青枠がそれにあたります。
例:Range(“F3:F7”).Select
こんな感じです。選択範囲を変えたい場合はここで書き換えたらいいのです。
CTRLキーを使った範囲選択もVBAで記述できるので、それはまたの機会に解説したいと思います。
【赤】選択範囲に対する処理の実行
次に、選択範囲に対する処理を実行するコードがあります。
例:Selection.copy 訳:選択範囲をコピーする(そのまんまw)
そう、そのまんまなんです。余談ですが、VBAは記述量が多いので読もうとする気力がそがれるのですが、ブロックに分けて一つ一つ見ていくと、それほど難しいことは書いてないのです。
他の例も見ていきましょう。
例:Selection.PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
訳:選択範囲に数値貼り付けする。
これはややこしくて自力で書くことは難しいかもしれませんが、ここは「マクロの記録」を使って作れば問題なく作れるでしょう。
ちなみに「 _ 」(アンダーバー)は文中で改行したい場合に使います。
例:Selection.ClearContents 訳:選択範囲を消す
これもそのまんまですね。
ここで大事なことは、「範囲選択→処理実行」という流れがあることを知ることです。
条件式を組んだVBA例
VBAでは、IF関数と同じような処理もできます。いわゆる条件分岐というやつです。
これは、以前法人番号検索ツールで作ったマクロのVBAです。
では実際にVBAを見てみましょう。
ちなみにここでは翻訳内容をメモとして残しています。
文頭に「’」を付けるとマクロを実行する上で無視して次に進むので、メモとして処理内容を残すことができます。(この方が分かりやすいですね)
これをブロック分けするとこうなります。
緑と赤は上と同じです。緑はマクロの開始終了宣言、赤は実行する処理を示しています。
さっきと違うは青です。これについて見ていきましょう。
条件式「If 〇〇 Then ~ Else ~ End If」の使い方
この場合、青枠は条件式を表していて、3つでセットの構文です。
If 条件式
Then
条件を満たす場合の処理
Else
条件を満たさない場合の処理
End If
このケースでは、すべて「And」でくくってて、中身が「””」(空欄)という条件を指定しています。
そしてThen以下で条件を満たすときの処理「メッセージボックスを表示する」を、Else以下で条件を満たさないときの処理「開いているブックの更新」を記述し、「End If」で締めくくっているわけです。
ちなみに、どちらも特定のセルに対して実行する処理ではないので、セルの範囲選択する処理は不要のため記述がありません。
まとめ
VBAを読むポイントは3つです。
- ブロックに分ける。
- ブロックの役割を色分けする。
- 選択と処理、条件と処理などブロックごとの組み合わせで考える。
そしてVBAを書くコツはこれです。
「マクロの記録」でパーツを作ってVBAで整える!
例外はもちろんありますが、個人的にはこれでだいたいのことで出来るようになると思います。
まずは「マクロの記録」でどんどん作り、VBAをちょこっと書き換えて使いやすくする、みたいなことを繰り返していけば、マクロを使いこなせるようになってるのではないでしょうか。