Mutable_Yunの業務改善ブログ

業務改善や生産性向上のブログです。自動化の手段として、VBAやRPAの勉強に役立つ解説をしています。

VBA 配列を徹底的に解説する (全5回) ②静的配列

VBAの配列を徹底的に解説するシリーズの2回目です。配列を自由自在に使いこなせるようになると、一段レベルアップします。頑張っていきましょう。

この記事は中級です。
レベルについてはExcel VBAの実力(レベル)を定義してみる 初心者~三段をご参照ください。

目次

静的配列とは


VBA 配列を徹底的に解説する (全10回) ①イメージをつかむで解説した通り、配列とは一つの変数に複数の値を格納することができる、アパートのようなものでした。

前回は単に配列と言っていましたが、今回は静的配列についてお話します。
静的とは、変更がないということです。何が変更がないかというと、配列の部屋の番号が変わらないということです。

VBA 配列を徹底的に解説する (全10回) ①イメージをつかむの図を再掲するとこの通りです。

f:id:mutable_yun:20190921115746p:plain
ゆん荘という一階建てのアパートは部屋の数が変わらない

ゆん荘というアパートの部屋の数は変わりません。いま、2号室にHelloという文字列が入居していますが、これは出て行ってもらうことも、別の値に入居してもらうこともできます。変数と同じですね。

格納できる部屋の番号が不変ということは、配列の形も変わりません。
ゆん荘の部屋の数はそのままに、今は0号室~4号室まであるのを1号室~5号室までに変更することもできません。

このように静的配列は一度決めたら変えられないというのが特徴です。変わらない、ということは各部屋にどんな値を入れるか決めていれば、安心して中身を取り出せるメリットがあるといえます。

インデックスを知る

インデックスとは

これまでは、ゆん荘というアパートの〇号室という言い方をしてきましたが、この〇の数字をインデックス番号または単にインデックスと呼びます。日本語では添え字と言います。今後は「号室」ではなく、インデックスという言葉を使うことにします。

ちなみにこのインデックスという呼び方は他のプログラミング言語でも共通なので、この際覚えてしまいましょう。

要素とは

上の図でインデックス2のところにHelloという値が入っています。このように配列に格納された値の事を要素といいます。

例えば、インデックス2の要素はHelloという文字列が格納されている、といった具合に使います。

f:id:mutable_yun:20190921192042p:plain
「号室」を削除して、単に整数にした。これがインデックス。

変数を使って配列に値を格納する

ちなみに配列に要素を格納する際、直接、Helloなどの値を入れることができるのはもちろんですが、変数を使って格納することも可能です。

Sub 変数を使って配列の要素に値を格納する1()

    Dim arr(3) As Variant ’arrという名前の配列を定義する。arrはarray(=配列の英語の略)
    
    Dim msg As String
    
    msg = "Hello"
    arr(1) = msg

End Sub

ローカルウィンドウを開いた状態で、F8を押して一行ずつプログラムを実行していきましょう。
配列が生成され、変数に値が代入され、配列の要素に値が代入されていく様子が観察できます。
f:id:mutable_yun:20190921181306p:plain

ここで注意すべきは、上のコードはあくまで変数を使って配列に値を代入しただけであって、変数そのものが配列に格納されたわけではない、ということです。

念のために実験して確認します。

Sub 変数を使って配列の要素に値を格納する2()

    Dim arr(3) As Variant  'arrという名前の配列を定義する。arrはarray(=配列の英語の略)
    
    Dim msg As String
    
    msg = "Hello"
    arr(1) = msg
    
    msg = "Good Bye"

End Sub

f:id:mutable_yun:20190921182933p:plain

配列にmsgという変数でHelloを格納し、その後msgを「Good Bye」と書き替えました。
でも、arr(1)の要素はHelloのままです。

もし変数そのものが格納されていれば、arr(1)もGood Byeに代わっているはずですよね。
配列の要素に変数を入れられないことが確認できました。

インデックスの範囲を指定する

配列と言えばインデックスは0から始まるのがお約束のようなものですが、始まりの値を自分で設定することも可能です。

上の例ではarr(3)としました。一番大きいインデックスを指定するのが静的配列の定義方法でした。
下限から上限を設定するにはこのようにします。

Sub インデックスの下限と上限を指定して配列を宣言する()
    
    Dim arr(1 To 3)
    Dim msg As String
    
    msg = "Hello"
    arr(1) = msg
    
End Sub

配列の後のカッコの中に下限値 To 上限値 とすれば、インデックスの下限と上限を設定することができます。

f:id:mutable_yun:20190922014507p:plain

確かにインデックスが1から始まっていますね。

静的配列のインデックス範囲の指定に変数は使えない

上限や下限が設定できると言うことは、ワークシートの行や列に対応した配列が作れるのでは無いかと思った方は鋭いですね。

データの最終行を変数で取得して、配列のインデックス範囲を1 To 最終行とする作戦です。

しかし残念ながら静的配列では宣言時のインデックスの指定に変数を使う事はできません。「静的」なのに可変の値を入れられるのは矛盾しているためです。

Sub 静的配列の宣言時のインデックスに変数は使えない()

    Dim n As Long
    
    n = 3
    
    Dim arr(1 To n) As Variant 'これはエラーになる
    
End Sub

配列名にこだわる

変数名でもそうですが配列につける名前にはこだわりましょう。今回で言えば「ゆん荘」に当たる部分です。

ゆん荘はぼろアパートなので、お金のない大学生ばかりが住んでいるとしましょう。でも、いつお金持ちの人が物置きとして契約するかもしれません。これでは特徴が崩れてしまいます。

静的配列は配列の構造は変わらない、という特徴を生かして、特定のカテゴリーのパラメータを入れるのに適しています。

今回の例で言えば「ゆん荘」という名前より「貧乏学生名簿」(失礼!)という配列名の方が妥当です。

1次元の配列では名前しか格納できませんね。年齢や性別を入れたいと思えば次元数を増やしていくことになります。

静的配列のイメージはつかめましたでしょうか?

次回から、より実践的な内容に踏み込んでいきます。

不安な方は繰り返し読んで、配列のイメージを固めてから進むようにしましょう。