【EXCEL VBA】配列の要素数を動的に取得する!

スポンサーリンク

はじめに

ひらちんです。

配列をFor ~ Next ステートメントで順番に処理したいときに、配列の要素の数を動的に指定する方法を紹介します!

スポンサーリンク

UBound関数・LBound関数

UBound関数は、引数に指定した配列と指定した次元で使用可能な最大の要素番号を教えてくれる関数です。

同じくLBound関数は、最小の要素番号を教えてくれます(^o^)

構文

UBoundarrayname、[ dimension ])

引数説明
arrayname必須。 配列名を指定。
dimension省略可。Variant (Long)。 多次元の配列の場合、何次元の要素について確認するのかを指定します。1次元目なら1、2次元目なら2を指定します。省略すると1になります。
ここで指定した次元の最大要素番号を返します。
構文

LBound(arrayname, [ dimension ])

引数説明
arrayname必須。 配列名を指定。
dimension省略可。Variant (Long)。 多次元の配列の場合、何次元の要素について確認するのかを指定します。1次元目なら1、2次元目なら2を指定します。省略すると1になります。
ここで指定した次元の最小要素番号を返します。

では早速やってみましょう!

スポンサーリンク

サンプル

例えば、こんな感じの表があるとします。

この表を、配列に打ち込んでから何やかんや処理したいとします。

流れは以下のようにしましょう。

  1. 配列にぶち込む
  2. For Nextステートメントで点数を確認して、500点以上だったら名前と「わお!」という文字列を、イミディエイトウィンドウに表示する

まぁ、特に意味はないです。。。

では、「1.配列にぶち込む」

これは一番簡単なのは、CurrentRegionですね。

Sub Sample()

    'Variant型の変数を準備する
    Dim 配列 As Variant
    
    'ぶち込む
    配列 = Range("A1").CurrentRegion
    
End Sub


CurrentRegionが分からない方は下記をどうぞ(^o^)

【EXCEL VBA | CurrentRegionプロパティ】特定のセルから、ひとかたまりのセル範囲を一気に取得する

セルの範囲を配列にぶち込むについてはこちらをどうぞ(^o^)

【EXCEL VBA | 配列とセル 】セル範囲を配列に入れて操作する


実行動画です。

セルの範囲の値が、配列に格納されているのが分かりますね(^o^)

次に、「2.For Nextステートメントで点数を確認して、500点以上だったら名前と「わお!」という文字列を、イミディエイトウィンドウに表示する」のところです。

まずはコードをご覧ください。

Sub Sample()

    'Variant型の変数を準備する
    Dim 配列 As Variant
    
    'ぶち込む
    配列 = Range("A1").CurrentRegion
    
    Dim i As Long
    For i = LBound(配列, 1) To UBound(配列, 1)
        
        If IsNumeric(配列(i, 2)) And 配列(i, 2) >= 500 Then
            Debug.Print 配列(i, 1) & " わお!"
        End If
    
    Next i
    
    
End Sub

「For i ~」からがFor Nextステートメントの部分です。


For Nextステートメントが分からない方はこちらをどうぞ(^o^)

【EXCEL VBA | 基礎コード】For文を使った繰り返し処理


For Nextステートメントのカンターの始まり部分(toの前)に「LBound関数」、終わりの部分(toの後ろ)に「UBound関数」で、配列の最小要素と最大要素を指定しています。

これで、元の表の大きさが変わったとしても同じコードでいけますね(^o^)

見出しは判定したくないので、IsNumericを使って判定対象が数値の部分だけを対象にしています。

では、実行動画を見てみましょう!

500点以上の人だけ、「わお!」が表示されました(^o^)

LBound(配列, 1)

ちなみに、この部分の、第2引数に「1」を設定してるのが、次元の指定です。

1次元目の場合は、省略も出来ますので

For i = LBound(配列) To UBound(配列)

これでも一緒です。

念の為、2次元目に指定した場合、LBound・UBound関数が何を返すか確認してみましょう!

Sub Sample()

    'Variant型の変数を準備する
    Dim 配列 As Variant
    
    'ぶち込む
    配列 = Range("A1").CurrentRegion
    
    Debug.Print "LBound:" & LBound(配列, 2)
    Debug.Print "UBound:" & UBound(配列, 2)
       
End Sub

実行結果は、LBoundが「1」、UBoundが「2」でした。

先程と同じ表なので、2次元目方向の数として合ってますね(^o^)

注意

今回は、セルの範囲をVriant型に一気にぶち込む形の配列でサンプルを紹介しましたので、LBoundが「1」になりました。

※Variant型の変数にセル範囲をぶち込んで出来る配列の要素数は「1」から始まる

通常配列を作成した場合の最小要素番号は「0」になることが多いと思うので、ご注意下さい。

今回は以上です!

コメント

タイトルとURLをコピーしました