勝手に初心者講座。「パートのおばさんにもできたんだから、あなたにもできる!やってみよう!VBA!」
前回はVBAのエディタを開き、VBAを実際に書いてみる、ということをやりました。
今回は、よーーーーく使う基本構文。
もし、〇〇だったら■■、〇〇でなかったら▲▲、の条件分岐。
ハイ次~ハイ次~と繰り返し処理してくれる、繰り返し構文等をやっつけてみたいと思います。
さて、いよいよ実務で使えそうなコードを書いてみましょう。
セルを最初から最後の行まで検査して、100点だったらセルを黄色くする、というコードを書いてみましょう。
1.コメントの入力
ここは必ずしも必要ではないのですが、まず何をしたいかを整理するために、「何をするよ」というのをコメントで書いていきましょう。
新たなプロシージャを作成します。
標準モジュールのSub 黄色2の下あたりに、Sub 黄色3() を入力してエンターを押します。
コメントを書いていきます。
シングルクォーテーションの後に何をしたいかを入力します。
「’」(シングルクォーテーション)の後に書いた文字は「コメント」となります。
「’」の後に入力した文字は「VBAコードではなくただの文字列」とエクセルさんは認識します。「’」を忘れてコメントを入力すると、エクセルさんから「こんなコード知らんねんけど」と怒られます。
コメントを入力しておくと、あとで見返したとき「何をやっているコードなんだっけ?」を思い出す助けとなります。
コメントを書きました。さて、この「何をしたいか」をコードに起こしていきましょう。
2.繰り返し~ループ処理~
ループ処理とはVBAでよく使う繰り返し処理です。
繰り返し処理をするには「繰り返し処理構文」を使います。
繰り返し処理構文は For~Next や Do~Loop 等いろいろあります。(詳しくは書籍やネットで見てみてください)
ここではDo~Loopを使ってみます。
以下のように黄色3プロシージャに書いてみてください。
1つずつ説明します。
Dim i As Long
i = 2
長整数型の変数 i を宣言しています。
訳すと(?)「変数にiを使うよ。入れられるのは数値だけだよ。よろしくね(その分のメモリ確保しておいてね)」というところでしょうか。
次の行で変数 i に 2 を代入しています。2行目から開始したいからです。(変数に値を入れることを代入と言います)
変数とは
一時的に何かを入れておく箱のようなものと思ってください。
ここで変数 i はカウンタとして使うので、1ずつ増やしていきます。増やしていきたい、とかちょっととっておいてあとで計算に使いたい、とか、変数って便利に使えるんですよ。
変数は i でも j でも hensu でも、変数1 などの日本語でも大丈夫です。数字で始まっちゃダメとかVBAのキーワードとかぶっちゃだめとかある程度の規則はありますが。
変数の宣言
変数の宣言は Dim 変数 As 変数の型 と宣言します。
Dim はDimensionの略のようです。Dimensionは「次元」とか「容積」とかそんな意味みたいです。変数を宣言することで「どのような値だけが代入されるのを許すか」を限定することができます。
変数の宣言は省略可能です。宣言しなくてもよいのです。ですが、数値を入れるべきところに間違って文字列が入っちゃったり、その後の間違いを防ぐことができるので、極力変数は宣言した方といろんな方が言っています。
変数の型は数値型(IntegerやLongとか)や文字列型(String)等いろいろ種類があります。詳しくはネットや書籍を参考にしてください。
Do Until Cells(i,2).Value = “”
Do Loop構文のはじめです。
「セルの値が空白になるまでループする」という意味です。
Cells(i,2)
前回はRange(“C6”)とセルを指定したのを覚えていますか?
セルの指定の仕方は2種類あり、例えばセルC6を指定するのに以下の2通りの書き方ができます。
Range(“C6”) ・・・ 文字列でセルC6を指定
Cells(6,3) ・・・ 行番号,列番号でセルを指定(6行目・3列目のセル)
変数を使ってセルを指定する場合、行番号列番号で指定するCellsの方が書きやすいです。Range(“C” & i )といった書き方もできますが、好みですかね・・・。
******************
話はそれますが、ダブルクォーテーション(” ”)で囲まれた部分は文字列として認識されます。
セルC6に「山田」と入れたいときは
Range(“C6”).Value = “山田”
と書きます・
Range(“C6”).Value = 山田 と、山田を囲むダブルクォーテーションを忘れると、
エクセルさんは
山田… え?そんなコード知らない?⇒じゃあVBAコードじゃなくて変数か?
と認識して、「そんな変数宣言されてない」または「変数になにも代入されてない、空っぽだ」という処理に走ります。
なお、”” とダブルクォーテーションの間になにも文字列を入れない場合は「長さ0の文字列」つまり「空っぽ」ということになります。上記のDoLoop構文で「セルに何も入力されてなかったら」という条件式で使っています。例の表で7行目以降はセルになにも入力されていないので、7行目まで来たらLoop処理が止まります。
*******************
Do の後には繰り返ししたい処理を書きます。ここは後で書きます。
i = i+ 1
行数カウンタ変数 i に1をプラスし、次のLoopでは次の行を処理します。
1回目の処理は i =2だったので、2行目を処理。
i に1プラスして i は3になったので、次の処理では3行目を処理します。
3→4→5→6行目と次々処理をして、その次の7行目で Do Until Cells(i,2).Value = “”
の判定がTrueとなり(セル7行・2列目は空白)、処理を抜けます。
この i = i + 1 を書き忘れると・・・ずーーーと同じ2行目を処理することとなり、いわゆる無限ループに陥ります。(私、よくやるんです・・・)
そんなときは!Ctrl+Breakキーでストップできますのでご安心ください!
Loop
Do Loop構文の終わりです。
DoとLoopで囲まれた部分を繰り返し処理します。
今回は前判定ですが、
Do
処理
Loop Until Cells(i,2).Value= “”
のように後判定で書くこともできます。
処理をした後に「セルの値は空白かな?」と調べます。
かならず1回は処理したいときは後判定とか場合によって使い分けます。
また、Until ではなく While というキーワードも使えます。
Until は「~になるまで」ですが While は「~の間は繰り返す」です。
Until Cells(i,2).Value= “” は「セルの値が空白になるまでは処理をする。空白になったらLoop処理を抜ける」
While Cells(i,2).Value<> “” は「セルの値が空白ではないあいだは処理をする。『空白ではない』が成立しなくなったら(つまり空白になったら)Loop処理を抜ける」
DoLoop構文についてここではさらりと触れましたが、詳しくはネットや書籍の情報を参照してください。
3.条件分岐
さて、Do Loopの間の繰り返し行う処理を書いていきましょう。
その前に!「セルの値が100」であるかどうかを判定して、100だった場合にセルを黄色くしますよね。
「セルの値が100である」→Yes→セルを黄色くする
「セルの値が100である」→No→なにもしない
「セルの値が100である」という条件を判定し、その後の処理が分かれる、というのが条件分岐になります。
値を判定し、条件分岐する構文を書きます。If文を使います。
If 判定する条件 Then
Yseの時の処理
Else
Noの時の処理
End If
実際に書いてみます。
赤枠内の部分を追加しました。
「もし、セルの値が100だったら」という条件判定をしています。
Noの場合は何もしないので、今回はElseの部分は省略し、End Ifで終了しています。
セルの値が100だったら「ここにセルを黄色くする処理を書く」の部分に流れ、End Ifに抜けます。
セルの値が100ではない場合はそのままEnd Ifに抜けます。
ではいよいよセルを黄色くする処理を書きます。赤枠の部分を追加します。
これで完成です!早速マクロ「黄色3」を動かしてみましょう。
エクセルに戻って、開発タグ→マクロ→「黄色3」→実行 です。
100点のセルが黄色くなりましたか?
でもー。B列だけですね。
C・D列も黄色判定するように書き直しましょう。
列3・4も処理対象となるようにIfからEndIfの部分をコピーして、以下のように書いても正しく動きます。
4.もう一つ繰り返し処理構文 For~Next
でも、コピーできるということは、繰り返し処理ができるかも?
ということで、こんどはDoLoopとは別の繰り返し処理構文 For Next を使って書いてみましょう。
赤枠部分を追加・修正しています。
Dim j As Long
カウンタ変数 j を追加します
For j = 2 To 4
For Next構文の始めです。
j を2から4まで1つずつ増やしながらNextまでの処理を繰り返し行います。
Cells(i,j).Value
セルの列指定を数値ではなく変数 j で指定します。
Next
For Next 構文の終わりです。For以下ここまでの処理を繰り返し行います。
処理の流れはこうなります。
Do 入る i=2
Do の判定文 Cells(2,2)が空白ではないので処理進む
For 入る j=2→4
1回目:セル2行・2列目(i = 2, j =2)
2回目:セル2行・3列目(i = 2, j =3)
3回目:セル2行・4列目(i = 2, j =4)
For 抜ける
i = i + 1 で i が3になる
Do の判定文 Cells(3,2)が空白ではないので処理進む
2回目のFor入る j=2→4
4回目:セル3行・2列目(i = 3, j =2)
5回目:セル3行・3列目(i = 3, j =3)
6回目:セル3行・4列目(i = 3, j =4)
For 抜ける
i = i + 1 で i が4になる
Do の判定文 Cells(4,2)が空白ではないので処理進む
3回目のFor入る j=2→4
7回目:セル4行・2列目(i = 4, j =2)
8回目:セル4行・3列目(i = 4, j =3)
9回目:セル4行・4列目(i = 4, j =4)
For 抜ける
i = i + 1 で i が5になる
Do の判定文 Cells(5,2)が空白ではないので処理進む
4回目のFor入る j=2→4
10回目:セル5行・2列目(i = 5, j =2)
11回目:セル5行・3列目(i = 5, j =3)
12回目:セル5行・4列目(i = 5, j =4)
For 抜ける
i = i + 1 で i が6になる
Do の判定文 Cells(6,2)が空白ではないので処理進む
5回目のFor入る j=2→4
13回目:セル6行・2列目(i = 6, j =2)
14回目:セル6行・3列目(i = 6, j =3)
15回目:セル6行・4列目(i = 6, j =4)
For 抜ける
i = i + 1 で i が7になる
Do の判定文 Cells(7,2)が空白なのでDoの処理終了
ふう~。ひとつずつ追うのはつかれますね。
5.メッセージボックス
ついでに処理が終わったとわかりやすいように最後にメッセージを表示する分を書き足します。
Loopの下に
MsgBox “処理終了”
と書きます。
6.ボタンでマクロを起動
エクセルに画面を切り替えて、開発タグの挿入をクリックしボタンをクリックします。
ボタンを書きたい位置で適当にドラッグします。
下のような画面が出るので「黄色3」を選択して「OK」ボタンを押します。
ボタンをクリックしてみてください。
100点のセルが黄色くなり、メッセージが表示されましたでしょうか?
メッセージは「OK」ボタンを押すと消えます。
ボタンの名前を変えることもできます。
ボタンを配置した後で、別のマクロをボタンに割り当てることもできます。
詳しくはネットや書籍を参照してください。
下が黄色3の完成形コードです。
業務で使うVBAを書く場合、あとあと修正が必要になることもありますし、ほかの人が修正する場合が出てくることもあります。後で見返して、だれにもわかりやすい、読みやすいVBAとなるように心がけましょう。(これがなかなか難しい・・・)
おさらい
こんなことをやりました。
・コメントの書き方
・繰り返し構文 Do~Loop
・変数とは、変数の宣言、変数の値の代入
・セルの指定方法 Range/Cells
・条件分岐 If文
・繰り返し構文 For~Next
・メッセージボックス
・マクロをボタンで起動する方法
長くなってしまいました。
最後までお付き合いいただきありがとうございました。
やってみよう!VBA!シリーズ
【Excel/VBA】やってみよう!VBA⑤ワークシートの操作
コメント