Option Explicit
Sub FormatData()
Dim wsInput As Worksheet, wsTemp As Worksheet, wsOutput As Worksheet
Dim rInput As Range, rTemp As Range, rOutput As Range, rUnique As Range
Dim rTempNoHeader As Range
Dim aNumbers As Variant, aDepts As Variant
Dim iNumber As Long, iDept As Long, iTemp As Long
Application.ScreenUpdating = False
'init input and output
Set wsInput = ThisWorkbook.Worksheets("Input")
Set rInput = wsInput.Cells(1, 1).CurrentRegion
Set wsOutput = ThisWorkbook.Worksheets("Output")
Set rOutput = wsOutput.Cells(1, 1).CurrentRegion
If rOutput.Rows.Count > 1 Then
rOutput.Cells(2, 1).Resize(rOutput.Rows.Count - 1, 1).EntireRow.Delete
End If
'delete any temp ws and copy input
On Error Resume Next
Application.DisplayAlerts = False
ThisWorkbook.Worksheets("Temp").Delete
Application.DisplayAlerts = True
On Error GoTo 0
Call wsInput.Copy(, wsInput)
Set wsTemp = ActiveSheet
wsTemp.Name = "Temp"
Set rTemp = wsTemp.Cells(1, 1).CurrentRegion
Set rTempNoHeader = rTemp.Cells(2, 1).Resize(rTemp.Rows.Count - 1, rTemp.Columns.Count)
'prepare temp, sort, remove dups, split field, create unique list
rTemp.RemoveDuplicates Columns:=1, Header:=xlYes
With wsTemp.Sort
.SortFields.Clear
.SortFields.Add Key:=Range("A1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange rTempNoHeader
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
rTemp.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
:=">", FieldInfo:=Array(Array(1, 2), Array(2, 2)), TrailingMinusNumbers:=True
'get unique list
Call rTemp.Columns(1).Copy(wsTemp.Columns(4))
wsTemp.Columns(4).RemoveDuplicates Columns:=1, Header:=xlYes
Set rUnique = wsTemp.Cells(1, 4).CurrentRegion
Set rUnique = rUnique.Cells(2, 1).Resize(rUnique.Rows.Count, rUnique.Columns.Count)
wsTemp.Cells(1, 1).Value = "Number"
wsTemp.Cells(1, 2).Value = "Department"
wsTemp.Cells(1, 4).Value = "Unique"
'put on output
Call rUnique.Copy(wsOutput.Cells(2, 1))
Set rOutput = wsOutput.Cells(1, 1).CurrentRegion
'in to array, transpose to have 1 dim array
With Application.WorksheetFunction
aNumbers = .Transpose(rOutput.Columns(1))
aDepts = .Transpose(.Transpose(rOutput.Rows(1)))
End With
With rTemp
For iTemp = 2 To .Rows.Count
iNumber = 0
iDept = 0
Application.StatusBar = .Cells(iTemp, 1).Value & " -- " & .Cells(iTemp, 2).Value & _
Format(iTemp / .Rows.Count, "#0.0%")
On Error Resume Next
iNumber = Application.WorksheetFunction.Match(.Cells(iTemp, 1).Value, aNumbers, 0)
iDept = Application.WorksheetFunction.Match(.Cells(iTemp, 2).Value, aDepts, 0)
On Error GoTo 0
If iNumber > 0 And iDept > 0 Then
rOutput.Cells(iNumber, iDept).Value = "X"
End If
Next iTemp
End With
'delete temp
On Error Resume Next
Application.DisplayAlerts = False
ThisWorkbook.Worksheets("Temp").Delete
Application.DisplayAlerts = True
On Error GoTo 0
Application.StatusBar = False
Application.ScreenUpdating = True
End Sub