はじめに
この講座は手順を1工程づつ進めていきます。
一つひとつの手順は、画像を交えて説明していきますので、手順通りに進めていけば最後までたどり着けると思います。
今回は以下のような表を用意して必要な値を取得したり、代入する事によりデータの扱い方を学びます。

表を含んだExcelファイルは以下からダウンロードできます。
簡単な表なのでご自身で作ってもらっても構いません。
プログラムコード
プログラムは「標準モジュール」に書きます。メニューの「挿入」>「標準モジュール」と進んで、標準モジュールを追加し、コードウインドウに以下のプログラムを書き込んでください。
VBAプログラムが全く初めての方は、こちらのページで開発環境を整えて、プログラムコードを書く準備を行ってください。
Sub macro1()
Dim i As Long
Dim cnt As Long
cnt = 0
For i = 2 To 20
If Cells(i, "A") = "山田" Then
cnt = cnt + 1
End If
Next i
MsgBox "山田さんは、" & cnt & "件ありました。"
End Sub
プログラム解説
このプログラムは、A列から「山田」さんを見つけて、数をカウントするプログラムです。
短いプログラムですが、基本的な要素が入っています。順番に説明していきましょう。
プロシージャ(関数)
一番最初と一番最後に注目しましょう。
ExcelVBAでは、Sub~End Subで囲まれた部分が1つのプロシージャ( = 関数)となります。
プロシージャとは、一つのプログラムの塊の事です。
今回は、「A列から「山田」さんを見つけて、数をカウントする」という一塊のプログラムです。
変数
Dimで始まる部分は変数の宣言です。
書式は以下のようになります。
Dim 変数名 As 変数型
変数は、値を一旦置いておく箱のようなイメージです。
箱にはどんなものを入れるか決めておきます。
数値、文字列、オブジェクト、、色々ありますがここでは数値型、それも整数型のLongで宣言しています。
後から出てきますが、 i は For文で使うループ用の変数です。
また、cnt は「山田」さんが何回出てきたかを数えるカウント用の変数として宣言しています。
変数の初期化
変数は初期化してから使うのが丁寧なやり方です。
cnt に 0 を代入しています。(右辺から左辺へ代入されます。)
cnt = 0
実は、省略しても構いません。なぜなら、
Dim cnt As Long
とした時点で、 cnt は 0 という値になっているからです。
それでも丁寧に書くのは、「明示的」しておいた方が説得力があるからです。
i の初期化はFor文で初期化しています。
For文 (繰り返し処理)
For文は、
For i = 2 To 20 というように、
For 先頭 To 最後
という形で書きます。この場合、
「i を2 から 20 まで繰り返す」という意味になります。
そして、Forは必ず折り返す Next とセットです。
つまり、「For と Next に囲まれた部分を i を 2 から 20 にして繰り返す」という意味になります。
For文の中にFor文
For文は入れ子にして使う事が出来ます。
Sub ForSample()
Dim i As Long, j As Long, cnt As Long
cnt = 1
For i = 1 To 10
For j = 2 To 8
Cells(i, j) = cnt
cnt = cnt + 1
Next j
Next i
End Sub
内部のFor文の j が先に繰り返されるので、列方向が先に記録されていきます。

字下げ
よく見ると、文頭を少し右にずらしていますね。
これを「字下げ」と言います。字下げはやらなくてもいいのですが、必ず行うようにしましょう。
字下げはTabキーを使って入力します。
字下げを習慣づける事で、プログラムが分かり易くなり、つまらないミスを防ぐ事ができるようになります。

