配列から空文字を除外する

にメンテナンス済み

VBA の配列には、シートから読み込んだデータや Split 関数の結果など、空文字("")の要素が紛れ込むことがあります。

VBA には配列の要素を条件で絞り込む標準関数がないため、空文字を除外するには自分でループを書く必要があります。

本記事では、配列から空文字を除外する関数を作り、使い方と注意点を解説します。

空文字とは

空文字とは、文字数が 0 の文字列""のことです。スペースだけの文字列" "は空文字ではありません。

空文字を除外する基本的な考え方

  1. 元の配列と同じ大きさの配列を用意する
  2. 元の配列をループし、空文字でない要素だけを順に詰めていく
  3. 最後に ReDim Preserve で、詰めた個数に合わせて配列を縮める

コード例:空文字を除外する関数

空文字を除外する関数
Public Function RemoveEmptyStrings(ByVal source As Variant) As Variant
    Dim result() As Variant
    Dim i As Long
    Dim count As Long

    ' 要素が 0 個の配列は、そのまま空の配列を返す
    If UBound(source) < LBound(source) Then
        RemoveEmptyStrings = Array()
        Exit Function
    End If

    ReDim result(0 To UBound(source) - LBound(source))

    For i = LBound(source) To UBound(source)
        If Len(source(i)) > 0 Then
            result(count) = source(i)
            count = count + 1
        End If
    Next i

    ' すべて空文字だった場合は、空の配列を返す
    If count = 0 Then
        RemoveEmptyStrings = Array()
        Exit Function
    End If

    ReDim Preserve result(0 To count - 1)
    RemoveEmptyStrings = result
End Function

呼び出し側の例です。

呼び出し例
Public Sub RemoveEmptyStringsSample()
    Dim originalArray As Variant
    Dim cleanedArray As Variant
    Dim i As Long

    originalArray = Array("Apple", "", "Banana", "", "Cherry", "Date", "")
    cleanedArray = RemoveEmptyStrings(originalArray)

    ' 結果が空の配列の場合は UBound < LBound になる
    If UBound(cleanedArray) < LBound(cleanedArray) Then
        Debug.Print "有効な要素がありません"
        Exit Sub
    End If

    For i = LBound(cleanedArray) To UBound(cleanedArray)
        Debug.Print cleanedArray(i)
    Next i
End Sub

イミディエイトウィンドウには Apple Banana Cherry Date が出力されます。

コードのポイント

  • Len(source(i)) > 0 で判定: source(i) <> "" と同じ結果になりますが、Empty や Null の要素があってもエラーになりません(Empty と Null は除外されます)
  • LBound / UBound を使う: Array 関数で作った配列の開始位置は Option Base の設定に依存し、シートの Range.Value から取得した配列は常に 1 始まりです。添字の開始位置を決め打ちしないようにします
  • すべて空文字の場合: ReDim Preserve result(0 To -1) はエラーになるため、count = 0 のときは Array() で空の配列を返しています
  • 戻り値の空チェック: 空の配列は UBound(配列) < LBound(配列) で判定できます
ReDim Preserve は多用しない

ReDim Preserveは配列を作り直してデータをコピーするため、要素を1つ追加するたびに呼び出すと処理が遅くなります。この例では、最初に最大サイズを確保し、最後に1回だけ縮めています。

空白だけの要素も除外したい場合

スペースだけの要素も取り除きたい場合は、Trim で前後の空白を取り除いてから判定します。

If Len(Trim(source(i))) > 0 Then

全角スペースも除外したい場合は、Replace(source(i), " ", "") なども組み合わせて判定します。

まとめ

  • VBA には空文字を除外する標準関数がないため、ループで新しい配列に詰め直す
  • 元と同じ大きさの配列を用意して詰め、最後に ReDim Preserve で 1 回だけ縮めると効率的
  • すべて空文字の場合に ReDim ... To -1 でエラーにならないよう、Array() を返す
  • 空白だけの要素も除外したいときは Trim を使う
#VBA #配列 #空文字 #データ操作