##はじめに
エクセルVBAには、配列を連結し1つの配列にする関数がありません。
ということで、今回、複数の一次元配列を連結し、1つの一次元配列にする関数を作成しました。
##コード
まずは結論から。
コードを記載します。関数名はmerge1DArrayとしました。
引数として、一次元配列の配列を受け取ります。
Function merge1DArray(arr() As Variant) As Variant
Dim mergedArray() As Variant
Dim i As Long, j As Long, index As Long: index = 0
For i = LBound(arr) To UBound(arr)
If i = UBound(arr) Then
ReDim Preserve mergedArray(index + UBound(arr(i)) - LBound(arr(i)))
Else
ReDim Preserve mergedArray(index + UBound(arr(i)) - LBound(arr(i)) + 1)
End If
For j = LBound(arr(i)) To UBound(arr(i))
mergedArray(j + index) = arr(i)(j)
Next j
index = index + UBound(arr(i)) - LBound(arr(i)) + 1
Next i
merge1DArray = mergedArray
End Function
確かめてみます。
Sub test()
Dim arr1(3) As String
Dim arr2(1) As String
Dim arr3(2) As String
Dim arr(2) As Variant
Dim mergedArray() As Variant
Dim i As Integer
arr1(0) = "あいうえお"
arr1(1) = "かきくけこ"
arr1(2) = "さしすせそ"
arr1(3) = "たちつてと"
arr2(0) = "なにぬねの"
arr2(1) = "はひふへほ"
arr3(0) = "まみむめも"
arr3(1) = "やゆよ"
arr3(2) = "らりるれろ"
arr(0) = arr1
arr(1) = arr2
arr(2) = arr3
mergedArray = merge1DArray(arr)
For i = LBound(mergedArray) To UBound(mergedArray)
MsgBox mergedArray(i)
Next i
End Sub
##解説
まず、動的な配列:mergedArray()を用意します。
この関数は、引数として受け取った配列の配列:arr()の最初のインデックスから最後のインデックスまでループを行い(カウンター変数i)、それぞれの要素(配列)をmergedArray()に格納していきます。
このために、Redim Preserveステートメントを使って、すでにmergedArray()に格納された要素は保持しながらarr(i)の要素数分だけmergedArrray()の要素数を確保します。
これが、If文を使った条件分岐になっているのは、mergedArray()の最初のインデックスが0から始まるため、実は要素数が1つ多い状態でループが進んでいってしまうのですが、ループの最後のiになったときに、
ReDim Preserve mergedArray(index + UBound(arr(i)) - LBound(arr(i)))
と「 + 1 」をなくすことでで、帳尻を合わせています。
実際にmergedArrayに要素を格納していく操作が、カウンター変数jを使ったループです。
indexにarr(i)の要素数を足して次のループに移ります。