配列から空文字を除外する
にメンテナンス済み
VBA の配列には、シートから読み込んだデータや Split 関数の結果など、空文字("")の要素が紛れ込むことがあります。
VBA には配列の要素を条件で絞り込む標準関数がないため、空文字を除外するには自分でループを書く必要があります。
本記事では、配列から空文字を除外する関数を作り、使い方と注意点を解説します。
空文字とは
空文字とは、文字数が 0 の文字列""のことです。スペースだけの文字列" "は空文字ではありません。
空文字を除外する基本的な考え方
- 元の配列と同じ大きさの配列を用意する
- 元の配列をループし、空文字でない要素だけを順に詰めていく
- 最後に
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
#配列
#空文字
#データ操作