Excel VBA 配列の処理に役立つ3つの関数を紹介します

スポンサーリンク

今回は、配列を使うのに役立つ3つの関数 LBoundUBoundSplitの使い方です。配列を使う上ではほぼ必須と言っていい関数です。インデックス番号の最小値/最大値を返すLBoundUBound、要素ごとに区切られた文字列から配列を作るSplitついて詳しく解説します

前回のサンプルを使って、設定を変更したりしながらたくさん復習してみました。
今回もすごく楽しみです。よろしくお願いしますm(_ _)m

くるみこ
くるみこ

自分で設定を変えて試すことはすごく大事です。頑張ってください(^^)/
前回は配列を返すArray関数について紹介しましたが、今回は、配列で利用する重要な関数をさらに3つ紹介します!

前回のおさらいはこちらの記事です(^^)/ 下のカードをクリックすれば開きます

くるみこ
くるみこ

前回記事で紹介したプチサンプルは

・「配列」のいろいろな初期化方法のサンプル
・「配列」のいろいろな代入方法や配列データの使用方法のサンプル
・「配列」内データのいろいろな処理方法のサンプル

【この記事でわかること
・LBound関数とUBound関数の使い方がわかります
・Spilit関数の使用方法がわかります
・3つの関数を使ったサンプルコードを提示します

スポンサーリンク

LBound 関数 と UBound 関数

LBound」は、「UBound」配列のサイズを調べるため使用する関数です。それぞれ単独でも使いますが、組み合わせて使うことが多いのであわせて覚えておいたほうがよいでしょう

宣言時に大きさを指定した配列では、大きさを調べる必要はありませんが、次のようなケースでは配列の大きさを調べる必要があります

・動的配列の大きさ
・関数やメソッドが返した配列の大きさ

前回のサンプルで、セルの範囲をCurrentResion等で取得した場合などもそれにあたります

LBound 関数とは

「LBound」関数は、指定された次元の配列で使用できるインデックス番号の最小値を返します

構文
LBound(arrayname[, dimension])

・引数 arrayname は[必須]です。配列変数の名前を指定します
・引数 dimension は[省略可能]です。配列の調べたい次元を整数値で指定します
 最初の次元なら「1」、2番目の次元なら「2」というように指定しますが、
 省略した場合は「1」が指定されたものとみなされます
・戻り値の型は、数値型 (Long)です

・「LBound」関数は、配列を正しい初期値からループしたいときに使用します
・配列の最大インデックスを取得したいときはこの後紹介する「UBound関数」を使用します
・「UBound 関数」と使用して配列の全要素をループできます
存在しない次元を指定するとエラーが発生します

LBound 関数の使用例

'配列の LBound を種類別に調べるサンプル
Sub LBoundSample()
    Dim i As Long

    '単純な一次元配列
    Dim ara(3) As Long ' 0 to 2
    i = LBound(ara)
    MsgBox "配列「ara(3)」の最小インデックスは「 " & i & " 」です!"
    
    '開始終了インデックスを指定した一次元配列
    Dim arb(2 To 5) As Long
    i = LBound(arb)
    MsgBox "配列「arb(2 To 5)」の最小インデックスは「 " & i & " 」です!"
    
    '開始終了インデックスを指定した2次元配列
    Dim arc(0 To 2, 1 To 3) As Long
    '次元1を調べる
    i = LBound(arc, 1) ' 1 次元は 0 to 2
    MsgBox "配列「arc(0 To 2, 1 To 3)」の" & vbCrLf & _
            "次元1の最小インデックスは「 " & i & " 」です!"
    
    '次元2を調べる
    i = LBound(arc, 2) ' 2 次元は 1 to 3
    MsgBox "配列「arc(0 To 2, 1 To 3)」の" & vbCrLf & _
            "次元2の最小インデックスは「 " & i & " 」です!"
End Sub

・結果(最小インデックス)をメッセージボックスで表示するようにしています
・コードにコメントを付けていますので参照してください

UBound 関数とは

UBound」関数は、指定された次元の配列で使用できるインデックス番号の最大値を返します

