VBAプログラムの基礎

VBA入門講座

はじめに

 この講座は手順を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では、SubEnd Subで囲まれた部分が1つのプロシージャ( = 関数)となります。
 プロシージャとは、一つのプログラムの塊の事です。
 
 今回は、「A列から「山田」さんを見つけて、数をカウントする」という一塊のプログラムです。

変数

 Dimで始まる部分は変数の宣言です。
 書式は以下のようになります。
 
 Dim 変数名 As 変数型

 変数は、値を一旦置いておくのようなイメージです。
 箱にはどんなものを入れるか決めておきます。
 数値、文字列、オブジェクト、、色々ありますがここでは数値型、それも整数型Longで宣言しています。
 後から出てきますが、 i For文で使うループ用の変数です。
 また、cnt は「山田」さんが何回出てきたかを数えるカウント用の変数として宣言しています。

変数の初期化

 変数は初期化してから使うのが丁寧なやり方です。
 cnt に 0 を代入しています。(右辺から左辺へ代入されます。
 cnt = 0
 実は、省略しても構いません。なぜなら、
 Dim cnt As Long
 とした時点で、 cnt0 という値になっているからです。
 それでも丁寧に書くのは、「明示的」しておいた方が説得力があるからです。
  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 文字列 (文字列を表示)
 ・文字列の結合 ( & )



コメント

タイトルとURLをコピーしました