スポンサーリンク
Excel VBAを使用して大量のデータを処理する際、セル範囲のデータを一次元配列に変換することは一般的です。この記事では、複数のセル範囲からなるデータを一次元配列に変換する効果的で柔軟なVBAコードに焦点を当てます。これにより、データ処理や分析の際により簡潔なコードを記述できます。
スポンサーリンク
実装
Sub test()
Dim VV As Variant
Dim V As Variant
' 複数のセル範囲から一次元配列に変換
VV = RangeToAry(Selection, Range("e3:e4"), Range("c18,d19,g4"))
' 変換された一次元配列の要素を表示
For Each V In VV
Debug.Print V
Next
End Sub
' RangeのValueを一次元配列に変換
Function RangeToAry(Rng1 As Range, ParamArray RngOther()) As Variant
Dim RR As Range
Dim Ary() As Variant
Dim C As Long
Dim i As Long
' 各セル範囲からデータを抽出し、一次元配列に追加
RangeToArySub ToUsedRange(Rng1), Ary, C
For i = LBound(RngOther) To UBound(RngOther)
RangeToArySub ToUsedRange(RngOther(i)), Ary, C
Next
' 最終的な一次元配列を返す
RangeToAry = Ary
End Function
' 行または列全体の時は使用範囲内に絞る
Private Function ToUsedRange(ByVal RR As Range) As Range
If RR.Rows.Count = RR.Worksheet.Rows.Count Then
Set RR = Intersect(RR, RR.Worksheet.UsedRange)
End If
If RR.Columns.Count = RR.Worksheet.Columns.Count Then
Set RR = Intersect(RR, RR.Worksheet.UsedRange)
End If
Set ToUsedRange = RR
End Function
Private Sub RangeToArySub(ByVal Rng As Range, ByRef Ary() As Variant, ByRef C As Long)
Dim Are As Range
Dim VV As Variant
Dim V As Variant
Dim N As Long
' 各エリアからデータを抽出し、一次元配列に追加
For Each Are In Rng.Areas
N = Are.Cells.Count
ReDim Preserve Ary(1 To C + N)
If N = 1 Then
C = C + 1
Ary(C) = Are.Value
Else
VV = Are.Value
For Each V In VV
C = C + 1
Ary(C) = V
Next
End If
Next
End Subtestサブルーチン: テスト用のコード。複数のセル範囲から一次元配列に変換し、その結果をデバッグウィンドウに表示します。RangeToAry関数: メインの関数。引数として与えられたセル範囲を一次元配列に変換します。ToUsedRange関数: 行または列全体の場合、使用範囲内に絞り込むための関数。RangeToArySubサブルーチン: 各セル範囲またはエリアからデータを抽出し、一次元配列に追加するためのサブルーチン。
解説
Sub test()
Dim VV As Variant
Dim V As Variant
' 複数のセル範囲から一次元配列に変換
VV = RangeToAry(Selection, Range("e3:e4"), Range("c18,d19,g4"))
' 変換された一次元配列の要素を表示
For Each V In VV
Debug.Print V
Next
End SubVV = RangeToAry(Selection, Range("e3:e4"), Range("c18,d19,g4")):RangeToAry関数を使用して、複数のセル範囲からデータを一次元配列に変換します。For Each V In VV: 変換された一次元配列の各要素を取得し、Debug.Printを使用してデバッグウィンドウに表示します。
Function RangeToAry(Rng1 As Range, ParamArray RngOther()) As Variant
Dim RR As Range
Dim Ary() As Variant
Dim C As Long
Dim i As Long
' 各セル範囲からデータを抽出し、一次元配列に追加
RangeToArySub ToUsedRange(Rng1), Ary, C
For i = LBound(RngOther) To UBound(RngOther)
RangeToArySub ToUsedRange(RngOther(i)), Ary, C
Next
' 最終的な一次元配列を返す
RangeToAry = Ary
End FunctionRangeToArySub ToUsedRange(Rng1), Ary, C:RangeToArySubサブルーチンを呼び出して、各セル範囲からデータを一次元配列に追加します。For i = LBound(RngOther) To UBound(RngOther):ParamArrayを使用して可変数の引数を受け取り、それぞれのセル範囲からデータを一次元配列に追加します。RangeToAry = Ary: 最終的な一次元配列を返します。
Private Function ToUsedRange(ByVal RR As Range) As Range
If RR.Rows.Count = RR.Worksheet.Rows.Count Then
Set RR = Intersect(RR, RR.Worksheet.UsedRange)
End If
If RR.Columns.Count = RR.Worksheet.Columns.Count Then
Set RR = Intersect(RR, RR.Worksheet.UsedRange)
End If
Set ToUsedRange = RR
End FunctionIf RR.Rows.Count = RR.Worksheet.Rows.Count: もしセル範囲が行全体を表している場合、使用範囲内に絞り込みます。If RR.Columns.Count = RR.Worksheet.Columns.Count: もしセル範囲が列全体を表している場合、使用範囲内に絞り込みます。
Private Sub RangeToArySub(ByVal Rng As Range, ByRef Ary() As Variant, ByRef C As Long)
Dim Are As Range
Dim VV As Variant
Dim V As Variant
Dim N As Long
' 各エリアからデータを抽出し、一次元配列に追加
For Each Are In Rng.Areas
N = Are.Cells.Count
ReDim Preserve Ary(1 To C + N)
If N = 1 Then
C = C + 1
Ary(C) = Are.Value
Else
VV = Are.Value
For Each V In VV
C = C + 1
Ary(C) = V
Next
End If
Next
End SubFor Each Are In Rng.Areas: セル範囲を構成する各エリアについて処理を行います。N = Are.Cells.Count: エリア内のセル数を取得します。ReDim Preserve Ary(1 To C + N): 配列Aryのサイズを拡張します。If N = 1 Then: エリア内に単一のセルしかない場合、その値を直接一次元配列に追加します。VV = Are.Value: エリア内の値をVV配列に取得します。For Each V In VV:VV配列から各要素を取得し、一次元配列に追加します。
まとめ
この記事では、Excel VBAを使用して複数のセル範囲からデータを一次元配列に変換する効果的な方法に焦点を当てました。以下は、この記事で解説された主なポイントです。
- テストサブルーチンの使用:
testサブルーチンでは、RangeToAry関数を使用して複数のセル範囲から一次元配列に変換し、その結果をデバッグウィンドウに表示しました。 - RangeToAry 関数: メインの関数で、
ToUsedRange関数を呼び出して各セル範囲からデータを抽出し、可変長の配列に追加します。ParamArrayを使用して可変数の引数を受け取り、それぞれのセル範囲からデータを一次元配列に追加します。 - ToUsedRange 関数: 行または列全体の場合、使用範囲内に絞り込むための関数。セル範囲が行または列全体を表している場合、
Intersectを使用して使用範囲内に絞り込みます。 - RangeToArySub サブルーチン: 各セル範囲またはエリアからデータを抽出し、一次元配列に追加するサブルーチン。エリア内が単一のセルか複数のセルかによって処理が異なります。
このサンプルコードを使用することで、Excel VBAを使ったデータ処理が効率的に行え、柔軟性が向上します。複数のセル範囲からデータを一次元配列に変換する必要がある場合、このソリューションが参考になると思います!
