VBAでのUboundとLboundの使い方:2次元配列の要素取得・追加・削除を徹底解説

UboundとLboundについて VBA

「VBAで配列の要素数を簡単に取得したいけど、どうやるんだろう?」
このように悩んだことはありませんか?

お悩みポイント
悩む人
  • 配列の要素数を確認したいけど、どうやって計算すればいいかわからない。
  • 2次元配列の行や列のサイズを簡単に取得したい。
  • 配列の要素を削除・追加する方法も知りたい。

この記事では、Excel VBAの「Ubound」「Lbound」関数を使って配列のサイズを取得する方法について詳しく説明します。

これらの関数を使えば、配列の要素数を簡単に取得できるだけでなく、2次元配列や動的配列の扱いもスムーズに行えます。
さらに、配列に要素を追加・削除する方法についても解説し、業務効率を向上させるテクニックを紹介します。

基本的な使い方から実践的な応用例まで、初心者でもすぐに活用できるコピペ可能なコードを紹介しますので、ぜひ最後までご覧ください。


【 この記事の概要 】

  よく使う度    4.0  
  難しさ     3.0  
  覚えておくと安心度    4.0  

この記事を見てできるようになること

この記事を見てできるようになること

VBAでの「Ubound」と「Lbound」の基本:配列の要素数を取得する方法

Uboundと「Lboundは、Excel VBAで配列の要素数を管理するために使用される便利な関数です。

  • Ubound(Upper Bound)
    • 配列の上限、つまり最後の要素のインデックスを返す関数です。
  • Lbound(Lower Bound)
    • 配列の下限、つまり最初の要素のインデックスを返す関数です。

これらの関数を使用することで、VBAコードから簡単に配列の範囲や要素数を取得できます。

例えば、2次元配列の行数や列数を動的に取得したり、動的配列のサイズを確認するのに役立ちます。
また、配列の要素数を元にループ処理やデータ操作を行う際にも、UboundやLboundは欠かせない存在です。

「Ubound」と「Lbound」の構成について解説

「Ubound」と「Lbound」は、配列の上限と下限の要素数を取得するための関数です。

Uboundについて解説

