Code:
Sub Consolidator()
Dim rngPosition As Range, rngAccounts As Range, rngHistory As Range
Dim rngA As Range, rngP As Range, rngH As Range
Dim strPeriodCriteria As String
Dim objDic As Object: Set objDic = CreateObject("Scripting.Dictionary") ' New Dictionary
With Worksheets("Sheet5")
Set rngPosition = ThisWorkbook.Sheets("All Positions, All Accounts Mar").Range("PositionsTable")
Set rngAccounts = .Range("SampAccounts")
Set rngHistory = ThisWorkbook.Sheets("ALL HISTORY, ALL ACCOUNTS").Range("History")
strPeriodCriteria = .Range("A6").Value & .Range("A7").Value
For Each rngA In rngAccounts.Columns(1).Cells
For Each rngP In rngPosition.Columns(5).Cells
If rngP.Value = rngA.Value Then
If rngP.Offset(, 13).Value & rngP.Offset(, 15).Value = strPeriodCriteria Then
objDic.Item(rngP.Value & "|" & rngP.Offset(, 3).Value) = 0
End If
End If
Next rngP
For Each rngH In rngHistory.Columns(6).Cells
If rngH.Value = rngA.Value Then
If Replace(Mid(rngH.Offset(, 17), 2), " ", "") = strPeriodCriteria Then
objDic.Item(rngH.Value & "|" & rngH.Offset(, 1).Value) = 0
ElseIf rngH.Offset(, 15).Value & rngH.Offset(, 16).Value & Replace(Mid(rngH.Offset(, 17), 2), " ", "") = strPeriodCriteria Then
objDic.Item(rngH.Value & "|" & rngH.Offset(, 1).Value) = 0
End If
End If
Next rngH
Next rngA
.Range("Orig").Offset(1).ClearContents
.ListObjects("Orig").Resize .Range("$C$1:$F$2")
.Range("Orig").Range("C1").Resize(objDic.Count).Value = Application.Transpose(objDic.Keys)
Application.DisplayAlerts = 0
.Range("Orig").Columns(1).Cells.TextToColumns _
Destination:=.Range("C2"), _
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, _
Tab:=True, _
Semicolon:=False, _
Comma:=False, Space:=False, _
Other:=True, OtherChar:="|", _
FieldInfo:=Array(Array(1, 1), Array(2, 1)), _
TrailingMinusNumbers:=True
Application.DisplayAlerts = 1
End With
ActiveWorkbook.Worksheets("Sheet5").ListObjects("Orig").Sort.SortFields. _
Clear
ActiveWorkbook.Worksheets("Sheet5").ListObjects("Orig").Sort.SortFields. _
Add Key:=Range("Orig[Account]"), SortOn:=xlSortOnValues, Order:= _
xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Sheet5").ListObjects("Orig").Sort.SortFields. _
Add Key:=Range("Orig[Stock]"), SortOn:=xlSortOnValues, Order:= _
xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet5").ListObjects("Orig").Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
Thanks for your assistance
Bookmarks