字下げを行う事で、For文の内部で何が行われるか把握しやすくなります。
If文(条件分岐)
If文は「ある条件を満たした時だけ中身を実行する」ことになります。
If 条件式 Then
条件を満たした時に実行
End If
という形で書きます。今回の場合は、
Cells(i, “A”) = “山田”
が条件式になります。条件式のイコール(=)は、同じものかを比較する意味になります。
(代入の = と、比較の = では、まったく動作が異なります。)
複数の条件分岐
条件がいくつかある場合は以下のようにします。
If 条件式1 Then
条件1を満たした時に実行
ElseIf 条件式2 Then
条件2を満たした時に実行
ElseIf 条件式3 Then
条件3を満たした時に実行
Else
どの条件にも合わない時
End If
If と Else は一回のみです。ElseIf は何度でも重ねることが出来ます。
ただし、条件に適合しているかは上から判定していきますので、注意が必要です。
Sub IfSample()
Dim n As Long
n = 4
If n Mod 2 = 0 Then
MsgBox "2で割り切れます。"
ElseIf n Mod 3 = 0 Then
MsgBox "3で割り切れます。"
ElseIf n Mod 4 = 0 Then
MsgBox "4で割り切れます。" 'ここには来ない!
Else
MsgBox "割り切れませんでした。"
End If
End Sub
Mod は 左辺を右辺で割った余りを返します。
このプログラムでは、n に4でわりきれる数が来ても、最初の条件式に適度してしまうので、「4で割り切れます。」という表示はされません。
このプログラムの場合、1番目の条件式と3番目の条件式を入替える必要があります。
オブジェクト(Excelの部品)
Cells() はセルを指すオブジェクトです。初心者のうちはオブジェクトとは、Excelの部品という風に覚えておいてください。
Cellsは一つのセルを指します。
Cells( 行番号 , 列番号 )
という書式で、行、列ともに数値を代入しますが、列に関しては、アルファベットの文字列を使っても良い事になっています。
Cells( i , “A” )
というのは、For文で i に 2,3,4,5,,,20 と値が入りますので、
A2セル、A3セル、A4,A5,,,A20
というセルを参照するようになります。
文字列(””で囲む)
プログラム内で””で囲まれたものは、文字列として扱われます。
””で囲まれていなければ変数名として扱われてしまいますので注意しましょう。
さて、今回のIf文では、
If Cells(i, “A”) = “山田” Then
もし、i 行目、A列のセルが「山田」なら、If文の内部を実行せよ。
という意味になります。
インクリメント(1づつ値を増やしていく)
さて、If文内部の、
cnt = cnt + 1
これは、初心者の方には馴染みがない記述だと思います。
動作としては、
cnt に 1 を加えて、cnt に代入せよ。となります。
プログラムは、右辺を実行してから、左辺に代入するという決まりがあるので、この書き方が成り立ちます。ExcelVBAではよく使われる書き方なので是非マスターしてください。
If文から動作を見ると、
If Cells(i, “A”) = “山田” Then
cnt = cnt + 1
End If
「もし、i 行目、A列のセルが「山田」なら、cntを1つ増加させる」となります。If文でも字下げをしていますね。
字下げ
字下げは、For文とIf文で行うと覚えておいてください。また、字下げはむやみに行うものではありません。
ルールを守ることでプログラムが分かり易くなります。
意図を持たないプログラムソースの整形は返って見ずらくなってしまいますので注意しましょう。
さて、For文を終了すると、cnt にカウントされた数が入っているはずです。
ExcelVBAには、メッセージボックスを表示させる関数が用意されていますので、これで結果を表示させています。
MsgBox (メッセージボックスに文字列を表示させる)
VBAの関数、MsgBox を使えば、簡単にメッセージボックスで文字列を表示させることができます。
書式は、
MsgBox 文字列
とすればOKです。他にも機能はありますが、今は文字列を表示させると覚えておきましょう。
文字列の結合(&)
今回は、変数値と文字列を結合して、1つの文字列にしています。
文字列同士を結合するには & を使います。
MsgBox “山田さんは、” & cnt & “件ありました。”
cnt に 4 が入っていれば、
「山田さんは、4件ありました。」
という風に表示されるはずです。
これで無事にプログラムは終了です。
もし、記述やプログラムミスがあった場合は、エラーとなって途中で止まります。
最初のうちはエラーが出るとどうして良いかわからなくなりますが、初心者はスペルミスが殆どなので冷静に確認してみてください。
プログラムが終了するとどうなるのか
あまり意識する人はいないと思いますが、プロシージャを実行したあとは、変数の値などは全て消えます。
つまり、再度実行しても、cnt が出力した値は、参照できないという事です。
ただし、結果をセルに書きこんでしまえば、プロシージャが終了した後も結果を残すことができます。
実行の仕方
VBEからプログラムを実行するには、
カーソルを実行したいプロシージャの内部に置いて、
メニューの実行ボタン(三角形マーク)を押します。
(ショートカットキーは、F5です。)

エラーがある場合はメッセージが出て、「デバッグ」を押すとエラーの場所が表示されて止まります。

初心者のうちはスペルミスが多いと思いますので確認してみてください。
(上の例では、Cells(i , “A”) としなればいけない所を Cells(i, A ) としている。)
お疲れ様でした
これで、一応、プログラムを書いて実行する所までは出来るようになりました。
しかし、ただなぞっているだけなので自分の力でプログラミングしているという感じとは程遠いと思います。最初は、VBE(プログラミングエディタ)に慣れる事も大事です。
ソースコードを書きながらVBEの挙動を体感していただければ、「プログラミングとはこんな感じか」とイメージが固まってくると思います。
一度入力したプログラムですが、全て消して、ソースコードを書き写して実行してみてください。
入力する時は、説明を思い出しながら書いていくようにします。単純作業のようですが、2回目、3回目で気づきが得られると思います。
入力のコツ
For文やIf文は最初と最後を記述してから中身を書くようにします。
For i = 2 To 20
Next i
と書いてから、中に字下げして、If文を書き、
For i = 2 To 20
If Cells(i, “A”) = “山田” Then
End If
Next i
最後にIf文の中身を字下げして書きます。
For i = 2 To 20
If Cells(i, “A”) = “山田” Then
cnt = cnt + 1
End If
Next i
このように書くようにすれば、EndIF や Next の書き忘れを防ぐことが出来ます。
まとめ
今回は、初回という事もあり慣れて頂く事が一番の目標となります。
色々な用語が出てきたので、不安に思うかもしれませんが、なんとなく理解しておけば大丈夫です。
全てを理解しようとすると覚える事がたくさんあるので手に負えなくなります。
理解した事を積み上げていくようなスタンスで学習していきましょう。
次回は、今回のプログラムを改造していきながらVBAを学んで行きます。
今回学んだこと
・変数 (Dim 変数名 As 変数型)
・繰返し処理 (For 変数 = 初期値 To 最終値 ~ Next )
・条件分岐 (If 条件式 Then ~ End If )
・オブジェクト(セル) Cells(行,列)
・VBA関数 MsgBox 文字列 (文字列を表示)
・文字列の結合 ( & )
入門講座 目次
・開発環境を整える
・VBAプログラムの基礎
・VBAプログラムの基礎2
・セルの使い方
・ブックやシートの参照
・プログラムでの日付の扱い方
・プロシーシャの使い方
・「マクロの記録」を利用する
・デバッグのやり方
・やりたい事の調べ方と解決方法
・自力でプログラムを書いてみる
・別ブックのデータを集計
・別ブックのデータを集計 2
コメント