初心者オサムシがExcelのマクロと戦う戦闘ブログである
by オサムシ
タグ:Preserve ( 1 ) タグの人気記事
試験メモ【動的変数と配列のお話し】/VBAエキスパート

動的変数と配列のお話し



配列

変数宣言時に配列であることを指定すると、一つの変数に配列として複数の値を格納できます

配列の要素には、インデックス番号がつけられます

Sub sample1()
Dim zoo(2) As String
zoo(0) = "ゴリラ"
zoo(1) = "ペンギン"
zoo(2) = "カバ"
MsgBox zoo(0)
End Sub


上記の構文ではzoo(2)と指定していますが正式には下記となります

Dim zoo(0 To 2) As String
範囲を指定しない場合は「0」を指定したとみなされます

0が扱いにくい場合は
Dim zoo(1 To 3) As String
のように指定しても要素が3つであることは同じです

動的配列

マクロで要素数を取得するようなときは、マクロを書く時点では配列の要素数がわかりませんよね

そんなときは、動的配列を使います
Dim zoo() As String
要素数を指定しないで、動的配列である事を()で表します

要素数がわかった時点でReDimを使って要素数を指定します

ただし、ReDimをする度に格納されていた値は全てリセットされてしまいます

これを避けるためには、ReDimの後にPreserveを付加します

Sub sample2()
Dim a As Variant
Dim n As Variant
Dim i As Integer
Dim zoo() As String 'zooの後に()をつけて動的配列に指定
n = 1
ReDim Preserve zoo(n)
a = Cells(n, 1) 'aにセル値を代入
Do Until IsEmpty(a) 'aが空でなかったら処理を続ける
zoo(n) = Cells(n, 1) '現在インデックス配列にセル値を代入
n = n + 1 '1つ下のセルへ
a = Cells(n, 1) 'aにセル値を代入
ReDim Preserve zoo(n)
Loop 'Loopここまで
dobutu = InputBox("動物の名前を入力")
zoo(n) = dobutu
For i = 1 To n
hyouji = hyouji & zoo(i) & vbCrLf
Next i
MsgBox hyouji
End Sub


最後にFor…Nextステートメントで、配列を取り出し、Msgboxで表示しています

Preserveを指定したおかげで、Loop内で配列に格納した値が保持されています

ReDimステートメント

配列の宣言で要素数を指定した場合、動的配列にならないので、ReDimで要素数を変更できません

また、動的配列では要素数の開始番号を指定できないようです
つまり「0」から始めるしかないようです。

例の様にセル番号と関連性を持たせたいような場合は、「0」は欠番にするか、配列のときだけ「n - 1」のように1を引いて扱うしかありません。たぶん。。

上記例を「n - 1」として「0」から使えば、最後のFor文はFor…Eachにすることで、インデックス番号を気にすることなく、配列のすべての値を取り出せます

Sub sample2()
Dim a As Variant
Dim n As Variant
Dim i As Integer
Dim zoo() As String
n = 1
ReDim Preserve zoo(n)
a = Cells(n, 1)
Do Until IsEmpty(a)
zoo(n - 1) = Cells(n, 1)
n = n + 1
a = Cells(n, 1)
ReDim Preserve zoo(n - 1)
Loop
dobutu = InputBox("動物の名前を入力")
zoo(n - 1) = dobutu
For Each hairetu In zoo
hyouji = hyouji & hairetu & vbCrLf
Next hairetu
MsgBox hyouji
End Sub


実際やってみますかぁ

まずはシートに下準備
d0285354_23344550.jpg


実行するとセルの内容を配列に格納して、空白セルに到達するとLoopをやめてInputBoxを開きます
「ライオン」と入力しました
d0285354_23345723.jpg


最後にFor…Eachで配列を取り出しMsgBoxで表示
d0285354_2335795.jpg

ちなみにこの方法で配列を抽出する場合、Variant型で宣言しないとダメです

つまり型を省略すればVariant型宣言とみなされるから、それでOK

上記例の程度ならセルで扱っても問題ないね

配列のメリットを体感するような出来事があったら実例で紹介します。osamushi

オサムシじゃーなる
[PR]
by 03musi | 2013-02-10 23:47 | 試験メモ/VBAエキスパート


カテゴリ
試験メモ/VBAエキスパート
マクロ 基礎
マクロ 応用
Excel 基礎
Excel 応用
Office
日記
もくじ

ファン

フォロー中のブログ
初心者のためのOffic...
七里ヶ浜だより Lett...
はじめてのMac-Sup...
初心者のためのOffic...

検索

タグ

その他のジャンル