Ubound関数は、指定した配列の最も大きな要素数(インデックス値を返します。
使用形式は以下の通りです。


Uboundの構成
設定解説
  • 配列名 (必須)
    • 対象となる配列の名前を指定します。
  • 次元数 (任意)
    • 取得したい次元の番号を指定します。
      省略した場合は1次元目が対象となります。

より詳しい情報は、Microsoft公式のUBound 関数を参照してください。

Lboundについて解説

Lbound関数は、指定した配列の最も小さな要素数(インデックス値)を返します。
使用形式は以下の通りです。


Lboundの構成
設定解説
  • 配列名 (必須)
    • 対象となる配列の名前を指定します。
  • 次元数 (任意)
    • 取得したい次元の番号を指定します。
      省略した場合は1次元目が対象となります。

より詳しい情報は、Microsoft公式のLBound 関数を参照してください。

『Ubound』『Lbound』の応用:2次元配列の操作と要素の追加・削除方法

「Ubound」と「Lbound」は1次元配列だけでなく、2次元配列や多次元配列でも効果的に活用できます。
特に、次元数を指定することで、より柔軟に配列の範囲を取得したり、要素の追加・削除などの操作も簡単に行えます。

ここでは、次元数の指定方法とその活用例について簡単に紹介し、2次元配列や要素の操作に関する基本的な使い方を見ていきます。

CHECK

「Ubound」「Lbound」で、配列の次元数省略について解説

VBAの「Ubound」と「Lbound」は、次元数を指定して使用することで、2次元以上の配列でも簡単に操作が可能です。

配列の次元数を指定しない場合

配列の次元数を省略すると、VBAは自動的に1次元目の範囲を取得します。
これは、1次元配列に対して使用する場合に便利です。

Dim arr(5) As Long
MsgBox "1次元配列の上限を取得 : " & UBound(arr) '// 1次元配列の上限を取得
配列の次元数を指定しない場合の結果

配列の次元数を指定する場合

2次元配列や多次元配列を使用する場合には、次元数を指定することで、特定の次元に対応する範囲を取得できます。

Dim arr(2, 5) As Long
MsgBox "2次元配列の行側上限を取得 : " & UBound(arr, 1) & vbCrLf & _
       "2次元配列の列側上限を取得 : " & UBound(arr, 2)
       '// 2次元目(列)の上限を取得
配列の次元数を指定する場合の結果

このように、次元数の指定有無によって、取得する範囲を柔軟にコントロールできるため、配列操作の精度が向上します。

2次元配列については、下記記事で具体的な内容を解説しています。
合わせてご覧ください。

配列の要素追加・削除について

VBAの「Ubound」や「Lbound」を使用することで、配列の上限や下限を確認しながら動的配列に要素を追加・削除する操作が簡単に行えます。

配列の要素を追加

動的配列に新しい要素を追加する際、「Ubound」を使って配列の上限を取得し、その位置に新たな要素を挿入できます。
「ReDim Preserve」を使用することで、既存のデータを保持しつつ配列のサイズを変更できます。

ReDim Preserve arr(Ubound(arr) + 1)
arr(Ubound(arr)) = 新しい要素  '// 要素の追加

配列の要素を削除

配列から要素を削除する際は、「Ubound」を使って配列の上限を確認し、その後に配列を再定義してサイズを縮小します。
「ReDim Preserve」を使用することで、不要な要素を削除できます。

ReDim Preserve arr(Ubound(arr) - 1)  '// 要素の削除

「Lbound」は、配列の下限を確認する際に役立ちますが、要素追加や削除の操作では主に「Ubound」が使用されます。

これらの操作を通じて、VBAでの配列管理を柔軟に行うことができます。詳細は次の使用例で解説していきます。


動的配列については、下記記事で具体的な内容を解説しています。
合わせてご覧ください。

「Ubound」と「Lbound」を使うことのメリット

VBAの「Ubound」と「Lbound」を使用することで、配列の範囲を柔軟に取得でき、処理の効率が向上します。

特に、2次元配列や動的配列を扱う際に非常に役立ちます。

  • 2次元配列の操作
    • 次元配列における行や列のサイズを動的に取得し、繰り返し処理や条件分岐に活用可能です。
  • 動的配列との連携
    • ReDimを使って動的配列のサイズを変更する際にも、UboundとLboundは役立ちます。

「Ubound」と「Lbound」を使う際の注意ポイント

配列の範囲を間違えると、ランタイムエラーが発生する可能性があります。
以下の点に注意しましょう。

Option Baseの確認

「Option Base 0」または「Option Base 1」の違いによって「Lbound」が返す値が変わるため、コードを書く前に設定を確認することが重要です。

動的配列の初期化

ReDimを使用して動的配列のサイズを変更した後に、「Ubound」や「Lbound」を使用する際は、再定義後の範囲を確認してください。

「Ubound」と「Lbound」の使用例をご紹介

ここからは、「Ubound」と「Lbound」の使用例を紹介します。
どれも実際に動作するコードなので、ぜひ実行してみてください。

使用例1: 1次元配列の要素数の上限と下限を取得する

「Ubound」と「Lbound」を使って、1次元配列の要素数を取得する方法を紹介します。

Sub GetArraySize()
    Dim arr(2) As Long
    
    Debug.Print "配列の要素数の上限は " & UBound(arr) & " です"
    Debug.Print "配列の要素数の下限は " & LBound(arr) & " です"
End Sub
動作概要
  • STEP1
    配列を宣言する

    1次元配列「arr」を長さ「3」(要素0から2)で宣言します。

  • STEP2
    配列の上限と下限を取得

    「UBound」と「LBound」を使用して配列の上限と下限を取得し、Debug.Print で結果を出力します。
    これにより、配列の範囲が明確になります。

処理結果

使用例1: 1次元配列の要素数の上限と下限を取得するの結果

このコードで使用している機能

詳細解説

コードの詳細
  1. Sub GetArraySize()
    • 「GetArraySize」という名前のサブルーチンを定義します。
      サブルーチンは「Sub」で始まり、「End Sub」で終わります。
  2. Dim arr(2) As Long
    • 1次元配列「arr」を宣言し、3つの要素(0, 1, 2)を持つ配列を作成します。
  3. Debug.Print “配列の要素数の上限は ” & UBound(arr) & ” です”
    • UBound(arr) を使って配列の上限(最後の要素のインデックス)を取得し、その結果を Debug.Print でイミディエイトウィンドウに出力します。
      この場合、上限は「2」となります。
  4. Debug.Print “配列の要素数の下限は ” & LBound(arr) & ” です”
    • LBound(arr) を使って配列の下限(最初の要素のインデックス)を取得し、その結果を Debug.Print でイミディエイトウィンドウに出力します。
      この場合、下限は「0」となります。
  5. End Sub
    • サブルーチンの終了を示します。

このコードは、配列操作においてインデックスエラーを防ぐために非常に有効です。

また、動的に配列サイズが変わる場合や、多次元配列を扱う際の基礎として、上限・下限を正確に把握できることが重要になります。

使用例2: 2次元配列の要素数の上限と下限を取得する

「Ubound」と「Lbound」を使って、2次元配列の各次元の上限・下限を取得する方法を紹介します。

Sub Get2DArrayBounds()
    Dim arr(3, 5) As Long
    
    Debug.Print "1次元目の上限は " & UBound(arr, 1) & " です"
    Debug.Print "1次元目の下限は " & LBound(arr, 1) & " です"
    
    Debug.Print "2次元目の上限は " & UBound(arr, 2) & " です"
    Debug.Print "2次元目の下限は " & LBound(arr, 2) & " です"
End Sub
動作概要
  • STEP1
    2次元配列を宣言する

    「arr」を2次元配列として宣言し、1次元目は「0から3」、2次元目は「0から5」の範囲で配列を設定します。

  • STEP2
    配列の上限と下限を取得

    「UBound」と「LBound」を使用して配列の上限と下限を取得し、Debug.Print で結果を出力します。
    これにより、配列の範囲が明確になります。

処理結果

使用例2: 2次元配列の要素数の上限と下限を取得するの結果

このコードで使用している機能

詳細解説

コードの詳細
  1. Sub Get2DArrayBounds()
    • 「Get2DArrayBounds」という名前のサブルーチンを定義します。
  2. Dim arr(3, 5) As Long
    • 2次元配列「arr」を宣言します。
      1次元目の範囲は「0から3」、2次元目の範囲は「0から5」です。
  3. Debug.Print “1次元目の上限は ” & UBound(arr, 1) & ” です”
    • UBound(arr, 1) を使って、1次元目の上限を取得し、その結果を Debug.Print でイミディエイトウィンドウに出力します。
      この場合、1次元目の上限は「3」です。
  4. Debug.Print “1次元目の下限は ” & LBound(arr, 1) & ” です”
    • LBound(arr, 1) を使って、1次元目の下限を取得し、その結果を Debug.Print でイミディエイトウィンドウに出力します。
      この場合、1次元目の下限は「0」です。
  5. Debug.Print “2次元目の上限は ” & UBound(arr, 2) & ” です”
    • UBound(arr, 2) を使って、2次元目の上限を取得し、その結果を Debug.Print でイミディエイトウィンドウに出力します。
      この場合、2次元目の上限は「5」です。
  6. Debug.Print “2次元目の下限は ” & LBound(arr, 2) & ” です”
    • LBound(arr, 2) を使って、2次元目の下限を取得し、その結果を Debug.Print でイミディエイトウィンドウに出力します。
      この場合、2次元目の下限は「0」です。
  7. End Sub
    • サブルーチンの終了を示します。

このコードは、VBAにおける2次元配列の上限と下限を確認する基本的な操作を示しています。
UBound と LBound を使用することで、各次元の範囲を簡単に取得でき、特に多次元配列を扱う場合に有効です。

使用例3: 動的配列に要素を「追加」する

このコードは、動的配列「arr」に新しい要素を追加する動作を行います。
ReDim Preserve を使用して既存のデータを保持しながら配列のサイズを拡張し、最後のインデックスに新しい要素を追加します。

Sub AddElementToArray()
    Dim arr() As String
    ReDim arr(2)
    
    arr(0) = "A"
    arr(1) = "B"
    arr(2) = "C"
    
    ReDim Preserve arr(Ubound(arr) + 1)
    arr(Ubound(arr)) = "D"  '// 要素の追加
End Sub
動作概要
  • STEP1
    動的配列を宣言する

    動的配列「arr」を宣言し、3つの要素を持つ配列を作成します。

  • STEP2
    要素を初期化する

    配列に初期値を代入します(A, B, C)。

  • STEP3
    要素を追加する

    ReDim Preserve を使用して配列のサイズを拡張し、新しい要素を追加します。
    この際、Preserve を指定しないと既存のデータが消えるため、注意が必要です。

処理結果

使用例3: 動的配列に要素を「追加」するの結果

このコードで使用している機能

詳細解説

コードの詳細
  1. Sub AddElementToArray()
    • AddElementToArray という名前のサブルーチンを定義しています。
      VBAではサブルーチンを定義するためにSubキーワードを使用し、処理のまとまりを作成します。
  2. Dim arr() As String
    • ここでは、文字列型の動的配列「arr」を宣言しています。
      動的配列は、サイズが事前に固定されていない配列で、後からサイズを変更することができます。
  3. ReDim arr(2)
    • 動的配列「arr」に要素数3(0, 1, 2)を割り当てます
      この時点で、配列のサイズは「3つ」になります。
      ReDim は配列のサイズを設定または再設定するために使用されますが、ここでは初めてサイズを設定しています。
  4. arr(0) = “A”
    • 配列の最初の要素(インデックス0)に “A” を代入しています。
      VBAの配列はインデックスが「0」から始まるため、最初の要素は arr(0) となります。
  5. arr(1) = “B”
    • 2番目の要素(インデックス1)に “B” を代入します。
      これはインデックス1の位置に値を格納する操作です。
  6. arr(2) = “C”
    • 3番目の要素(インデックス2)に “C” を代入します。
      インデックスは0から2までなので、現在の配列の全要素が初期化されました。
  7. ReDim Preserve arr(Ubound(arr) + 1)
    • ReDim Preserve を使用して配列のサイズを1つ拡張します。
      Preserve を指定することで、既存のデータが保持されます。

      Ubound(arr) は配列の上限インデックス(最も大きいインデックス)を取得します。Ubound(arr) + 1 で1つ新しい要素を追加するためのスペースを作ります。

      注意:
      Preserve を指定しない場合、既存のデータ(”A”, “B”, “C”)はすべて消えてしまいます。
      このため、動的配列のサイズを変更するときにデータを保持したい場合は、Preserve を必ず使用する必要があります。
  8. arr(Ubound(arr)) = “D”
    • Ubound(arr) で拡張後の配列の最後のインデックスを取得し、その場所に “D” を代入しています。
      これにより、新しい要素 “D” が配列に追加されます。
  9. End Sub
    • サブルーチンの終了を示します。
      VBAのサブルーチンは、End Sub で処理が終了します。

このコードは、動的配列に要素を追加する基本的な方法を示しています。
特に重要なのは、ReDim Preserve を使うことで既存のデータを保持しながら配列のサイズを変更できる点です。
Preserve を使わない場合、配列サイズの変更と同時に全データが消去されるため、注意が必要です。
動的配列を操作する際には、サイズ変更時のデータ保持をしっかり理解することが、ミスを防ぐために重要です。

使用例4: 動的配列に要素を「削除」する

動的配列「arr」の最後の要素を削除する方法を紹介します。

ReDim Preserve を使用することで、既存のデータを保持しながら配列のサイズを縮小し、不要な要素を削除することができます。
この操作は、動的に変更されるデータの管理に役立ちます。

Sub RemoveElementFromArray()
    Dim arr() As String
    ReDim arr(3)
    
    arr(0) = "A"
    arr(1) = "B"
    arr(2) = "C"
    arr(3) = "D"
    
    ReDim Preserve arr(Ubound(arr) - 1)  '// 要素の削除
End Sub
動作概要
  • STEP1
    動的配列を宣言する

    動的配列「arr」を宣言し、4つの要素を持つ配列を作成します。

  • STEP2
    要素を初期化する

    配列に初期値を代入します。
    配列の各要素に “A”, “B”, “C”, “D” を順に代入して初期化します。

  • STEP3
    要素を追加する

    ReDim Preserve を使用して配列のサイズを1つ減らし、最後の要素 “D” を削除します。
    この操作では Preserve を指定することで、既存のデータを保持しながらサイズを変更します。
    Preserve を指定しない場合、既存のデータが消えてしまうため注意が必要です。

処理結果

使用例4: 動的配列に要素を「削除」するの結果

このコードで使用している機能

詳細解説

コードの詳細
  1. Sub RemoveElementFromArray()
    • この行は、RemoveElementFromArray という名前のサブルーチンを定義しています。
      サブルーチンは、処理の一部をまとめたもので、何度でも呼び出して使うことができます。
  2. Dim arr() As String
    • ここでは、動的配列「arr」を宣言しています。
      String 型の動的配列は、文字列を格納するために使われます。
      動的配列は、プログラム実行中にサイズを変更できる配列のことです。
  3. ReDim arr(3)
    • この行は、動的配列「arr」のサイズを初期化します。
      ReDim を使って、配列のサイズを設定します。
      この場合、配列は「4つ」の要素(0番目から3番目)を持つように初期化されます。
      ReDim を使うことで、配列のサイズを自由に決められます。
  4. arr(0) = “A”
    • ここでは、配列の最初の要素(インデックス0)に “A” という文字列を代入しています。
      インデックスとは、配列の要素を指す番号のことです。
      この場合、arr(0) は配列の1番目の要素にアクセスしています。
  5. arr(1) = “B”
    • この行では、2番目の要素(インデックス1)に “B” を代入しています。
      配列の各要素にはインデックス番号を使ってアクセスします。
  6. arr(2) = “C”
    • ここでは、3番目の要素(インデックス2)に “C” を代入しています。
      配列の要素は、このように順番にデータを入れていくことができます。
  7. arr(3) = “D”
    • この行は、配列の最後の要素(インデックス3)に “D” を代入しています。
      これで、配列「arr」に4つの要素が入ったことになります。
  8. ReDim Preserve arr(Ubound(arr) – 1)
    • この行では、配列「arr」の最後の要素を削除するために、ReDim Preserve を使用します。
      ReDim だけを使うと、配列のサイズを変更できますが、Preserve を付け加えることで、既存のデータを保持したままサイズを変更することができます。

      Ubound(arr) は、配列の最も大きいインデックス、つまり最後の要素の位置を取得します。
      この場合、Ubound(arr) は 3 になります。
    • Ubound(arr) – 1 で、配列のサイズを1つ小さくし、最後の要素 arr(3) を削除します。
  9. End Sub
    • この行でサブルーチンが終了します。
      VBAのサブルーチンは、Sub で始まり、End Sub で終わるルールになっています。

このコードは、動的配列から最後の要素を削除する方法を示しています。
ReDim Preserve を使用することで、配列のサイズを変更しつつ、既存のデータを保持できます。
特に重要なのは、Preserve を使用しないと、すべてのデータが消えてしまう点です。
動的配列を扱う場合、データを保持しつつ操作する際に、ReDim Preserve が非常に役立ちます。

使用例5: 「Ubound」と「Lbound」を使用して配列をループ処理する

配列「arr」に格納された要素を1つずつループ処理し、それぞれの要素を出力する方法を紹介します。

Lbound と Ubound を使って、配列の範囲(最初の要素から最後の要素まで)を動的に取得し、ループ内で効率的に処理します。
これにより、配列の要素数に依存しない汎用的なループ処理が可能です。

Sub LoopThroughArray()
    Dim arr(0 To 3) As String
    
    arr(0) = "A"
    arr(1) = "B"
    arr(2) = "C"
    arr(3) = "D"
    
    Dim i As Long
    For i = Lbound(arr) To Ubound(arr)
        Debug.Print arr(i)  '// イミディエイトウィンドウに出力
    Next i
End Sub
動作概要
  • STEP1
    動的配列を宣言する

    文字列型の配列「arr」を宣言し、4つの要素を持つ配列を作成します。

  • STEP2
    要素を初期化する

    配列に初期値を代入します。
    4つの要素(A, B, C, D)を順に代入して、配列を初期化します。

  • STEP3
    配列をループ処理する

    Lbound と Ubound を使用して、配列の最初の要素と最後の要素を取得し、範囲内でループを実行します。
    各要素を Debug.Print で出力します。

処理結果

使用例5: 「Ubound」と「Lbound」を使用して配列をループ処理するの結果

このコードで使用している機能

詳細解説

コードの詳細
  1. Sub LoopThroughArray()
    • サブルーチン(小さな処理の単位)を定義します。
      このサブルーチンは「LoopThroughArray」という名前が付いています。
  2. Dim arr(0 To 3) As String
    • 「arr」という名前の配列を宣言します。
      この配列は「0から3」までの範囲で要素を持ち、合計4つの要素があります。
      各要素は文字列(String 型)として格納されます。
  3. arr(0) = “A”
    • ここでは、配列の最初の要素(インデックス0)に “A” という文字列を代入しています。
      インデックスとは、配列の要素を指す番号のことです。
      この場合、arr(0) は配列の1番目の要素にアクセスしています。
  4. arr(1) = “B”
    • この行では、2番目の要素(インデックス1)に “B” を代入しています。
      配列の各要素にはインデックス番号を使ってアクセスします。
  5. arr(2) = “C”
    • ここでは、3番目の要素(インデックス2)に “C” を代入しています。
      配列の要素は、このように順番にデータを入れていくことができます。
  6. arr(3) = “D”
    • この行は、配列の最後の要素(インデックス3)に “D” を代入しています。
      これで、配列「arr」に4つの要素が入ったことになります。
  7. Dim i As Long
    • ループ用のカウンタ変数「i」を宣言します。
      この変数は、配列のインデックスを指すために使われます。
  8. For i = Lbound(arr) To Ubound(arr)
    • Lbound(arr) で配列の最初のインデックス(ここでは0)を取得し、Ubound(arr) で配列の最後のインデックス(ここでは3)を取得します。
      その範囲内で、カウンタ変数「i」の値を1ずつ増やしながらループを繰り返します。
  9. Debug.Print arr(i)
    • 配列の現在の要素(「i」に対応するインデックス)を Debug.Print で出力します。
      この結果は、VBAの「イミディエイトウィンドウ」に表示されます。
      配列のすべての要素が順番に表示されます。
  10. Next i
    • For 文によるループ処理の次のインデックスに進みます。
      全てのインデックス(0から3)で処理が行われたら、ループが終了します。
  11. End Sub
    • サブルーチンが終了します。
      ここで処理が完了します。

このコードは、Lbound と Ubound を使うことで、配列の範囲を動的に取得し、その範囲内でループ処理を行う基本的な例です。
Lbound は配列の最初の要素のインデックス、Ubound は最後の要素のインデックスを返すため、配列の大きさに関係なく正確なループを実行できます。

配列のインデックスやループ処理が自動的に処理されるため、要素の数が増減しても正確に処理が行えるのが利点です。

まとめ

今回の記事では、Excel VBAにおける「Ubound」と「Lbound」関数を使って、配列の上限・下限を取得し、配列のサイズや要素を柔軟に操作する方法を解説しました。

ここでもう一度ポイントを振り返りましょう。

ポイントのおさらい

VBAの「Ubound」と「Lbound」を活用することで、配列操作がより柔軟で効率的になります。
これにより、配列のサイズや要素を動的に管理できるため、データの変動が激しい状況でも柔軟に対応できます。
2次元配列や動的配列を使った業務の効率化にぜひ役立ててください。

再度記事を確認しながら、コードを実際に動かし、スキルを確実に自分のものにしましょう。

この記事の内容を参考にし、次のステップとして配列操作をもっと深く掘り下げ、業務の効率化を進めていきましょう。

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