古庄 潤(ふるしょう じゅん)

本業はエンジニア。ICに様々な機械をつなぎ,電流やら電圧を測定する。もちろん,これらの測定器もVBAでコントロールし,取り込んだデータもマクロで処理する。人呼んで,マクロの鬼軍曹!

カチャカチャ……カチャカチャ……
「おや,先生,今日は朝からやる気まんまんですね。どんなマクロなんですか?」
「ん? 何の話?」
「何の話って,さっきからキーボードを叩いてるから。マクロを作ってるんでしょ?」
「いんや,ブログを書いておるんじゃよ」
「ブログ? 先生,ブログを書いてたんですか? 誰が読むんですか,そんなもの」
「そんなものって…。まぁ確かに,タレントのように大勢の人に読んでもらおうと思って書いているわけではないがな。溜まりに溜まったフラストレーションのはけ口として使っておるのじゃ」
「なんだ,要はストレス発散ですね」
「ん~,それとはちと違うんじゃが」
「どっちにしても遊びじゃないですか。ちゃんと働いてください」
「遊びと言えば遊びじゃが,活力を得るために必要であって,結果的には仕事に…」
「次の方,ど~ぞ~」

今月の相談
「初心者です。年齢別に幼児,小学生,中学生,高校生…といった区分に分類するマクロを作りました。1歳ごとにif文を書いていたのですが,60歳でくじけました。もっとエレガントでスマートなコードにならないでしょうか?」(図1

図1●年齢別に分類するマクロの画面。1歳ごとにif文で分類している
図1●年齢別に分類するマクロの画面。1歳ごとにif文で分類している
[画像のクリックで拡大表示]

「どれどれ?」
「あちゃ~,こりゃまたベタですねぇ,先生」
「うむ,まるでゲール君が書いたコードのようじゃ」
「そんなぁ,照れるじゃないですかぁ」
「ほめとらんぞ」
「さすがに,最近ではこんなコードは書きませんよ」
「そうじゃな,君もずいぶん成長した。しかしじゃ,わしもプログラミングを始めたころは,こんなコードを書いておった」
「本当ですか?」
「本当じゃ。まぁ,当時はプログラミング言語がプアだったし,何よりもわしの最初の言語はアセンブラだったからな」
「あぁ,夏にワシャワシャうるさいやつ」
「それは,アブラゼミじゃ。どんなボケやねん」
「で,エレガントなコードはどうしましょう?」
「ゲール君,君にうってつけの相談じゃ。やってみたまえ」
「はい,では,チチンプイプイの……えい!できました」

Sub SYUUKEI()
    Dim myROW As Long
    Dim i As Long

    With Worksheets("アンケート")

        myROW = .Cells(Rows.Count, 2).End(xlUp).Row
        Worksheets("集計").Range("C3:C7").Value = Empty

        For i = 3 To myROW
            If .Cells(i, 3).Value <= 6 Then  '<---(1)
                Worksheets("集計").Range("C3").Value = Worksheets("集計").Range("C3").Value + 1  '<---(2)
            ElseIf (.Cells(i, 3).Value >= 7) And (.Cells(i, 3).Value <= 12) Then  '<---(3)
                Worksheets("集計").Range("C4").Value = Worksheets("集計").Range("C4").Value + 1  '<---(4)
            ElseIf (.Cells(i, 3).Value >= 13) And (.Cells(i, 3).Value <= 15) Then  '<---(5)
                Worksheets("集計").Range("C5").Value = Worksheets("集計").Range("C5").Value + 1  '<---(6)
            ElseIf (.Cells(i, 3).Value >= 16) And (.Cells(i, 3).Value <= 18) Then  '<---(7)
                Worksheets("集計").Range("C6").Value = Worksheets("集計").Range("C6").Value + 1  '<---(8)
            ElseIf .Cells(i, 3).Value >= 19 Then  '<---(9)
                Worksheets("集計").Range("C7").Value = Worksheets("集計").Range("C7").Value + 1  '<---(10)
            End If
        Next i

    End With

End Sub
リスト1●If-Thenステートメントの分岐条件に,比較演算子を使って書き直したマクロ

(1)年齢が6歳以下の場合は(2)を実行します。
(2)Worksheets("集計")の幼児の欄の人数を一人増やします。
(3)年齢が7歳以上12歳以下の場合は(4)を実行します。
(4)Worksheets("集計")の小学生の欄の人数を一人増やします。
(5)年齢が13歳以上15歳以下の場合は(6)を実行します。
(6)Worksheets("集計")の中学生の欄の人数を一人増やします。
(7)年齢が16歳以上18歳以下の場合は(8)を実行します。
(8)Worksheets("集計")の高校生の欄の人数を一人増やします。
(9)年齢が19歳以上の場合は(10)を実行します。
(10)Worksheets("集計")の大人の欄の人数を一人増やします。

「ゲール君,解説したまえ」
「はい。0歳~6歳を(1)の条件分岐でまとめて処理します。分岐条件の比較演算子に不等号「<」と等号「=」を組み合わせて使っているのがポイントです。以下,大人も同様に処理します。小学生,中学生,高校生のように○○~○○までといった条件の場合は,And演算子で二つの不等式の論理積をとり,分岐の条件とします。ステートメント中のカッコは無くても構わないのですが,式を見やすくするために入れました」
「見事じゃ,ゲール君」
「おほめに預かり,恐悦至極にござりまする」

「相談者は,プログラミングを始めたばかりで,<演算子や>演算子の存在を知らなかったんじゃろうな」
「そうですね。あるいは,知っていたけど,If-Thenステートメントの分岐条件に使えるとは思わなかった」
「うむ。リファレンス・マニュアルには一つひとつのコマンドの意味は書いてあるが,その組み合わせについて,全部解説しているわけではないからの」
「それ以前に,リファレンス・マニュアルは解読不能です」
「まぁ,それはゲール君だけだとして,マニュアルに書いてないことがいっぱいあるから,わしらが必要とされるわけじゃ」
「難しいことはよくわかりません」