ExcelVBAで配列ではよく来る質問が共通しています。
- 配列に値を格納する方法
- 動的配列(Redim)の使い方
- 配列の要素数の取得方法
- 「インデックスが有効範囲にありません」の対処方法
今回は、VBAの配列の総まとめとしてこれらの方法について徹底的に解説していきますね☆
VBAの配列総まとめ
VBAの配列について質問が多いのは、
- 配列に値を格納する方法
- 動的配列(Redim)の使い方
- 配列の要素数の取得方法
- 「インデックスが有効範囲にありません」の対処方法
配列を使うにはこれらのことはかなり重要ですので、順に説明していきますね☆
応用的な内容も多いですので、配列の基礎は以下の記事を参考にしてくださいね。
配列に値を格納する3つの方法
VBAでは配列に値を格納する方法は3つあります。
- 配列に直接値を格納する。
- Arrayを使って配列に値を格納する。
- Splitを使って値を格納する。
格納方法1.配列に直接値を格納する
配列に値を直接格納するには
配列(1) = "文字列"
配列(2) = 数字
のように記述します。
格納する値が文字列なら「””(ダブルクォーテーション)」で囲み、数字なら囲みません。
また、配列に直接値を格納する場合には、Forループを使う場合もあります。
以下のコードはForループを使って値を直接格納する方法です。
セルA1~A10に記載されている値を配列に格納して、メッセージボックスで表示してみます。
【格納するセルの値】
Sub 配列にForループで値を格納()
Dim sHairetu(10) As String '要素数10の配列を準備
Dim i As Long , j As Long ’Forループのカウント変数
Dim msg1 As String
Dim msg2 As String
For i = 1 To 10
sHairetu(i) = Cells(i, 1).Value
Next i
For j = 1 To 10
msg1 = sHairetu(j)
msg2 = msg2 & msg1 & vbCrLf
Next j
MsgBox msg2 '配列をメッセージボックスで表示する
End Sub
【実行結果】
格納方法2.Arrayを使って配列に値を格納する。
Arrayを使って値を格納する場合は、1度でまとめて格納することができます。
Dim sHairetu() As Variant '←Variant型で宣言する
sHairetu() = Array("マグロ", "ブリ", "ふぐ")
その際に、格納する値が文字列(String型)でも、配列をVariant型で宣言する必要があります。
もし「As String」と宣言した場合は、「型が一致しません。」のエラーになってしまいますので、注意してください。
Dim sHairetu() As String '←Stringではダメ。
sHairetu() = Array("マグロ", "ブリ", "ふぐ")
格納方法3.Splitを使って値を格納する。
Split関数は、指定の文字を区切り文字として、文字列を分割する関数です。
このSplit関数を使えば、「,(カンマ)」で区切った文字列をサクッと配列に値を格納することが可能になります。
Split関数の構文はとおり。
Split(分割元の文字列名, 区切り文字)
区切り文字を「,」に設定することで、「,」で区切った文字列を一度に配列に格納することができるのです。
Sub 配列にSplitで値を格納()
Dim sHairetu As Variant
Dim sString As String
sString = "マグロ,ブリ,ふぐ,ハマチ"
sHairetu = Split(sString, ",") ’Split関数で文字列を「,」で区切ったものを配列に格納する
End Sub
どの格納方法を使っても結果は同じになりますので、ケースバイケースで使い分けるのがベストと言えます。
ちなみに筆者はもっぱら配列に値を直接格納する方法でVBAプログラミングしています笑
動的配列(Redim)の使い方
動的配列は、配列変数の宣言時に要素数を指定せず空の括弧「()」を付けた配列変数です。
まず、ReDimステートメントの構文を確認してみましょう。
▶構文:ReDim [Preserve] varname(subscripts)[As type]
▶▶日本語訳:Redim [既存データを保持したまま要素数を変更するか?] 変数名 (
設定する要素数)[配列のデータ型を指定]
Preserveは省略可能です。Preserveを記述すると既存データを保持したまま要素数を変更します。
varnameには、要素数を変更する動的配列変数名を指定します。
subscriptsには、変更する要素数を指定します。
typeは省略可能です。配列変数のデータ型を指定します。
具体的なRedimの使いかたは以下のようになります。
Dim sHairetu() As String
ReDim sHairetu(3)
sHairetu(0) = "マグロ"
sHairetu(1) = "ブリ"
sHairetu(2) = "ふぐ"
End Sub
また、Redimの際に、0から始まる要素を「1から始まる」ように変更することもできます。
たとえば、要素を「1~3」に変更する際には、
Redim 変数(1 to 3)
のように記載します。
具体的には、以下のサンプルコードのように記述します。
Sub Redimを使う()
Dim sHairetu() As String
ReDim sHairetu(1 to 3)
sHairetu(1) = "マグロ"
sHairetu(2) = "ブリ"
sHairetu(3) = "ふぐ"
End Sub
配列の要素数の取得方法
VBAで配列の要素数を取得するには、UBound関数を使います。
▶構文:UBound(配列名,次元)
第1引数には配列名を指定します。
第2引数には要素数を取得したい次元を指定します。第2引数を省略した場合は、1が適用されます。
戻り値には取得した要素数が返されます。
具体的な使い方は以下のサンプルコードのようになります。
【配列の要素数を取得する】
Sub Uboundで要素数を取得する()
Dim sHairetu() As String
Dim sYouso As Long
ReDim sHairetu(3) '要素数を3にする
sYouso = UBound(sHairetu, 1)
MsgBox sYouso
End Sub
【実行結果】
なお、UBound関数は、配列に格納されている値の有無にかかわらず、単純に配列に設定された要素数を返しますので、格納された値の数だと勘違いしないようにしてくださいね。
「インデックスが有効範囲にありません」の対処方法
VBAで配列を使用した際に「インデックスが有効範囲にありません」のエラーが出るときがあります。
「インデックスが有効範囲にありません」のエラー原因は、以下のことが挙げられます。
- 動的配列なのにRedimで配列の要素数を未設定。
- Redimで要素数を1から開始しているのに、0番目の要素に値を格納している。
- 設定した配列の要素数の上限を超えて値を格納している。
Sub インデックスが有効範囲にありませんになるコード()
Dim sHairetu() As String
ReDim sHairetu(3)
sHairetu(0) = "マグロ"
sHairetu(1) = "ブリ"
sHairetu(2) = "ふぐ"
sHairetu(3) = "ハマチ"
sHairetu(4) = "サーモン" ’←要素数を超えて値を格納している。
End Sub
Sub インデックスが有効範囲にありませんになるコード2()
Dim Shairetu() as String
Redim Shairetu(1 to 3) '←要素を1から開始に設定している。
Shairetu(0) = "マグロ" '←0番目の要素に値をか格納している。
End Sub
したがって、「インデックスが有効範囲にありません」エラーが表示されたときの対処方法は、
- 動的配列の場合はRedimで要素数を設定しているか確認する。
- Redimで要素数が0から開始なのか、1から開始なのか確認する。
- 配列の要素数の上限を超えて値を格納していないか確認する。
また、要素数の上限の確認には、UBound関数やLBound関数を使うと便利ですね。
まとめ
今回は、配列総まとめとして、
- 配列に値を格納する方法
- 動的配列(Redim)の使い方
- 配列の要素数の取得方法
- 「インデックスが有効範囲にありません」の対処方法
についてお伝えしました。
配列に値を格納する方法は、以下の3つがあります。
- 配列に直接値を格納する。
- Arrayを使って配列に値を格納する。
- Splitを使って値を格納する。
動的配列(Redim)の使い方は以下のとおり。
▶構文:ReDim [Preserve] varname(subscripts)[As type]
▶▶日本語訳:Redim [既存データを保持したまま要素数を変更するか?] 変数名 (
設定する要素数)[配列のデータ型を指定]
配列の要素数の取得は、UBound関数を使います。
「インデックスが有効範囲にありません」の対処方法は以下のとおりです。
- 動的配列の場合はRedimで要素数を設定しているか確認する。
- Redimで要素数が0から開始なのか、1から開始なのか確認する。
- 配列の要素数の上限を超えて値を格納していないか確認する。
VBAでは配列が切っても切れないものですので、ぜひ配列マスターを目指してくださいね☆
コメント