[Excel VBA] コードの中身を理解しよう

前回の投稿↓でExcelにプログラムを貼り付けて、実行してみたけど、その中身を1つずつ解説するよ。

前回の投稿↓でプログラミングがいかに誰でも出来て簡単かを説明したけど、今回は実際にプログラミングをExcelの中に入れて、動かしてみよう!...

前回教えたようにステップ実行をやっていくとわかりやすいから、この記事を読みながら、ステップ実行で最初の行から見ていってね。それでは1行ずつ解説していきます。

コメントとSubについて

'セルに色を付けるプログラムだよ。
 Sub ColoringCells()

 まずは1行目。'(セミコロン)で始まる行は、コメント行と言って、プログラムとは関係がなくて、自由に記述することが出来る行だよ。試しにステップ実行をしてみれば、その行は飛ばして実行されているのがわかるよ。

 その後の行からプログラム開始。まず Sub というのは、サブプロシージャと言って、ここから1つのプログラムが始まるよ。ということを表しているよ。

 Subの後は1つスペースを空けて、ColoringCells()とあるけど、これはボクが自由につけたプログラムの名前だから、何て書いてもいいんだけど、後で見たときに何の処理をするプログラムかわかるように、なるべくわかりやすい名前にしておいたほうがいいよ。「Sub Test()」とか 「Sub aaa()」みたいなのはやめよう。ちなみに()はここではとりあえずつけるものとして考えておいてね。()をつけなくても自動的に付くよ。

 あとプログラム名は 「Sub 色づけ() 」みたいな全角文字はお勧めしません。たぶん問題なく動くと思うけど、全角文字は色々問題が起きる可能性があるから、なるべく半角で書こう。例えば今回は英語で書いたけど、「Sub SeruniIrozuke()」とかでも全然問題ないよ。

 あと、Sub で始まったら、必ずEnd Subで終わります。一番下の行を見てもらうと「End Sub」で終わっているのがわかるね。これを忘れるとプログラムは動いてくれないよ。

データの入れ物 変数について

'行数カウンター
Dim RowCounter As Integer

 これもまたよくわからないと思うけど、とても重要だからがんばって理解しよう。ここで行っていることは 、簡単に言うと、RowCounterというデータの入れ物を用意します。この入れ物には数値しか入れられません。ということを言っているんだ。

 プログラム用語で言うと、RowCounterという変数をIntegerの型で宣言しているということ。

 変数はデータの入れ物のこと。Integerの型というのは、数値だけ取り扱えるデータの種類ってこと。ちなみに型というのはこれ以外にも、文字用の「String」や日付用の「Date」などがあるよ。

 変数の宣言は↓このように行います。それぞれ半角スペースで区切られていることに注意してね。また、変数名はSubの時と同じように半角で書こう。

Dim xxx(変数名。自由に決めていいよ) as 型

 何でわざわざこのデータの入れ物を準備するかというのは、この先に進めていくうちにわかるから、とりあえずそういうものと思っていてね。

'データが始まるのは2行目から
RowCounter = 2

 さっき準備した変数(データの入れ物)が出てきたね。= 2 が付いているけど、何か計算をしているわけではなくて、このRowCounterという入れ物に2という数値を入れているよ。データを入れることを「代入」といいます。

 RowCounterという変数をなぜ準備したかというと、ここに何行目を処理するかという行数を入れておくためなんだ。今回のサンプルでは1行目は列の名前(顧客名など)で、実際のデータが始まるのは2行目からだから、ここでは 2 を代入しているよ。ピンとこなくてもこの先を読み進めればきっとわかるよ。

ループ処理 Do ~ Loop

'1列目が空白になるまでループ
'2行目の1列目からチェックするよ。途中で空白があったらそこで繰り返しはおしまいになるよ。
Do Until Cells(RowCounter, 1) = ""

  Doという文字が出てきたね。これは何かを繰り返す処理に使う文だよ。その後のUntilというのは「~まで」という意味。その後のCells(RowCounter, 1)はセルの中身を表しているんだけど、()の中で、セルの位置を指定しているんだ。RowCounterにはさっき2 を入れたから、まずは(2, 1)というセルの情報を示しているよ。カッコの中の最初の数値は何行目、次の数値は何列目かを示しているから、この場合、サンプルのデータ上では2行目の1列目だから↓のように 1 というデータになるね。

 その後に 「= “”」とあるのは、もしこのセルのデータが空白だったら、という意味だよ。

 ということで全部まとめて考えてみると、RowCounter行目の1列目のセルのデータが空白になるまで繰り返します。という意味になるんだ。

Do until xxx の最後はLoopという文が必ず来るよ。この繰り返し処理はDoからLoopの間の処理を行ってねということなんだ。さっきのSubから始まってEnd Subで終わるっていうのと同じ感じだよ。

 ちなみにRowCounter行目というのがよくわからないかと思うから、Do Untilの後、少し飛ばして左記に↓を説明するよ。

RowCounter = RowCounter + 1