構文 (構文は関数名の違いだけで LBound関数 と同じです)
UBound(arrayname[, dimension])

・引数 arrayname は[必須]です。配列変数の名前を指定します
・引数 dimension は[省略可能]です。配列の調べたい次元を整数値で指定します
 最初の次元なら「1」、2番目の次元なら「2」というように指定しますが、
 省略した場合は「1」が指定されたものとみなされます
・戻り値の型は、数値型 (Long)です

・引数「arrayname」のインデックスが~ 1の配列なら1、~ 2の配列なら2を返します
・引数「dimension」を省略すると「1」を指定したのと同じです
・引数「dimension」に2を指定すると二次元目の配列の最大インデックスを返します
・存在しない次元「dimension」を指定するとエラーが発生します
・「LBound 関数」と使用すれば配列の全要素をループできます

UBound 関数の使用例

'配列の UBound を種類別に調べるサンプル
Sub UBoundSample()
    Dim i As Long

    '単純な一次元配列
    Dim ara(5) As Long ' 0 to 2
    i = UBound(ara)
    MsgBox "配列「ara(5)」の最大インデックスは「 " & i & " 」です!"
    
    '開始終了インデックスを指定した一次元配列
    Dim arb(3 To 10) As Long
    i = UBound(arb)
    MsgBox "配列「arb(3 To 10)」の最大インデックスは「 " & i & " 」です!"
    
    '開始終了インデックスを指定した2次元配列
    Dim arc(0 To 5, 1 To 6) As Long
    '次元1を調べる
    i = UBound(arc, 1) ' 1 次元は 0 to 2
    MsgBox "配列「arc(0 To 5, 1 To 6)」の" & vbCrLf & _
            "次元1の最大インデックスは「 " & i & " 」です!"
    
    '次元2を調べる
    i = UBound(arc, 2) ' 2 次元は 1 to 3
    MsgBox "配列「arc(0 To 5, 1 To 6)」の" & vbCrLf & _
            "次元2の最大インデックスは「 " & i & " 」です!"
End Sub

・結果(最大インデックス)をメッセージボックスで表示するようにしています
・コードにコメントを付けていますので参照してください

Split 関数とは

Split」関数は、文字列を区切り文字で分割し、各要素を文字列型の一次元配列に格納します

構文
Split(Expression, Delimiter, Limit, Compare)

・引数「Expression」は[必須]です。文字と区切り文字を含んだ文字列式を指定します
・引数「Delimiter」は[省略可能]です。区切り文字を指定します
・引数「Limit」は[省略可能]です。返す配列の要素数(分割数)を指定します
・引数「Compare」は[省略可能]です。文字列式の比較モードを指定します
   vbBinaryCompare (既定):全角半角、大文字小文字が区別されます
   vbTextCompare:全角半角、大文字小文字は区別されません

・引数「Delimiter」の区切り文字を省略したときは半角スペース” “で分割します
・引数「Delimiter」が見つからないときは、要素数が 1 つの配列を返します
・引数「Limit」を省略したときは、引数「Delimiter」ですべて分割した配列を返します
・引数「Limit」が1なら、要素数が 1 つの配列を返します
・引数「Limit」が2なら、要素数が 2 つの配列を返します
作成される配列は動的配列で、最初のインデックスは0からスタートします
戻り値の型は、文字列型(String)の一次元配列です

Split 関数の使用方法

色々な区切り文字のパターンでの Split 関数の使い方を示したサンプルです

