Option Explicit
Sub RetentionRatio()
Dim varWS As Worksheet, varWS2 As Worksheet
Dim varRange1 As Range, varRange2 As Range, _
varRange3 As Range, varRange4 As Range, _
varRange5 As Range, varRange6 As Range
Dim varNRows As Long, varNRows2 As Long, _
varNRows3 As Long, varNRows4 As Long, _
varCurrentRow As Long
Dim varNColumns As Integer
Dim varTempStr As String
Dim varReport As Boolean
Application.ScreenUpdating = False
Set varWS = Sheets("Sheet1")
For Each varWS2 In Worksheets
If varWS2.Name = "REPORT" Then varReport = True
Next varWS2
If varReport = False Then
Sheets.Add
ActiveSheet.Name = "REPORT"
ActiveSheet.Range("A1") = "UNIQUE_MONTHS"
ActiveSheet.Range("A1").ColumnWidth = 20
ActiveSheet.Range("B1") = "ID"
ActiveSheet.Range("B1").ColumnWidth = 10
ActiveSheet.Range("C1") = "ID_MONTHLY"
ActiveSheet.Range("C1").ColumnWidth = 15
ActiveSheet.Range("D1") = "ID_MONTHLY_PERCENTAGE"
ActiveSheet.Range("D1").ColumnWidth = 30
End If
varWS.Activate
varCurrentRow = 2
varNRows = varWS.UsedRange.Rows.Count
varNColumns = varWS.UsedRange.Columns.Count
Set varRange2 = varWS.Range("B2:B" & varNRows)
For Each varRange1 In varRange2
varWS.Cells(varRange1.Row, varNColumns + 1).Formula = _
"=month(" & varRange1.Address & ")" & " & " & """" & " \ " _
& """" & " & " & "year(" & varRange1.Address & ")"
varTempStr = CStr(varWS.Cells(varRange1.Row, varNColumns + 1))
varWS.Cells(varRange1.Row, varNColumns + 1).Formula = ""
varWS.Cells(varRange1.Row, varNColumns + 1) = varTempStr
Next
varWS.Cells(1, varNColumns + 1) = "MONTHS"
varWS.Range(Cells(1, varNColumns + 1), Cells(varNRows, varNColumns + 1)). _
AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=Cells(1, varNColumns + 2), Unique:=True
varWS.Cells(1, varNColumns + 2) = "UNIQUE_MONTHS"
varWS.Cells(1, varNColumns + 2).ColumnWidth = 20
Sheets("REPORT").UsedRange.ClearContents
Sheets("REPORT").Range("A1") = "UNIQUE_MONTHS"
Sheets("REPORT").Range("B1") = "ID"
Sheets("REPORT").Range("C1") = "ID_MONTHLY"
Sheets("REPORT").Range("D1") = "ID_MONTHLY_PERCENTAGE"
varNRows2 = varWS.Cells(Rows.Count, varNColumns + 2).End(xlUp).Row
Set varRange2 = varWS.Range(Cells(2, varNColumns + 2), Cells(varNRows2, varNColumns + 2))
For Each varRange1 In varRange2
varWS.Columns(varNColumns + 3).Delete
varWS.Columns(varNColumns + 3).Delete
varWS.Cells(1, varNColumns + 2).AutoFilter varNColumns + 1, varRange1
varWS.Range(Cells(1, varNColumns - 1), Cells(varNRows, varNColumns - 1)). _
SpecialCells(xlCellTypeVisible).Copy
varWS.Cells(1, varNColumns + 3).PasteSpecial Paste:=xlValues
Cells(1, varNColumns + 3) = "ID_MONTHLY"
varWS.Cells(1, varNColumns + 3).ColumnWidth = 20
varWS.Range(Cells(1, varNColumns + 3), Cells(varNRows, varNColumns + 3)). _
AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=Cells(1, varNColumns + 4), Unique:=True
Cells(1, varNColumns + 4) = "ID_MONTHLY_UNIQUE"
varWS.Cells(1, varNColumns + 4).ColumnWidth = 20
varNRows3 = varWS.Cells(Rows.Count, varNColumns + 4).End(xlUp).Row
varNRows4 = varWS.Cells(Rows.Count, varNColumns + 3).End(xlUp).Row
Set varRange4 = varWS.Range(Cells(2, varNColumns + 4), Cells(varNRows3, varNColumns + 4))
Set varRange5 = varWS.Range(Cells(2, varNColumns + 3), Cells(varNRows4, varNColumns + 3))
Set varRange6 = varWS.Range(Cells(2, varNColumns + 1), Cells(varNRows, varNColumns + 1))
For Each varRange3 In varRange4
Sheets("REPORT").Range("A" & varCurrentRow) = varRange1
Sheets("REPORT").Range("B" & varCurrentRow) = varRange3
Sheets("REPORT").Range("C" & varCurrentRow) = _
WorksheetFunction.CountIf(varRange5, varRange3)
Sheets("REPORT").Range("D" & varCurrentRow) = _
WorksheetFunction.CountIf(varRange5, varRange3) / _
WorksheetFunction.CountIf(varRange6, varRange1)
Sheets("REPORT").Range("D" & varCurrentRow).NumberFormat = "0.00%"
varCurrentRow = varCurrentRow + 1
Next
Next
varWS.Range(Cells(1, varNColumns + 1), Cells(varNRows, varNColumns + 4)).ClearContents
varWS.Range("A1").Activate
Sheets("REPORT").Activate
Sheets("REPORT").UsedRange.AutoFilter
Application.ScreenUpdating = True
End Sub