Convert Array of 2 Dimension to 1 Dimension
In Excel VBA , we use 2D arrays quite often. This is because, we convert Excel Worksheet Range to Array and do the data list or string operations on the list. In most cases it will be a 2D array.
While converting a 2D array to 1D, we can do it 2 ways. Either convert all the Rows in to a list or Columns into list. Both these can be achieved by using the function mentioned in this code.
Not only converting, this code will help you in understanding how to get only a row or column from a 2D array without using looping thru each element. It saves some time.
Sub Convert_2D_To_1D_Array() Dim rng As Range, arr As Variant 'Convert Rows to 1D Set rng = ThisWorkbook.Sheets("Sheet2").Range("A1") arr = Array_2D_To_1D("R") Set rng = rng.Resize(1, UBound(arr, 1) + 1) rng = arr 'Convert Columns to 1D Set rng = ThisWorkbook.Sheets("Sheet2").Range("A2") arr = Array_2D_To_1D("C") Set rng = rng.Resize(1, UBound(arr, 1) + 1) rng = arr End Sub Function Array_2D_To_1D(cr As String) As Variant 'Declare Array as variant & Range Dim rArray() As Variant, rRange As Range, iRow As Double, iCol As Double Dim d1Arr As Variant, app As Object, sStr As String 'Initialize Range to Reference a portion of Worksheet Set rRange = ThisWorkbook.Sheets("sheet1").Range("A1:D3") Set app = Application 'Assign Range to Array rArray = rRange.Value sStr = "" 'Convert to 1D Array - By Row If cr = "R" Then For iRow = 1 To UBound(rArray, 1) d1Arr = app.Index(rArray, iRow, 0) If sStr = "" Then sStr = Join(d1Arr, ",") Else sStr = sStr & "," & Join(d1Arr, ",") End If Next iRow End If 'Convert to 1D Array - By Column If cr = "C" Then For iCol = 1 To UBound(rArray, 2) d1Arr = app.Transpose((app.Index(rArray, 0, iCol))) If sStr = "" Then sStr = Join(d1Arr, ",") Else sStr = sStr & "," & Join(d1Arr, ",") End If Next iCol End If 'Display 2D array converted to 1D MsgBox sStr d1Arr = VBA.Split(sStr, ",") Array_2D_To_1D = d1Arr End Function
You can opt to use only one method rather than using both row/column slicing method
Slice 2D Array Elements Quickly
Here is an example for the two methods:
2D Array – Range(“A1:D3”) – Array Size (3,4)
2D Array | Col1 | Col2 | Col3 | Col4 |
Row1 | a | b | c | d |
Row2 | 1 | 2 | 3 | 4 |
Row3 | Excel | Macro | VBA | Array |
2D to 1D Array – By Converting each Row
a | b | c | d | 1 | 2 | 3 | 4 | Excel | Macro | VBA | Array |
2D to 1D Array – By Converting each Column
a | 1 | Excel | b | 2 | Macro | c | 3 | VBA | d | 4 | Array |
Note that from the 2nd value on, each of these 1D array differs. In the first one, it reads the “a,b,c,d” the first row, then 2nd row and goes on. In second 1D Array, it the columns values “a,1,Excel”, then next column and so on.
It up to your needs to use on these methods and not both. Similar to a range, the same method can also be used to convert a table or named range into an Array.
The .resize function used in the code is mandatory to tell Excel what would be the exact size of the array that we are writing into worksheet. So, we initialize a range to address “A1”. Then, we resize it as per the size of the array using the comamnd UBound(Arr,1). This gives the number of items in the 1D Array.