Excelマクロを理解するならたったの8行でOK!

このような辺境のサイトまでようこそ。
いかんせん、真面目な話が少なめのため、たどり着けないことでしょう…。
まぁ、早速ですがタイトルのお話をしちゃいます。

【実用性】ではなく【汎用性】の高いマクロ構文

前提条件は下記…まぁ、よくある成績表みたいなものですね。

  • A列は「成績」として数字の羅列が並ぶ(上限は無し)
  • B列は「判定」として規定(今回は50)以上の数値の場合、「〇」を入力

A列の1行目に「成績」、B列の1行目に「判定」とでも入力して、A列に数字の羅列を並べてみましょ。

Sub 成績判定()
Dim i As Long
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    If Cells(i, 1) >= 50 Then
        Cells(i, 2) = "○"
    End If
Next
End Sub

構文だけバチっと書いてしまいましたが、こんな感じです。
キーボードのAlt + F11を押して、出てきた画面に構文をコピペして、そのまま上部の再生ボタンみたいなやつをクリックしちゃいましょ。…どでしょ?
Excelマクロを作る上で、間違えないようにしたいことは1点だけです。
「シンプルに短く作る」ということですね。

Excelの機能の一つである、「マクロの記録」を使うと、同じ操作を繰り返す「マクロの種」を作ることができますが、こいつに汎用性は皆無ですし、構文上は無駄な書き込みだらけなので、今後、長~くマクロを作っていこうと考えている方々には、はっきりとお勧めしません。

構文の解説①サブプロシージャ名

Sub 成績判定()
(中略)
End Sub

Excelマクロ…いや、この時点ではVBAというものに切り替えていきましょう。マクロは「結果」を表すもので、その動作を表すのは、VBAっていうわけです…うん、意味わからないですね?…まぁ、ここでは、構文自体は「VBA」って覚えておいてください。
…で、上記の構文が表しているのが、今回作ったマクロの「名前を付けてあげた」わけですね。
どこのだれかがわからないマクロを実行することはできないので、必ず名前を付けてあげます。
名前を付けるためのルールとして、「1文字目に数字・記号を使わない」「既に使用されているものは使わない」ということくらいですかね。
「既に使用されているものは使わない」 については、Excel側で「あらかじめ使っているモノ」も含まれているため、アルファベットで入力するよりは、かな・漢字を使うほうがよっぽど手軽で視認性も高くなるのでオススメです。
…で、この名前っていうのが「サブプロシージャ名」というやつです。何となく覚えておけば問題ありません。

構文の解説②変数

Dim i As Long