'Split関数の動作テストサンプル
Sub SplitTestSample()
    Dim s As String, h As String
    Dim v() As String
    Dim c As Variant
    
    '「,」区切り(CSV形式)
    MsgBox "「,」区切り(CSV形式)のテスト" & vbCrLf & _
            "「A,B,C,D,E」をSplitします"
    h = "「A,B,C,D,E」のSplit結果は"
    s = "A,B,C,D,E"
    v = Split(s, ",")
    For Each c In v
        h = h & vbCrLf & c
    Next
    MsgBox h
   
    '「,」区切り(CSV形式)の(Limit=3)でテスト
    MsgBox "「,」区切り(CSV形式)のテスト" & vbCrLf & _
            "「A,B,C,D,E」を(Limit=3)でSplitします"
    h = "「A,B,C,D,E」を(Limit=3)でSplitした結果は"
    s = "A,B,C,D,E"
    v = Split(s, ",", Limit:=3)
    For Each c In v
        h = h & vbCrLf & c
    Next
    MsgBox h
    
    '「タブ(vbTab)」区切り形式のテスト
    MsgBox "「タブ(vbTab)」区切り形式のテスト" & vbCrLf & _
            "「1    2   3   4   5」をSplitします"
    h = "「1    2   3   4   5」をタブ(vbTab)でSplitした結果は"
    'タブかスペースかわかりにくいので定数で区切ります
    s = "1" & vbTab & "2" & vbTab & "3" & vbTab & "4" & vbTab & "5"
    v = Split(s, vbTab)
    For Each c In v
        h = h & vbCrLf & c
    Next
    MsgBox h
    
    '文字で区切る形式(バイナリモード)のテスト
    MsgBox "文字「と」で区切るテスト" & vbCrLf & _
            "「AとBとCとDとE」をSplitします"
    h = "「AとBとCとDとE」を「と」でSplitした結果は"
    s = "AとBとCとDとE"
    v = Split(s, "と")
    For Each c In v
        h = h & vbCrLf & c
    Next
    MsgBox h
        
    '文字で区切る形式(テキストモード)のテスト
    MsgBox "文字「A」区切り形式(テキストモード)のテスト" & vbCrLf & _
            "「くAるAみAこ」を「a」でSplitします"
    h = "「くAるAみAこ」を「a」でSplitした結果は"
    s = "くAるAみAこ"
    v = Split(s, "a", Compare:=vbTextCompare)
    For Each c In v
        h = h & vbCrLf & c
    Next
    MsgBox h
    
    '文字列で区切る形式のテスト
    MsgBox "文字列「AND」で区切る形式のテスト" & vbCrLf & _
            "「くANDるANDみANDこ」を「AND」でSplitします"
    h = "「くANDるANDみANDこ」を「AND」でSplitした結果は"
    s = "くANDるANDみANDこ"
    v = Split(s, "AND")
    For Each c In v
        h = h & vbCrLf & c
    Next
    MsgBox h
End Sub

・結果の抽出は For Eachステートメントで配列要素が無くなるまでループ処理しています
・開始時にテストする設定をメッセージで表示します
・ループ途中で改行を入れて結果を縦に並べて表示するようにしています
・処理完了後に、動作確認した設定と処理結果をメッセージで表示します

LBoundとUBoundを組み合わせて使う

・先ほどテストしたSplit関数の処理では For Eachステートメントのループを使用しましたが
・「LBound」と「UBound」を使ってFor Nextで全要素のループ処理を行うことができます

Splitの結果をLBoundとUBoundを使って処理する

先ほどの Split 関数の動作テストサンプルを書き換えてみたサンプルがこちらです

