仕事で未だに使うことのあるを改めて体系的に学びたく
を読んでいく。
目次
5. 配列・コレクションの扱い方
5.1 配列の扱い方
5.1.1 VBAの配列
の配列は、基本的に「配列のサイズ(要素数・長さ)を指定して宣言」する。配列のインデックスは「」から始める。
' Dim 配列名(サイズ) As データ型 Dim strList(2) As String strList(0) = "りんご" strList(1) = "みかん" strList(2) = "ぶどう" Debug.Print strList(0),strList(1),strList(2)
では変数の宣言と初期値の入力は同時にできない。
キーワードを用いて、先頭のインデックス番号と末尾のインデックス番号を指定して宣言することもできる。
5.1.2 配列の情報を得る関数
配列の最初・最後のインデックス番号等を知るためには専用の関数を用いる。
関数 |
説明 |
---|---|
先頭のインデックス番号を取得 | |
末尾のインデックス番号を取得 |
' LBound(配列名[, 次元数])
なお配列の長さを知る関数はに実装されておらず、で計算する。
5.1.3 要素数の動的変更
配列の要素数は、条件付きで変更できる。
動的に配列の要素数を定義するには、まずによる宣言時に、配列数を定義しないでおく。そしてその後にステートメントでサイズを指定する。
Dim 配列名() As データ型 ReDim 配列名(サイズ)
既に値を代入してある配列に対して、更に要素を増やしたい場合、 ステートメントを用いる。
ReDim Preserve 配列名(サイズ)
5.1.4 配列を簡単に作成・確認できる関数
既存データを扱う場合に簡単に配列にする関数が2つかある。まずカンマ区切りのデータを配列に分割する関数がある。また既存配列をこのようなカンマ区切りの文字列として出力・表示したい場合には、関数が便利である。
関数 |
用途 |
---|---|
文字列を配列に変換する。第1引数に文字列を指定し、第2引数に区切り文字を指定する(省略するとスペース区切りと想定する。)。 | |
配列を文字列に変換する。第1引数に配列を指定し、第2引数に区切り文字を指定する(省略するとスペース区切りと想定する。)。 |
' Split(文字列[,区切り文字]) ' Join(文字列[,区切り文字]) Dim str As String, arr() As String str = "りんご,みかん,ぶどう" arr = Split(str,",") Debug.Print arr(0), arr(1), arr(2)
ただし関数は文字列を含む配列にしか使えない。
5.2 配列を用いたセルへの値入力
' インデックス管理用の変数を宣言 Dim rowIndex As Long, colIndex As Long ' 2次元配列を準備 Dim tmpValue() as Variant ReDim tmpValue(1 To 3, 1 To 5) ' 2次元配列に値を入力 For rowIndex = 1 To UBound(tmpValue) For colIndex = 1 To UBound(tmpValue, 2) tmpValue(rowIndex, colIndex) = rowIndex & "・" & colIndex Next Next '入力値をセルへと展開 Range("B2:F4").Value = tmpValue
もし配列と同じ大きさのセル範囲が不明である場合、プロパティを用いればよい。
Range("B2").Resize(UBound(tmpValue,1),UBound(tmpValue,2)).Value = tmpValue
5.3 Array関数で簡易リストをつくる
関数は引数に値やオブジェクトをカンマ区切りで列記すると、その値を要素に持つ型の配列を返す。
' Array(要素1,様子2) Dim arr() As Variant ' Array関数で配列作成 arr = Array("りんご","みかん","ぶどう") ' 値を取り出す Debug.Print arr(0), arr(1), arr(2)
これを ステートメントで走査する場合、ループ用の変数も型にする。
5.4 Transpose関数
セルと配列の値をやり取りするには、ワークシート関数を用いると便利である。
Dim arr() Variant ' 縦方向の値を変換 arr = Application.WorksheetFunction.Transpose(Range("B2:B4").Value) Debug.Print "セル範囲B2:B4:", Join(arr) ' 縦方向の値を変換 With Application.WorksheetFunction arr = .Transpose(.Transpose(Range("B2:F2").Value)) End With Debug.Print "セル範囲B2:B4:", Join(arr)