今回のVBAだけにとどまらず、いわゆる「プログラミング」と呼ばれる分野において、最重要かつ誰もが躓くのが「変数」と呼ばれる存在です。
そして、今回も「汎用性」考えた場合に避けては通れない道として、変数をしれっと使ってみました、許してください、なんでも(ry
で、「変数」というものを説明する場合、多くの書籍などで「値を入れる箱」というような表現をしています。…うん、ここでもその表現が正しいと思います。今回は、「Long型」というものを指定した箱を用意しました。平たく言うと、「数字しか受け入れない箱」ということになります。…まぁ、今回のようなVBAでは「解説書で解説されなくなった」レベルでよ使われる表現ですが、読み解いてみると、下記のとおりです。

  • 「Dim i」=iという変数(箱)を作る
  • 「As Long」=Long型(長整数型)で

VBAにおいては、上記のようなやり取りを「変数の宣言」とかって言いますが、「簡単なマクロ作るときには不要」とする風潮もあるらしく、個人的には「嘆かわしい」と思っている部分もあります。…まぁ、他の人に100%見せることが無いマクロであれば、そういう考え方も理解できますが、私の場合は、「人から頼まれて作る」ということが多いため、変なバグが(極力)でないようにするために、変数の宣言は必ずしています…というか、設定で「変数の宣言を強制する」っていうものを導入しています。(標準機能です、Alt + F11で表示した画面の「ツール」→「オプション」あたりを探してみましょう)

構文の解説③繰り返し処理・判定処理

For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    If Cells(i, 1) >= 50 Then
        Cells(i, 2) = "○"
    End If
Next

今回のVBAにおける一番の肝となるのが、この構文です。どんな場所でも転用出来て、いくら煎じても味が落ちることないただ一つの構文です。
Excelを使ったことがある人なら、「IF関数」というものも使ったことがあると思います。今更、こいつの解説を行うことはしませんが、入れ子式のIF関数をたくさん作ったり、表のフィルハンドルを引っ張って大量コピーしたりとよくやられる関数ではあります。
上記構文でいうと、真ん中の3行がこれの代わりとなっているわけですね…わかりやすい!w
ちなみに、複数の判定を行っていく場合、「Else」とか「ElseIf」とかを使いますが、「たった8行の構文」という目標から少し外れるので、今回の解説では「あえて」解説しません…情報は少なくシンプルに提供したいですもんね。
…で、どこででも、何度でも使えるのが、1行目と5行目。この繰り返し処理の構文で優れているのは、「A列の最終行まで参照する」というのを実施できることに尽きます。
今回でいうと、「成績」の行に情報を追加していったとしても、必ず最終行まで参照するようになっているので、取り漏らしというの防いでくれるんです。…で、それを可能としているのが、「Cells(Rows.Count, 1).End(xlUp).Row」という表現。

  • 「For」… 繰り返し処理の開始
  • 「i =」…変数「i」に代入を繰り返す
  • 「2 to」…スタートは「2」という数値
  • 「Cells(Rows.Count, 1).End(xlUp).Row」…1列目の最終セルから数えて最初に値が入力されているセル行の数値まで

…最後がわかりづらいですので、Excelを手元に開ける方は、A列の複数行に適当な数値を入力して、Ctrl + 矢印キー「↓」を押してみましょう…なんか、えらいところまで移動しませんでした?(最近のExcelだと1048576行目)
で、そのままCtral + 矢印キー「↑」を押してみましょう。…A列に入力したデータのうち、一番下にあたるセルに移動したと思います。最後の行では、この操作を構文として表現したものになるわけですね。まぁ、呪文ですよ呪文。細かな構成とかは覚える必要はありません。

IF構文のところについては、下記のような感じですね…ざっくりと。

  • 「If Cells(i, 1) >= 50 Then」…1列目(A列)のi行目が50以上だった場合処理を実行する
  • 「Cells(i, 2) = “○”」…2列目(B列)のi行目に「〇」を入力
  • 「End If」…IFの処理を終了(これをやらないとVBAはエラーになる)

8行を理解するだけでVBAは自由自在!

Excelマクロというものは、「いかに楽をするか」というのが最重要であると考えています。その中でも、「繰り返し処理」と「判定処理」はその中心となり、この構成・書き方を覚えてしまえば、Excelマクロで苦労することはほぼないです。Excelというソフトが優秀なため、実際にはExcelマクロまで手を伸ばす必要が無いということも多いですが、「複数のファイル」やら「複数行に渡るデータ」なんかを処理する場合、開いて閉じて、コピーして貼り付けて…そんな操作はExcelマクロに丸投げしてしまえば、無駄な作業からもおさらばできてしまいます!…うん、無駄に感じている業務がある人は今から始めよう、Excelマクロ!

Excelマクロ作成を楽しみましょ!

ということで、手元では3年ほど前に作成したマクロの修正依頼が入ってきたので、対応をしていましたが、そろそろ「新しい遊び」に挑戦しようかと…。
ひとまずは、「ナンクロ作成くん」みたいなやつを作ってみたいなぁ…と。

続きを読む Excelマクロ作成を楽しみましょ!

何度でも書くよ!Excelマクロのお話

Excelマクロは難しいものではありませんが、ハードル上げている要因があります!…そう、書店などで売っている「入門書」を銘打っている書籍たちですね!その理由をさっくりと書いてみましょう!(※個人の感想です)

続きを読む 何度でも書くよ!Excelマクロのお話