これは現在のRowCounterの情報に + 1した情報をRowCounterに入れるという処理。もしRowCounterに2が入っていたら、 RowCounter = 2 + 1で、RowCounterには3が入るってことなんだ。

 ここで行っているのは、もし最初の2行目の処理が終わったら、次は3行目をチェックしてねということを示しているよ。それが終わったら次は4、 5・・・と1行ずつ数値が増えていくよ。

 ループ処理はここがとても重要だから、がんばって理解しよう。

 例えばもしRowCounterの数値がずっと変わらなかったら、2行目を永遠にチェックしていることになって、それをそのまま実行したらExcelが固まってしまって、強制停止するしかなくなってしまうんだ。

 だから、ループ処理は必ずいつか終わるようにしなくちゃいけないよ。今回は1列目が空白になるまでという条件だから、8行目まで行ったらループ処理は終了するよ。実際にステップ実行して確かめてみてね。

ここまで来ればもうひとふんばり!ガンバレー!

条件分岐 If と 文字検索用関数 Instr

'株式会社が名前についていたら、セルをオレンジ。ついてなければ白
'Instrという関数は特定の文字が含まれていたら、その文字の開始位置を返すよ。
   If InStr(1, Cells(RowCounter, 2), "株式会社") > 0 Then

これも細かく見てみよう。まずは文の真ん中の方にある Cells(RowCounter, 2) だけど、さっき説明したことの応用で、RowCounter行目の2列目のセルのデータを示しているよ。2列目は顧客名の列だね。

次にもう少し範囲を広げて、InStr(1, Cells(RowCounter, 2), “株式会社”) のところだけど、これは簡単に言えば、2列目の情報で、1文字目からチェックしていって、「株式会社」という文字があったら、その文字の開始位置を教えるよという意味。

例えば 「シロマル株式会社」だったら、株式会社という文字が入っているのは5文字目だから、5になるし、「株式会社シロマル」だったら1になるよ。

もしデータの間違いで「株式かいしゃ」とか「株会社」とかだったらそれは見つからないと見なされて0になるよ。それでは細かい解説です。

 これはまずInStrという関数を使っています。関数というのは、例えばExcelだと=Sum(1 ,2) だとしたらSumという関数を使用して、1 + 2をして、答えの3が表示される 見たいな感じで考えてもらえればいいよ。

 ここでは、カッコの中の意味とあわせて説明すると、まず最初の1は、「セルの情報を1文字目からチェックします」、次は、チェック対象のデータ。ここではRowCounter行目の2列目のセル のことだね。最後の”株式会社”というのは対象の文字。

 この関数を使うと、もし「株式会社」という文字がセルの中に含まれていたら、0以上の数値になるし、無ければ0になるよ。これをプログラムの中でInstr関数の部分をもし文章に置き換えると↓こんな感じになるよ。(実際に書き換えちゃうとプログラムは動かないから、ただのイメージだと思ってね)

If 株式会社という文字の位置 > 0 Then

 ここでIf というのはもし~だったらという意味。If — の後は必ずThenが付いて、最後にはEnd Ifが付くよ。

  もし株式会社という文字が含まれていたら、次の処理を行うよ。

セルに色付け

'ColorIndex = 45はオレンジを表しているよ
 Cells(RowCounter, 2).Interior.ColorIndex = 45

 ここではCells(RowCounter, 2)のあとに何か色々つけているね。これはセルの背景色を付ける方法だよ。45というのはオレンジ色を表しているんだ。実はこれに関してはボクもやり方がわからなかったから、Google で「Excel VBA セル 背景色」で調べて見つけただけなんだ。こういった細かいことはわざわざ覚える必要はないよ。ネットで調べるかマクロに記憶すればどうやって書けばわかるよ。調べ方に関してはまた別の投稿で説明するよ。

    Else
        'ColorIndex = 2は白を表しているよ
        Cells(RowCounter, 2).Interior.ColorIndex = 2

 Else というのは、もしそれ以外だったらという意味。「ここでは株式会社という文字の位置が0以上じゃなかったら」、つまり「0だったら」ということになるから、「株式会社という文字がなかったら」ということなんだ。もしなかったらセルの色を白に変えているよ。

プログラムは繰り返して使うことを考慮して

 ちなみに、セルの色は元々白いからわざわざ白にする必要ないんじゃないと思うかもしれないけど、もし「株式会社」という文字があるところだけ、オレンジにするというようにしたら、例えば、1度このVBAを実行したあとに、ある顧客名の株式会社を有限会社に変更して、再度VBAを実行してもそのセルはオレンジのままになっちゃうよ。

 プログラムを作るときは、1回だけ使うのではなくて、今後何度も使ってもいいように考えて作るといいものが出来上がるよ。

 ということで、If文のところを簡単に書くと↓のようになります。

If 株式会社という文字の位置 > 0 Then
    対象のセルの背景色 = オレンジ
Else
	対象のセルの背景色 = 白
End If

 今回Dim、Do Until、IfというVBAの基本の書き方を教えたけど、実はこれだけ知ってれば何でも応用できると思ってもらって大丈夫だよ。

 しかもそれはVBAというプログラミング言語だけではなくて、全てのプログラミング言語に共通した考え方だから、もし今後他の言語も習いたいと思ったときに、とても役にたつよ。ただ、DimとかDoとかIfの書き方は言語によって様々だから、その言語に合わせた書き方を覚えてね。

 今回はとても長い文章で大変だったと思うけど、これをマスター出来ればこれからのキミのデスクワークはものすごい勢いで改善が進むはずだから、ぜひがんばって理解してね。

 Step3ではVBAのコードの中身の説明をしたけど、今回は番外編みたいなもんで、ステップ実行中の便利技を教えるよ。 マ...