Complicating a Consolidation
- Carefully adjust the values in the constants (first) section of the
code in the Sub.
- You only run the Sub.
- The Functions are being called by the Sub.
The Code
Option Explicit
Sub Dataprep2()
' Source
Const BookAddress As String = "H13"
Const SourceName As String = "MAL Corrections"
Const SourceFirstRow As Long = 2
' Target
Const DataName As String = "Macro Control"
Const TargetAddress As String = "H6"
' Source/Target
Const STByColumn As Long = 1
Dim STColumns As Variant
STColumns = Array("A:E", "G:U")
' Define Data Worksheet.
Dim wsD As Worksheet
Set wsD = ThisWorkbook.Worksheets(DataName)
' Define Source Worksheet.
Dim wbS As Workbook: Set wbS = Workbooks.Open(wsD.Range(BookAddress).Value)
Dim wsS As Worksheet: Set wsS = wbS.Worksheets(SourceName)
' Define Target Worksheet
Dim wsT As Worksheet
Set wsT = ThisWorkbook.Worksheets(wsD.Range(TargetAddress).Value)
' Write values of ranges to arrays.
Dim Source() As Variant, i As Long
ReDim Source(UBound(STColumns))
For i = 0 To UBound(Source)
Source(i) = getColumns(wsS, STColumns(i), STByColumn, SourceFirstRow)
Next i
' Calculate first empty row in target sheet.
Dim TargetFirstRow As Long
TargetFirstRow = getFirstEmptyRow(wsT, wsT.Columns(STByColumn).Column)
If TargetFirstRow = 0 Then Exit Sub
' Write values of arrays to target sheet.
Dim rng As Range
For i = 0 To UBound(Source)
Set rng = Intersect(wsT.Columns(STColumns(i)), wsT.Rows(TargetFirstRow))
rng.Resize(UBound(Source(i)), UBound(Source(i), 2)).Value = Source(i)
Next i
wbS.Close False
End Sub
Function getColumns(Sheet As Worksheet, ByVal sourceColumns As String, _
Optional ByVal ByColumn As Long = 1, _
Optional ByVal FirstRow As Long = 1) As Variant
Dim rng As Range, LastRow As Long
Set rng = Sheet.Columns(sourceColumns)
If ByColumn > rng.Columns.Count Then Exit Function
Set rng = Sheet.Columns(sourceColumns).Columns(ByColumn) _
.Find("*", , xlFormulas, , , xlPrevious)
If rng Is Nothing Then Exit Function
If rng.Row < FirstRow Then Exit Function
getColumns = Intersect(Sheet.Columns(sourceColumns), Sheet.Rows(FirstRow)) _
.Resize(rng.Row - FirstRow + 1)
End Function
Function getFirstEmptyRow(Sheet As Worksheet, ByVal SourceColumn As Variant)
Dim rng As Range
Set rng = Sheet.Columns(SourceColumn) _
.Find("*", , xlFormulas, , , xlPrevious)
If rng Is Nothing Then getFirstEmptyRow = 1: Exit Function
If rng.Row = Sheet.Rows.Count Then Exit Function
getFirstEmptyRow = rng.Row + 1
End Function