「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。データ分析・語学に力点を置いています。 →現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年1月21日改訂)。

MENU

Excel VBAをはじめから(その08/X)

 仕事で未だに使うことのある\mathrm{Excel\ VBA}を改めて体系的に学びたく

を読んでいく。


power-of-awareness.com

5. 配列・コレクションの扱い方

5.1 配列の扱い方

5.1.1 VBAの配列

 \mathrm{VBA}の配列は、基本的に「配列のサイズ(要素数・長さ)を指定して宣言」する。配列のインデックスは「0」から始める。

' Dim 配列名(サイズ) As データ型
Dim strList(2) As String

strList(0) = "りんご"
strList(1) = "みかん"
strList(2) = "ぶどう"

Debug.Print strList(0),strList(1),strList(2)

 \mathrm{VBA}では変数の宣言と初期値の入力は同時にできない。
 \mathrm{To}キーワードを用いて、先頭のインデックス番号と末尾のインデックス番号を指定して宣言することもできる。

5.1.2 配列の情報を得る関数

 配列の最初・最後のインデックス番号等を知るためには専用の関数を用いる。

関数
説明
\mathrm{LBound}
先頭のインデックス番号を取得
\mathrm{UBound}
末尾のインデックス番号を取得
' LBound(配列名[, 次元数])

なお配列の長さを知る関数は\mathrm{VBA}に実装されておらず、\mathrm{UBound}-\mathrm{LBound}+1で計算する。

5.1.3 要素数の動的変更

 配列の要素数は、条件付きで変更できる。
 動的に配列の要素数を定義するには、まず\mathrm{Dim}による宣言時に、配列数を定義しないでおく。そしてその後に\mathrm{ReDim}ステートメントでサイズを指定する。

Dim 配列名() As データ型
ReDim 配列名(サイズ)


既に値を代入してある配列に対して、更に要素を増やしたい場合、\mathrm{ReDim} \mathrm{Preserve}ステートメントを用いる。

ReDim Preserve 配列名(サイズ)
5.1.4 配列を簡単に作成・確認できる関数

 既存データを扱う場合に簡単に配列にする関数が2つかある。まずカンマ区切りのデータを配列に分割する\mathrm{Split}関数がある。また既存配列をこのようなカンマ区切りの文字列として出力・表示したい場合には、\mathrm{Join}関数が便利である。

関数
用途
\mathrm{Split}
文字列を配列に変換する。第1引数に文字列を指定し、第2引数に区切り文字を指定する(省略するとスペース区切りと想定する。)。
\mathrm{Join}
配列を文字列に変換する。第1引数に配列を指定し、第2引数に区切り文字を指定する(省略するとスペース区切りと想定する。)。
' Split(文字列[,区切り文字])
' Join(文字列[,区切り文字])

Dim str As String, arr() As String


str = "りんご,みかん,ぶどう"
arr = Split(str,",")
Debug.Print arr(0), arr(1), arr(2)

ただし\mathrm{Join}関数は文字列を含む配列にしか使えない。

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

もし配列と同じ大きさのセル範囲が不明である場合、\mathrm{Resize}プロパティを用いればよい。

Range("B2").Resize(UBound(tmpValue,1),UBound(tmpValue,2)).Value = tmpValue

5.3 Array関数で簡易リストをつくる

 \mathrm{Array}関数は引数に値やオブジェクトをカンマ区切りで列記すると、その値を要素に持つ\mathrm{Variant}型の配列を返す。

' Array(要素1,様子2)
Dim arr() As Variant

' Array関数で配列作成
arr = Array("りんご","みかん","ぶどう")

' 値を取り出す
Debug.Print arr(0), arr(1), arr(2)

 これを\mathrm{For} \mathrm{Each}ステートメントで走査する場合、ループ用の変数も\mathrm{Variant}型にする。

5.4 Transpose関数

 セルと配列の値をやり取りするには、\mathrm{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)
プライバシーポリシー お問い合わせ