'LBound関数とUBound関数を使用してSplit関数の動作テストサンプルを書き換えてみます
Sub SplitForToLoopSample()
    Dim s As String, h As String
    Dim v() As String
    Dim c As Variant
    
    '「,」区切り(CSV形式)
    MsgBox "「,」区切り(CSV形式)のテスト" & vbCrLf & _
            "「A,B,C,D,E」をSplitします"
    s = "A,B,C,D,E"
    h = "「" & s & "」のSplit結果は"
    v = Split(s, ",")
    Call LoopArray(v, h)
   
    '「,」区切り(CSV形式)の(Limit=3)でテスト
    MsgBox "「,」区切り(CSV形式)のテスト" & vbCrLf & _
            "「A,B,C,D,E」を(Limit=3)でSplitします"
    s = "A,B,C,D,E"
    h = "「" & s & "」を(Limit=3)でSplitした結果は"
    v = Split(s, ",", Limit:=3)
    Call LoopArray(v, h)
    
    '「タブ(vbTab)」区切り形式のテスト
    MsgBox "「タブ(vbTab)」区切り形式のテスト" & vbCrLf & _
            "「1    2   3   4   5」をSplitします"
    s = "1" & vbTab & "2" & vbTab & "3" & vbTab & "4" & vbTab & "5"
    h = "「" & s & "」をタブ(vbTab)でSplitした結果は"
    v = Split(s, vbTab)
    Call LoopArray(v, h)
    
    '文字で区切る形式(バイナリモード)のテスト
    MsgBox "文字「と」で区切るテスト" & vbCrLf & _
            "「AとBとCとDとE」をSplitします"
    s = "AとBとCとDとE"
    h = "「" & s & "」を「と」でSplitした結果は"
    v = Split(s, "と")
    Call LoopArray(v, h)
        
    '文字で区切る形式(テキストモード)のテスト
    MsgBox "文字「A」区切り形式(テキストモード)のテスト" & vbCrLf & _
            "「くAるAみAこ」を「a」でSplitします"
    s = "くAるAみAこ"
    h = "「" & s & "」を「a」でSplitした結果は"
    v = Split(s, "a", Compare:=vbTextCompare)
    Call LoopArray(v, h)
    
    '文字列で区切る形式のテスト
    MsgBox "文字列「AND」で区切る形式のテスト" & vbCrLf & _
            "「くANDるANDみANDこ」を「AND」でSplitします"
    s = "くANDるANDみANDこ"
    h = "「" & s & "」を「AND」でSplitした結果は"
    v = Split(s, "AND")
    Call LoopArray(v, h)
End Sub

'LBound関数とUBound関数を使用してLoop処理するサンプルです
Sub LoopArray(vData As Variant, h As String)
    Dim i As Long
    For i = LBound(vData) To UBound(vData)
        h = h & vbCrLf & vData(i)
    Next
    MsgBox h
End Sub

・57行目からのプロシージャにループ処理をセットして、これを呼び出す設定にしています
・「LBound」で配列の開始インデックスを取得してループのスタート値に使用します
・「UBound」でインデック番号の最大値を取得してループカウンターの終了値に使用します
・各処理から「Split関数で作成した配列」と「設定を説明した文字列」を渡して呼び出します

スポンサーリンク

まとめ(おわりに)

・いかがでしたでしょうか?
前回に引き続き今回の記事でも実行例の「メッセージ画像」などは割愛しました!
実際に動かして確認してもらいたいという思いからです。是非、動かしてみてください!
サンプルファイルを用意していますのでよろしければお使いください(^^)

まとめと感想など

くるみこ
くるみこ

LBound関数、UBound関数、Split関数について紹介しました。
これで「配列」についての概念的なことは大体わかったのではないでしょうか。 いかがでしたか?

はい、すごく勉強になりました!

でも、使い道がまだよくわからないんです。どうしたらいいでしょうか?

くるみこ
くるみこ

そうなんですよね。サンプルなどをたくさん見ていても、実際にどういう用途で使うのかという部分については、経験で身につけていくことになるのかなぁ。
では、次回はどういう用途で使うのかについて解説できるように準備したいと思います! 少し待っていてくださいね(^^;

最後に、この記事で項目をまとめておきます
・LBound関数は配列で使用できるインデックス番号の最小値を返します
・UBound関数は配列で使用できるインデックス番号の最大値を返します
・Spilit関数は文字列を区切り文字で分割して文字列型の一次元配列にします
・3つの関数の使用サンプルと3つとも使ったサンプルを紹介しました

マクロ(VBA)を実行する際は必ずバックアップを取ってから行ってください
・マクロ(VBA)は実行後にファイルを保存すると元に戻すことはできません!
・実行後にファイルを保存せず終了すれば、実行前に戻すことができます!


ブログランキングに参加しています(^^) 応援よろしくお願いしますm(_ _)m

今後の記事について

今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
当面は「初心者向けマクロVBA」の記事を継続して書いていきます

【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう現在検討中です
・その他雑記的に「小ネタなどいろいろ」・・・・・
・今後の記事にもご期待ください(^^)/

記事のサンプルファイルをダウンロードできます

今回の記事のサンプルをダウンロードできるようにしています
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください

スポンサーリンク

スポンサーリンク