Sub Test_3DArray()
Dim startTime As Single
startTime = Timer
Application.ScreenUpdating = False
Dim ArrayColumnNumber As Long, ArrayColumnNumberStart As Long, ColumnNumberOffset As Long, LastColumnNumberInSheet As Long
Dim ArrayNumber As Long
Dim ArrayRow As Long, DestinationArrayRow As Long, LastRowInBlockRange As Long, LastRowInSheet As Long
Dim LastRowInBlockRangeFinder As Long, StartRowOfHeader As Long
Dim DataBlockSize As Long, NumberOfDataBlocks As Long
Dim DestinationArray As Variant, SourceArray As Variant
Dim wsDestination As Worksheet, wsSource As Worksheet
ArrayColumnNumberStart = 1
DataBlockSize = 4
StartRowOfHeader = 1
Set wsDestination = Sheets("Sheet2")
Set wsSource = Sheets("Sheet1")
LastColumnNumberInSheet = Sheets("Sheet1").Cells.Find("*", , xlFormulas, , xlByColumns, xlPrevious).Column
LastRowInSheet = Sheets("Sheet1").Cells.Find("*", , xlFormulas, , xlByRows, xlPrevious).Row
NumberOfDataBlocks = LastColumnNumberInSheet / DataBlockSize
ColumnNumberOffset = 0
ReDim SourceArray(1 To NumberOfDataBlocks)
For LastRowInBlockRangeFinder = 1 To NumberOfDataBlocks
LastRowInBlockRange = wsSource.Range(wsSource.Cells(StartRowOfHeader, _
ArrayColumnNumberStart + ColumnNumberOffset), wsSource.Cells(LastRowInSheet, _
ColumnNumberOffset + DataBlockSize)).Find("*", , xlFormulas, , xlByRows, xlPrevious).Row
SourceArray(LastRowInBlockRangeFinder) = wsSource.Range(wsSource.Cells(StartRowOfHeader, _
ArrayColumnNumberStart + ColumnNumberOffset), wsSource.Cells(LastRowInBlockRange, _
ColumnNumberOffset + DataBlockSize))
ColumnNumberOffset = ColumnNumberOffset + DataBlockSize
Next
DestinationArrayRow = 0
ReDim DestinationArray(1 To NumberOfDataBlocks * LastRowInSheet, 1 To DataBlockSize)
For ArrayNumber = 1 To NumberOfDataBlocks
For ArrayRow = LBound(SourceArray(ArrayNumber)) To UBound(SourceArray(ArrayNumber))
DestinationArrayRow = DestinationArrayRow + 1
For ArrayColumnNumber = 1 To DataBlockSize
DestinationArray(DestinationArrayRow, ArrayColumnNumber) = _
SourceArray(ArrayNumber)(ArrayRow, ArrayColumnNumber)
Next
Next
Next
wsDestination.Range("A1").Resize(UBound(DestinationArray, 1), UBound(DestinationArray, 2)) = DestinationArray
Application.ScreenUpdating = False
Debug.Print "Time to complete = " & Timer - startTime & " seconds."
End Sub