初心者のためのExcel エクセルマクロVBA入門-動的配列を使おう
実践で固定配列なんてあんの?
というくらい、配列については固定で宣言するよりも、動的に扱うことの方が多いです。データなんて常に必ず10件なんてことほとんどないでしょう。100件だったり、123件だったり1000件だったり・・・それらを扱うためには固定配列では、もはや対応することはできません。
( ゚д゚)固定配列?動的配列?
当たり前に言葉として使っていますが、簡単に説明すると。。。
' 固定配列 Dim strArryKotei(3) As String ' 動的配列 Dim strArryDouteki() As String
固定配列はその名の通り、配列の個数が固定です。つまり部屋数が決まっている状態ですね。対して動的配列に部屋数は入ってません。要するに、とりあえず配列だけ作っておいて、「後で」部屋数を自由に決める。という物です。実践ではこの動的配列を使うことの方が非常に多いと思いますので、この使い方をマスターしましょう!
ReDimステートメントで部屋数を決める。
一度宣言した配列を再定義するにはReDimステートメントを使います。いまさらですけど、DimはDemensionの略です。たぶん。んでReDimですので、再度Demensionする。ということでReDimになるわけです。現状、strArryDoutekiの状態は部屋数が1つもできてないマンションのようなものです。このまま、値を入れようとしても部屋がないのでエラーになります。ですので、ReDimで部屋を作ってあげるのです。先ほどのstrArryDoutekiを再定義します。書き方はDimと同じですが、型宣言はいりません。
' 動的配列を再定義 ReDim strArryDouteki(3)
ReDimは何回でも使えます。例えば、、
' 動的配列を再定義 ReDim strArryDouteki(3) ReDim strArryDouteki(4) ReDim strArryDouteki(5)
としてもOKです。さて、この時のマンション「strArryDouteki」の部屋数(要素数と言います)はいくつでしょうか?
答えは、6個です。配列は0番目から始まるのでしたね。前回やりました。注意してほしいのはReDimは再定義である。ということです。ですので前の情報を残してはいません。全部足して12個になる!ということではないのです。12個欲しいならReDim strArryDouteki(11)と書くしかありません。
よくあるパターン配列を動的に作りながら値を格納する。
よく、みなさんが考えるのが・・・動的配列がわからなくて・・・何とか固定配列だけでやりくりしようとするパターンです。
- B列にあるデータを配列に格納したい!
- B列のデータは大体1000個前後で98*個程度で毎回不定
- 極端に少ない時もある(200個くらい)
- では、配列は何個あればいいのだろう・・・
- 余裕をみて1500個あればいいか!
- よし、Dim strHoge(1500) As String だ!
これ。このパターンです。初心者のうちはこれでも良いのですが、やっぱりカッコ悪いですよね?200個くらい時なら1300個の部屋には誰も入居しないのです。非常に無駄です。さらに、後で説明しますが配列は繰り返し構文でその効果を発揮します。その場合に配列の数分だけ繰り返したい場合が多々あるのですが、その場合Uboundという関数を使います。関数についても今度説明しますが、これを使うとその変数の最大の要素数が得られるのです。1500なら1500ですね。ですが値が入っているのは200個です。。。。
1300回は無駄に繰り返すことになります。。。。orz
やはりこれを解決するには動的配列しかないのです。どんな時でもきっちりぴったり部屋数を作っていくことができます。
超大事キーワード!Preserve
一般的に動的に配列を作りながら値を格納していく方法のサンプルを書いておきます。おそらくこれを知っていれば、配列は怖くない!B列にいくつあるかわからないデータに対して、動的配列を作りながら、値を格納するプログラムのサンプルです。ちょっとだけ難しいですが、初心者の方はReDimの使い方だけ!に注目してください。
Sub Sample() Dim i As Long Dim strArryHoge() As String For i = 1 To Sheet1.Cells(Rows.Count, "B").End(xlUp).Row ' 配列を再定義する ReDim Preserve strArryHoge(i - 1) ' 配列に値を格納する strArryHoge(i - 1) = Sheet1.Cells(i, "B").Value Next End Sub
以上です。
色々と書いていますが繰り返しの構文とかの説明は今回はしませんが、For~Nextの間をデータがある数だけ繰り返しています。大事なのはReDimのところです。
ReDim Preserve strArryHoge(i - 1)
これで配列を再定義しています。通常ReDimは再定義ですので、前に値が入っていても、一度それを破棄して改めて配列を作り直します。つまり、マンションの建て替えですね。一旦壊して作り直しているのです。ですがキーワード「Preserve」を付けると、途端に「建て増し」になります。つまり増築です。元の状態を維持したまま、部屋を増やしてくれるのです。こうすることで、部屋にデータを入れながら、1個ずつ配列の部屋を増やしつつ、値を格納することができるのです。
動的配列ならほぼこのPreserveを使うことになると思います。だって、配列を使う時って値を一旦破棄して再定義することなんてほとんどねーもん。
上のプログラムは動的配列に値を入れる基本の構文みたいなものになりますので、是非皆さん使ってみてくださいね。
今日はここまで!
かしこ