初心者のためのExcelマクロ超入門(絶対できるVBA開発)

マクロがまったくわからない人のためにエクセルマクロやVBAについてできるだけわかりやすく書いています。Twitter:@shuhhohhey

初心者のためのExcel(エクセル)マクロVBA入門-プログラミング応用(配列)

f:id:drumer2sh:20061104105709j:plain

配列を扱えることはプログラミングとしては最重要課題

皆さんに謝る必要があります。それはプログラミングの基礎に続いてどうしてもやっておかないといけないことがあったからです。それが「配列」です。配列を理解しないと、ちょっと煩雑なプログラミングを作ることはできません。非常に重要なのでしっかり理解してください。

配列とは、番号(インデックス)付き変数のこと

まぁざっくりと言えば、この見出しの通りです。具体的には以下のようにして配列変数を作成します。

    Dim a(9) As String

このようにすると、a(0)~a(9)までの10個の変数を一気に作成できます。また、名前が同じなので同じ種類のデータを扱う時にとても便利です。インデックスで管理することできるので、値の取り出しも容易になります。基本的には変数と同じなので、aという名前の箱が0番目~9番目まで10個できるイメージです。


f:id:drumer2sh:20130919161306p:plain


上記のように変数を宣言してできた配列を静的配列と言います。このように宣言すれば、a(0)からa(9)までなら値を自由にセットしたり参照したりできます。このように最初から要素数が決まっていれば、いいのですが、そうではなく、要素数が最初から決まらない場合はどうしたらいいでしょうか?

動的配列の作成


マクロを組む際にはむしろ要素数が正確に決まってないことの方が多いです。その場合は要素数を入れず、以下のように書きます。

    Dim a() As String

この時点は配列の要素数が決まってないので、このままで値を入れることはできません。後はプログラミングの中で要素数を決め直してあげればいいわけです。この決め直すための命令文をReDimステートメントと言います。

    Dim a() As String
    
    ' 要素数を0~11に決定
    ReDim a(11)

このようにすることができます。ReDimステートメントは要素数を再設定します。再設定するとそれまでに格納されていたデータは消えてしまいますが、Preserveステートメントを使うことで以前のデータを残して再設定できます。

っと文章に書きましたが、どういうことかよくわからないと思いますので実例で考えましょう。例えばA列に何行あるかわからないデータがあります。100行かもしれないし、432行かもしれない。配列の要素数はギリギリぴったりにしたい。という時です。

    Dim a() As String
    
    For i=1 to WorkSheetFunction.CountA(Sheet1.Columns(1))
    
        '要素を再設定
        ReDim Preserve a(i-1)
        '要素に値を入れる
        a(i-1) = Sheet1.Cells(i, 1).Value
        
    Next
    

これで、OKです。Preserveを使うことで繰り返し値を格納してもその内容を維持されます。

配列の個数を後で知りたい。(UBound関数、LBound関数)


配列の要素数を調べるにはUBound関数とLBound関数を使います。UBound関数は、引数で指定した配列で使用できる最も大きいインデックス番号を返します。LBound関数は、引数で指定した配列で使用できる最も小さいインデックス番号を返します。先ほどの例で言うとA列に100行あったらUBound(a)とすると99が、LBound(a)とすると0が返ってきます。

この関数は良く使うのでしっかりと覚えてくださいね。

関数の「返す」の意味


関数について基礎で散々やってますが、言葉としての意味として「返す」は戻り値から来ています。関数とは何かを入力すると何か処理をして結果を戻す(返す)物のことです。ですので、よく入力(引数)のことを関数hogeに3を「入れる」と40が「返ってくる」というような言い方をします。

この辺は日本語なので、感覚として認識しておくと、いろんなことを調べた時によりわかりやすくなると思います。

配列は超重要なので、しっかりと覚えて使いこなせるようになってくださいね。