ゆんの業務改善ブログ

①生産性向上 ②業務改善 ③自動化 について情報発信しています。VBAプログラムは本当の初心者から他のアプリケーションを呼び出して使う上級者的な使い方まで幅広いレベルで解説していきます。

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

今回はVBA配列の中で基本に当たる静的配列について解説します。配列と言う言葉自体が初めての方はVBA 配列を徹底的に解説する (全5回) ①イメージをつかむを先にご覧頂くと良いと思います。

目次

静的配列をマスターする

この記事では静的配列をイメージ的にしっかり理解した上で、使いこなせるようになるところまでを目指します。分かるまで繰り返して読んで、実際に手を動かして使ってみましょう。

静的配列とは

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

今回は静的配列についてお話します。静的とは、配列の形に変更がないということです。配列の形に変更がないとはどういうことかというと、配列の部屋の番号が変わらないということです。「イメージをつかむ」の記事で掲載した配列をアパートに模したイメージ図を再掲します。

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から始まっていますね。このように使いやすい下限の値を配列のインデックスの始まりに設定することができます。メンテナンス性のことを考えるなら、一つのプログラムの中で使われる配列のインデックスの始まり方は同じにしておくなど、プログラムごとに決まり事を作って守る方が好ましいでしょう。ある配列はインデックスが0から始まり、その他の配列はインデックスが1から始まるというのは好ましくありません*1

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

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

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

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

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

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

配列名にこだわる

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

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

静的配列は配列の構造は変わらない、という特徴を生かして、特定のカテゴリーのパラメータを入れるのに適しています。今回の例で言えば「ゆん荘」という名前より「貧乏学生名簿」(失礼!)という配列名の方が妥当です。1次元の配列では名前しか格納できませんね。年齢や性別を入れたいと思えば次元数を増やしていくことになります。

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

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

静的配列まとめ

今回の記事をまとめると下記の様になります。

  • 静的配列まとめの静的とはアパートの部屋番号が変わらないと言うこと
  • インデックスとはアパートの部屋番号のこと
  • 要素とは部屋に入った値のこと。空白の場合もある
  • 静的配列を定義する際のインデックス範囲指定に変数は使えない
  • 配列には要素の特徴を捉えた名前をつけることが望ましい

静的配列まで理解出来ました。実務的な内容で使いこなせるようになるためにも、引き続き下の関連記事の内容を学んでいきましょう!

<関連記事>

*1:ある決まりに従ってインデックス番号をフッタ結果であれば、一概に好ましくなりと言う事もありません