Sub test()
Application.ScreenUpdating = False
Dim sw As Workbook
Dim dw As Workbook
Dim srng As Range
swname$ = "Segmentation.xlsx"
swpath$ = ThisWorkbook.Path & "\" & swname
Set dw = ThisWorkbook
c& = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row
Workbooks.Open (swpath)
Set sw = Workbooks(swname)
Set srng = sw.Sheets(1).Range("D:R")
On Error Resume Next
Sheet1.Range("Q2:Q" & c).Formula = "=VLookup(D2,[Segmentation.xlsx]Sheet1!" & srng.Address & ", 5, False)"
On Error Resume Next
Sheet1.Range("R2:R" & c).Formula = "=VLookup(D2,[Segmentation.xlsx]Sheet1!" & srng.Address & ", 8, False)"
On Error Resume Next
Sheet1.Range("S2:S" & c).Formula = "=VLookup(D2,[Segmentation.xlsx]Sheet1!" & srng.Address & ", 9, False)"
On Error Resume Next
Sheet1.Range("T2:T" & c).Formula = "=VLookup(D2,[Segmentation.xlsx]Sheet1!" & srng.Address & ", 10, False)"
On Error Resume Next
Sheet1.Range("U2:U" & c).Formula = "=VLookup(D2,[Segmentation.xlsx]Sheet1!" & srng.Address & ", 11, False)"
On Error Resume Next
Sheet1.Range("V2:V" & c).Formula = "=VLookup(D2,[Segmentation.xlsx]Sheet1!" & srng.Address & ", 13, False)"
On Error Resume Next
Sheet1.Range("W2:W" & c).Formula = "=VLookup(D2,[Segmentation.xlsx]Sheet1!" & srng.Address & ", 14, False)"
On Error Resume Next
Sheet1.Range("X2:X" & c).Formula = "=VLookup(D2,[Segmentation.xlsx]Sheet1!" & srng.Address & ", 15, False)"
Sheet1.Range("Q2:X" & c).Copy
Sheet1.Range("Q2").PasteSpecial xlValues
Application.CutCopyMode = False
sw.Close
Application.ScreenUpdating = True
End Sub
Select *
From(
SELECT t1.`Primary SKU`, t1.Category, t1.Placement, t1.Segment, t1.Form,
t1.Size, t1.`Liquid Laundry Size`, t1.Manufacturer, t1.Brand,
COUNT(*) As [Ino Seq]
FROM `C:\FilePath\Segmentation.xlsx`.`Sheet1$` As t1
INNER JOIN
`C:\FilePath\Segmentation.xlsx`.`Sheet1$` As t2
ON t2.`Primary SKU` = t1.`Primary SKU`
AND t2.INO <= t1.INO
Group by t1.`Primary SKU`, t1.Category, t1.Placement, t1.Segment, t1.Form,
t1.Size, t1.`Liquid Laundry Size`, t1.Manufacturer, t1.Brand
Order by 2, 10
) as t
Where [Ino Seq] = 1
Sub TestVBA()
OptimizeVBA True
Dim startTime As Single, endTime As Single
startTime = Timer
Dim sWb As Workbook
Dim fWs As Worksheet, sWs As Worksheet
Dim slRow As Long, flRow As Long
Dim pSKU As Range, luVal As Range
Dim lupSKU As Range, outputCol As Range
Dim vlookupCol As Object
Set sWb = Workbooks.Open(ThisWorkbook.Path & "\Segmentation.xlsx")
Set sWs = sWb.Sheets("Sheet1")
Set fWs = ThisWorkbook.Sheets("Sheet1")
slRow = sWs.Cells(Rows.Count, 4).End(xlUp).Row
flRow = fWs.Cells(Rows.Count, 4).End(xlUp).Row
Set pSKU = sWs.Range("D2:D" & slRow)
Set lupSKU = fWs.Range("D2:D" & flRow)
For i = 17 To 24
Set outputCol = fWs.Range(fWs.Cells(2, i), fWs.Cells(flRow, i))
Select Case i
Case 17
Set luVal = sWs.Range("H2:H" & slRow)
Case 18
Set luVal = sWs.Range("K2:K" & slRow)
Case 19
Set luVal = sWs.Range("L2:L" & slRow)
Case 20
Set luVal = sWs.Range("M2:M" & slRow)
Case 21
Set luVal = sWs.Range("N2:N" & slRow)
Case 22
Set luVal = sWs.Range("P2:P" & slRow)
Case 23
Set luVal = sWs.Range("Q2:Q" & slRow)
Case 24
Set luVal = sWs.Range("R2:R" & slRow)
End Select
'Build Collection
Set vlookupCol = BuildLookupCollection(pSKU, luVal)
'Lookup the values
VLookupValues lupSKU, outputCol, vlookupCol
Next i
endTime = Timer
Debug.Print (endTime - startTime) & " seconds have passed [VBA]"
OptimizeVBA False
sWb.Close False
Set vlookupCol = Nothing
End Sub
Function BuildLookupCollection(categories As Range, values As Range)
Dim vlookupCol As Object, i As Long
Set vlookupCol = CreateObject("Scripting.Dictionary")
For i = 1 To categories.Rows.Count
vlookupCol.Item(CStr(categories(i))) = values(i)
Next i
Set BuildLookupCollection = vlookupCol
End Function
Sub VLookupValues(lookupCategory As Range, lookupValues As Range, vlookupCol As Object)
Dim i As Long, resArr() As Variant
ReDim resArr(lookupCategory.Rows.Count, 1)
For i = 1 To lookupCategory.Rows.Count
resArr(i - 1, 0) = vlookupCol.Item(CStr(lookupCategory(i)))
Next i
lookupValues = resArr
End Sub
Sub OptimizeVBA(isOn As Boolean)
Application.Calculation = IIf(isOn, xlCalculationManual, xlCalculationAutomatic)
Application.EnableEvents = Not (isOn)
Application.ScreenUpdating = Not (isOn)
ActiveSheet.DisplayPageBreaks = Not (isOn)
End Sub
For i = 17 To 24
Set outputCol = fWs.Range(fWs.Cells(2, i), fWs.Cells(flRow, i))
Select Case i
Case 17
Set luVal = sWs.Range("H2:H" & slRow)
Case 19
Set luVal = sWs.Range("L2:L" & slRow)
Case 20
Set luVal = sWs.Range("M2:M" & slRow)
Case 21
Set luVal = sWs.Range("N2:N" & slRow)
Case 22
Set luVal = sWs.Range("P2:P" & slRow)
Case 24
Set luVal = sWs.Range("R2:R" & slRow)
End Select
Set pSKU = sWs.Range("A2:A" & slRow)
Set lupSKU = fWs.Range("A6:A" & flRow)
For i = 17 To 24
skipIt = False
skipIt = skipIt Or (i = 18)
skipIt = skipIt Or (i = 23)
If Not skipIt Then
Set outputCol = fWs.Range(fWs.Cells(2, i),fWs.Cells(flRow, i))
Select Case i
Case 17
Set luVal = sWs.Range("H2:H" & slRow)
Case 19
Set luVal = sWs.Range("L2:L" & slRow)
Case 20
Set luVal = sWs.Range("M2:M" & slRow)
Case 21
Set luVal = sWs.Range("N2:N" & slRow)
Case 22
Set luVal = sWs.Range("P2:P" & slRow)
Case 24
Set luVal = sWs.Range("R2:R" & slRow)
End Select
End If
Sub Lookup()
OptimizeVBA True
Dim startTime As Single, endTime As Single
startTime = Timer
Dim sWb As Workbook
Dim fWs As Worksheet, sWs As Worksheet
Dim slRow As Long, flRow As Long
Dim pSKU As Range, luVal As Range
Dim lupSKU As Range, outputCol As Range
Dim vlookupCol As Object
Dim i As Integer
Set sWb = Workbooks.Open("C:\Users\america.xlsx")
Set sWs = sWb.Sheets("source data")
Set fWs = ThisWorkbook.Sheets("Destination")
slRow = sWs.Cells(Rows.Count, 1).End(xlUp).Row
flRow = fWs.Cells(Rows.Count, 1).End(xlUp).Row
Set pSKU = sWs.Range("A2:A" & slRow)
Set lupSKU = fWs.Range("A6:A" & flRow)
For i = 17 To 24
skipIt = False
skipIt = skipIt Or (i = 18)
skipIt = skipIt Or (i = 23)
If Not skipIt Then
Set outputCol = fWs.Range(fWs.Cells(6, i),fWs.Cells(flRow, i))
Select Case i
Case 17
Set luVal = sWs.Range("H2:H" & slRow)
Case 19
Set luVal = sWs.Range("L2:L" & slRow)
Case 20
Set luVal = sWs.Range("M2:M" & slRow)
Case 21
Set luVal = sWs.Range("N2:N" & slRow)
Case 22
Set luVal = sWs.Range("P2:P" & slRow)
Case 24
Set luVal = sWs.Range("R2:R" & slRow)
End Select
End If
'Build Collection
Set vlookupCol = BuildLookupCollection(pSKU, luVal)
'Lookup the values
VLookupValues lupSKU, outputCol, vlookupCol
Next i
endTime = Timer
Debug.Print (endTime - startTime) & " seconds have passed [VBA]"
OptimizeVBA False
sWb.Close False
Set vlookupCol = Nothing
End Sub
Function BuildLookupCollection(categories As Range, values As Range)
Dim vlookupCol As Object, i As Long
Set vlookupCol = CreateObject("Scripting.Dictionary")
For i = 1 To categories.Rows.Count
vlookupCol.Item(CStr(categories(i))) = values(i)
Next i
Set BuildLookupCollection = vlookupCol
End Function
Sub VLookupValues(lookupCategory As Range, lookupValues As Range, vlookupCol As Object)
Dim i As Long, resArr() As Variant
ReDim resArr(lookupCategory.Rows.Count, 1)
For i = 1 To lookupCategory.Rows.Count
resArr(i - 1, 0) = vlookupCol.Item(CStr(lookupCategory(i)))
Next i
lookupValues = resArr
End Sub
Sub OptimizeVBA(isOn As Boolean)
Application.Calculation = IIf(isOn, xlCalculationManual, xlCalculationAutomatic)
Application.EnableEvents = Not (isOn)
Application.ScreenUpdating = Not (isOn)
ActiveSheet.DisplayPageBreaks = Not (isOn)
End Sub