# Macro runs slowly



## Cakz Primz (Dec 23, 2022)

Dear all,

I need your help and kind assistance. 

I have a workbook in .xlsb extension, 6MB size with only 1 sheet, no linking to another workbook. And I have not open another workbook.
The original data is csv, with Purchase Order number in text format, so I need to change into number format.
The number of rows is 85,000 and the columns used until AE (31 columns, starting from column A). 

It takes more than 3 minutes just to run the code below:


```
Sub Banyak()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    Dim ws As Worksheet
    Set ws = ActiveSheet
    
    Dim lRow As Long
    lRow = Cells(Rows.Count, 1).End(xlUp).Row
    With ws
    
    .Range("B2:B" & lRow).FormulaR1C1 = "=XLOOKUP(RC1,DataSource!C32,DataSource!C[31])"
    .Range("C2:C" & lRow).FormulaR1C1 = "=XLOOKUP(RC1,DataSource!C32,DataSource!C[33])"
    .Range("D2:D" & lRow).FormulaR1C1 = "=RC[-1]/RC[-2]"
    .Range("E2:E" & lRow).FormulaR1C1 = "=RC[-3]-RC[-2]"
    .Range("F2:F" & lRow).FormulaR1C1 = "=XLOOKUP(RC1,DataSource!C32,DataSource!C[1])"
    .Range("G2:G" & lRow).FormulaR1C1 = "=XLOOKUP(RC1,DataSource!C32,DataSource!C[4])"
    .Range("H2:H" & lRow).FormulaR1C1 = "=XLOOKUP(RC1,DataSource!C32,DataSource!C[15])"
    .Range("I2:I" & lRow).FormulaR1C1 = "=XLOOKUP(RC1,DataSource!C32,DataSource!C[16])"
    .Range("J2:J" & lRow).FormulaR1C1 = "=XLOOKUP(RC1,DataSource!C32,DataSource!C[6])"
    .Range("K2:K" & lRow).FormulaR1C1 = "=XLOOKUP(RC1,DataSource!C32,DataSource!C[6])"
    .Range("L2:L" & lRow).FormulaR1C1 = "=XLOOKUP(RC1,DataSource!C32,DataSource!C[19])"
    .Range("M2:M" & lRow).FormulaR1C1 = "=IF(RC[-1]<RC[-3],""Ahead"",IF(RC[-1]=RC[-3],""On schedule"",""Late""))"
    .Range("B2:M" & lRow).Value = .Range("B2:M" & lRow).Value
    End With
    
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
```

``

Is there something wrong with the code? or perhaps there is another better solution to accelerate?

Thank you
prima - Indonesia


----------



## Cakz Primz (Dec 23, 2022)

Cakz Primz said:


> Dear all,
> 
> I need your help and kind assistance.
> 
> ...


Dear all,

Sorry...below is the correct VBA code:

```
Sub Summarize()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    

    Dim ws As Worksheet
    Set ws = ActiveSheet
    
    Dim lRow As Long
    lRow = Cells(Rows.Count, 1).End(xlUp).Row
    With ws
    
    .Range("AF4:AF" & lRow).FormulaR1C1 = "=VALUE(RC[-27])"
    .Range("AG4:AG" & lRow).FormulaR1C1 = "=COUNTIF(C[-28],RC[-1])"
    .Range("AH4:AH" & lRow).FormulaR1C1 = "=COUNTIFS(C5,RC32,C22,R3C)"
    .Range("AI4:AI" & lRow).FormulaR1C1 = "=COUNTIFS(C5,RC32,C22,R3C)"
    .Range("AJ4:AJ" & lRow).FormulaR1C1 = "=COUNTIFS(C5,RC32,C22,R3C)"
    .Range("AK4:AK" & lRow).FormulaR1C1 = "=COUNTIFS(C5,RC32,C22,R3C)"
    .Range("AL4:AL" & lRow).FormulaR1C1 = "=COUNTIFS(C5,RC32,C22,R3C)"
    .Range("AM4:AM" & lRow).FormulaR1C1 = "=COUNTIFS(C5,RC32,C22,R3C)"
    .Range("AN4:AN" & lRow).FormulaR1C1 = "=COUNTIFS(C5,RC32,C22,R3C)"
    .Range("AO4:AO" & lRow).FormulaR1C1 = "=COUNTIFS(C5,RC32,C22,R3C)"
    .Range("AF4:AO" & lRow).Value = .Range("AF4:AO" & lRow).Value
    End With
    
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
End Sub
```

Thank you very much


----------



## kevin9999 (Dec 23, 2022)

Could you provide a small sample of your data using the XL2BB add in?


----------



## Cakz Primz (Dec 23, 2022)

kevin9999 said:


> Could you provide a small sample of your data using the XL2BB add in?


Purchase Order Status.xlsxABCDEFGHIJKLMNOPQRSTUVWXYZAAABACADAEAFAGAHAIAJAKALAMANAO1InfoProvider DescriptionMaterial Status Report2Last Data Update22.12.2022 05:24:353ProjectPR Requesting  NamePR CodePO NumberInspection LevelVendor NamePO DescriptionPO item descriptionExpediterPO item numberASO sub-item NrASO sub-item descriptionInspection Release Note NumberPO Contractual delivery dateExpected Delivery DateASO released dateDelay cd.1 by Exp.ASO sub-item StatusSF/Batch StatusIncotermDelivery Point CountryMain Leg Transport Mean: EXPECTED Departure DateMain Leg Transport Mean: ACTUAL Departure DateMain Leg Transport Mean: EXPECTED Arrival DateMain Leg Transport Mean: ACTUAL Arrival DateFORECAST arrival at siteACTUAL Arrival At SiteLine ItemsAccepted DocumentsArrival at Main LegArrival at the siteAvailableInitialMain means of Tr.ArrNot AssignedReversed4BP TANGGUH Onshore E ARIF R.11651700Cables for Building1315870RPT SINAR CEMERLANG SEMESTACABLES FOR BUILDING CLUSTER 2 - RFM 2170DRUM 2M28Abdul Haris Hutagaol2#Not assigned14552030.04.202030.06.202003.07.2020V10ARRIVAL TO SITE60ARRIVAL AT THE SITEDDPDelivered cleared byIndonesia#####30.06.202013158701001000005BP TANGGUH Onshore E FERDIAN11639268Stationeries and Gro1309410NPT DATASCRIPSTATIONERIES AND GROCERIES FOR JAN - MARERASER / PENGHAPUS PENSIL MERK BOXIMC2Djajadi Doni19#Not assignedNot assigned31.03.202006.02.202027.12.2021Not assignedARRIVAL TO SITE60ARRIVAL AT THE SITEDDPDelivered cleared byIndonesia#####06.02.20201309410610060010006BP TANGGUH Onshore E JOY ANDREAN11609267OZILITE AUTOMATIC LI1286918NPT. RIVERA MAKMUR ABADIOZILITE AUTOMATIC LIGHTEROZILITE 240 VOLTS WALL MOUNTEDM28Abdul Haris Hutagaol1#Not assignedNot assigned13.09.201927.09.201929.01.2020V10ARRIVAL TO SITE60ARRIVAL AT THE SITEDDPDelivered cleared byIndonesia#####27.09.201912869181001000007BP TANGGUH Onshore E K. TAKINAWA11792898Purchasing Material1412145CPT. PARADISE PERKASAPURCHASING MATERIAL FOR TP-011-0005-01NPS:3/4X1/2-THK:2.87MMX2.77MM -ECC.MC9Omega Maruli Pohan2#Not assigned16534912.09.202217.09.202221.10.2022C10ARRIVAL TO SITE60ARRIVAL AT THE SITEDDPDelivered cleared byNot assigned#####17.09.202214121452002000008BP TANGGUH Onshore E SLAMET R.11631122SEAL SPARE PARTS HIL1302069NPT. HILTI NUSANTARASEAL SPARE PARTS HILTIANCHOR ROD HAS-U 8.8 HDG M20X260MC9Omega Maruli Pohan3#Not assignedNot assigned13.12.201912.12.201917.07.2020Not assignedARRIVAL TO SITE60ARRIVAL AT THE SITEDDPDelivered cleared byIndonesia#####12.12.201913020694004000009BP TANGGUH Onshore E SLAMET R.11631122SEAL SPARE PARTS HIL1302069NPT. HILTI NUSANTARASEAL SPARE PARTS HILTIINJECTABLE MORTAR HIT-RE 500 V3/500/1MC9Omega Maruli Pohan4#Not assignedNot assigned13.12.201912.12.201917.07.2020Not assignedARRIVAL TO SITE60ARRIVAL AT THE SITEDDPDelivered cleared byIndonesia#####12.12.2019130206940040000010BP TANGGUH Onshore E SLAMET R.11631122SEAL SPARE PARTS HIL1302069NPT. HILTI NUSANTARASEAL SPARE PARTS HILTISEAL OUTSIDE PART NO : 207700MC9Omega Maruli Pohan2#Not assignedNot assigned13.12.201912.12.201917.07.2020Not assignedARRIVAL TO SITE60ARRIVAL AT THE SITEDDPDelivered cleared byIndonesia#####12.12.2019130206940040000011BP TANGGUH Onshore E SLAMET R.11631122SEAL SPARE PARTS HIL1302069NPT. HILTI NUSANTARASEAL SPARE PARTS HILTISEAL OUTSIDE PART NO : 406660MC9Omega Maruli Pohan1#Not assignedNot assigned13.12.201912.12.201917.07.2020Not assignedARRIVAL TO SITE60ARRIVAL AT THE SITEDDPDelivered cleared byIndonesia#####12.12.2019130206940040000012BP TANGGUH Onshore E.11611988PPE MATERIALS1288622NPT. BERKAT NIAGA DUNIAPPE MATERIALSSAFETY BOOTSM28Abdul Haris Hutagaol1#Not assignedNot assigned18.09.201905.02.202029.05.2020V10ARRIVAL TO SITE60ARRIVAL AT THE SITEDDPDelivered cleared byIndonesia#####05.02.2020128862250050000013BP TANGGUH Onshore E.11611988PPE MATERIALS1288622NPT. BERKAT NIAGA DUNIAPPE MATERIALSSAFETY BOOTSM28Abdul Haris Hutagaol2#Not assignedNot assigned18.09.201905.02.202029.05.2020V10ARRIVAL TO SITE60ARRIVAL AT THE SITEDDPDelivered cleared byIndonesia#####05.02.2020128862250050000014BP TANGGUH Onshore E.11611988PPE MATERIALS1288622NPT. BERKAT NIAGA DUNIAPPE MATERIALSSAFETY BOOTSM28Abdul Haris Hutagaol3#Not assignedNot assigned18.09.201905.02.202029.05.2020V10ARRIVAL TO SITE60ARRIVAL AT THE SITEDDPDelivered cleared byIndonesia#####05.02.2020128862250050000015BP TANGGUH Onshore E.11611988PPE MATERIALS1288622NPT. BERKAT NIAGA DUNIAPPE MATERIALSSAFETY BOOTSM28Abdul Haris Hutagaol4#Not assignedNot assigned18.09.201905.02.202029.05.2020V10ARRIVAL TO SITE60ARRIVAL AT THE SITEDDPDelivered cleared byIndonesia#####05.02.2020128862250050000016BP TANGGUH Onshore E.11611988PPE MATERIALS1288622NPT. BERKAT NIAGA DUNIAPPE MATERIALSSAFETY BOOTSM28Abdul Haris Hutagaol5#Not assignedNot assigned18.09.201905.02.202029.05.2020V10ARRIVAL TO SITE60ARRIVAL AT THE SITEDDPDelivered cleared byIndonesia#####05.02.2020128862250050000017BP TANGGUH Onshore E.11611988PPE MATERIALS1288639NPT.WAHANA SAFETY INDONESIAPPE MATERIALSFACE SHIELD (ATTACHED TO HELMET)M28Abdul Haris Hutagaol6#Not assignedNot assigned18.09.201904.10.201907.10.2019V10ARRIVAL TO SITE60ARRIVAL AT THE SITEDDPDelivered cleared byIndonesia#####04.10.20191288639300300000DataSourceCell FormulasRangeFormulaAF4AF4=VALUE(E4)AG4AG4=COUNTIF(E:E,AF4)AH4:AO4AH4=COUNTIFS($E:$E,$AF4,$V:$V,AH$3)


----------



## kevin9999 (Dec 23, 2022)

Thank you


----------



## Cakz Primz (Dec 23, 2022)

Dear kevin9999,

Below is the formula in XL2BB:

Purchase Order Status.xlsxAFAGAHAIAJAKALAMANAO3Line ItemsAccepted DocumentsArrival at Main LegArrival at the siteAvailableInitialMain means of Tr.ArrNot AssignedReversed41315870100100000DataSourceCell FormulasRangeFormulaAF4AF4=VALUE(E4)AG4AG4=COUNTIF(E:E,AF4)AH4:AO4AH4=COUNTIFS($E:$E,$AF4,$V:$V,AH$3)

Thank you so much for your kind attention and help.
Regards,
Prima - Indonesia


----------



## kevin9999 (Dec 24, 2022)

I'm not entirely happy with it, but the following code (based on your XL2BB sample extended down) takes around 10 seconds for 85K+ rows.  Let me know how you go with it.


```
Option Explicit
Dim LRow As Long
Dim ws As Worksheet
Sub Cakz_Primz()
    Dim t As Double: t = Timer
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlManual
    End With
    
    Set ws = Worksheets("DataSource")   '<< Check sheet name
    LRow = ws.Cells(Rows.Count, "A").End(xlUp).Row
    
    '1. Get values into column AF
    With ws
        .Range("E4:E" & LRow).Copy
        .Range("AF4").PasteSpecial xlPasteValues
        Application.CutCopyMode = False
    End With
    
    '2. Get values into column AG
    CountIfAF
    
    '3 Get values into AH:AO
    CountIfAH
    
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = xlAutomatic
    End With
    
    MsgBox "Completed " & LRow - 3 & " rows in " & Timer - t & "seconds."
End Sub

Sub CountIfAF()
    Dim R As Long, s As String, Data As Variant, Result As Variant
    Data = Range("E4:E" & LRow)
    ReDim Result(1 To UBound(Data), 1 To 1)
    
    With CreateObject("Scripting.Dictionary")
      For R = 1 To UBound(Data)
        s = CStr(Data(R, 1))
        .Item(s) = .Item(s) + 1
      Next
    For R = 1 To UBound(Data)
        Result(R, 1) = .Item(CStr(Data(R, 1)))
      Next
    End With
    Range("AG4").Resize(UBound(Result)) = Result
End Sub

Sub CountIfAH()
    Dim R As Long, s As String, Data, Result
    Dim ar1, i As Long, x As String
    Data = ws.Range("E4:V" & LRow)
    ReDim Result(1 To UBound(Data), 1 To 1)
    
    With CreateObject("Scripting.Dictionary")
        For i = 34 To 41
            x = ws.Cells(3, i)
            For R = 1 To UBound(Data)
              If UCase(Data(R, 18)) = UCase(x) Then
                s = CStr(Data(R, 1))
                .Item(s) = .Item(s) + 1
              End If
            Next
            For R = 1 To UBound(Data)
                Result(R, 1) = .Item(CStr(Data(R, 1)))
            Next
            Cells(4, i).Resize(UBound(Result)) = Result
            .RemoveAll
        Next i
    End With
End Sub
```


----------



## Alex Blakenburg (Dec 24, 2022)

I am not entirely happy with mine either but here is another version.


```
Sub Summarize_v02()

    Dim t As Double: t = Timer
    
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    Dim ws As Worksheet
    Dim LRow As Long
    Dim dictPO_SumRow As Object, dictPOKey As String
    Dim dictStatus_Col As Object, dictStatusKey As String
    Dim rngSrc As Range, rngOut As Range, cellHdg As Range
    Dim arrSrc As Variant, arrSum() As Variant, arrOut() As Variant
    Dim iSrc As Long, iSum As Long, iSumNew As Long, iHdg, SumColID As Long, j As Long
        
    Set ws = ActiveSheet
    With ws
        LRow = .Cells(Rows.Count, 1).End(xlUp).Row
        Set rngSrc = .Range("A4:AO" & LRow)                         '<-- Modify as required
        arrSrc = rngSrc.Value
        Set rngOut = .Range("AF4:AO" & LRow)                        '<-- Modify as required - repeated PO No and Count Columns
        ReDim arrSum(1 To UBound(arrSrc), 1 To rngOut.Columns.Count)
        ReDim arrOut(1 To UBound(arrSrc), 1 To rngOut.Columns.Count)
    End With
    
    ' Load Dictionary for Headings / Categories relative position
    Set dictStatus_Col = CreateObject("Scripting.dictionary")
    For Each cellHdg In rngOut.Offset(-1).Cells
        dictStatusKey = UCase(cellHdg.Value)
        If Not dictStatus_Col.exists(dictStatusKey) Then
            iHdg = iHdg + 1
            If cellHdg.Value = "" Then dictStatusKey = "PO NO"          ' Not used just a place holder
            dictStatus_Col(dictStatusKey) = iHdg
        End If
    Next cellHdg
    
    
    ' Load Dictionary Unique PO nos and total count by Category
    Set dictPO_SumRow = CreateObject("Scripting.dictionary")
    For iSrc = 1 To UBound(arrSrc)
        dictPOKey = CStr(arrSrc(iSrc, 5))
        If Not dictPO_SumRow.exists(dictPOKey) Then
            iSumNew = iSumNew + 1
            dictPO_SumRow(dictPOKey) = iSumNew
        End If
        iSum = dictPO_SumRow(dictPOKey)
        arrSum(iSum, 1) = arrSrc(iSrc, 5)
        arrSum(iSum, 2) = arrSum(iSum, 2) + 1
        
        dictStatusKey = UCase(arrSrc(iSrc, 22))
        SumColID = dictStatus_Col(dictStatusKey)
        arrSum(iSum, SumColID) = arrSum(iSum, SumColID) + 1
    Next iSrc
    
    ' Load output array based on all rows in source and outputting count values against repeating PO numbers
    For iSrc = 1 To UBound(arrSrc)
        arrOut(iSrc, 1) = arrSrc(iSrc, 5)
        dictPOKey = CStr(arrSrc(iSrc, 5))
        For j = 2 To UBound(arrSum, 2)
            arrOut(iSrc, j) = arrSum(dictPO_SumRow(dictPOKey), j)
        Next j
    Next iSrc
   
    rngOut.Resize(UBound(arrOut)) = arrOut

    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    
    MsgBox "Completed " & UBound(arrSrc) & " rows in " & Timer - t & "seconds."
End Sub
```


----------



## kvsrinivasamurthy (Dec 24, 2022)

To convert text format to number format.
Select the range
Data->> Text to columns
Delimited->>Next->>Next
Select Date ->> Finish


----------



## Cakz Primz (Dec 29, 2022)

kevin9999 said:


> I'm not entirely happy with it, but the following code (based on your XL2BB sample extended down) takes around 10 seconds for 85K+ rows.  Let me know how you go with it.
> 
> 
> ```
> ...


Dear kevin9999,

Thanks so much for your kind assistance and help. 
Let me try the code, and I will inform you, tomorrow.

Again, thanks for everything.

Regards,
Prima - Indonesia


----------



## Cakz Primz (Dec 23, 2022)

Dear all,

I need your help and kind assistance. 

I have a workbook in .xlsb extension, 6MB size with only 1 sheet, no linking to another workbook. And I have not open another workbook.
The original data is csv, with Purchase Order number in text format, so I need to change into number format.
The number of rows is 85,000 and the columns used until AE (31 columns, starting from column A). 

It takes more than 3 minutes just to run the code below:


```
Sub Banyak()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    Dim ws As Worksheet
    Set ws = ActiveSheet
    
    Dim lRow As Long
    lRow = Cells(Rows.Count, 1).End(xlUp).Row
    With ws
    
    .Range("B2:B" & lRow).FormulaR1C1 = "=XLOOKUP(RC1,DataSource!C32,DataSource!C[31])"
    .Range("C2:C" & lRow).FormulaR1C1 = "=XLOOKUP(RC1,DataSource!C32,DataSource!C[33])"
    .Range("D2:D" & lRow).FormulaR1C1 = "=RC[-1]/RC[-2]"
    .Range("E2:E" & lRow).FormulaR1C1 = "=RC[-3]-RC[-2]"
    .Range("F2:F" & lRow).FormulaR1C1 = "=XLOOKUP(RC1,DataSource!C32,DataSource!C[1])"
    .Range("G2:G" & lRow).FormulaR1C1 = "=XLOOKUP(RC1,DataSource!C32,DataSource!C[4])"
    .Range("H2:H" & lRow).FormulaR1C1 = "=XLOOKUP(RC1,DataSource!C32,DataSource!C[15])"
    .Range("I2:I" & lRow).FormulaR1C1 = "=XLOOKUP(RC1,DataSource!C32,DataSource!C[16])"
    .Range("J2:J" & lRow).FormulaR1C1 = "=XLOOKUP(RC1,DataSource!C32,DataSource!C[6])"
    .Range("K2:K" & lRow).FormulaR1C1 = "=XLOOKUP(RC1,DataSource!C32,DataSource!C[6])"
    .Range("L2:L" & lRow).FormulaR1C1 = "=XLOOKUP(RC1,DataSource!C32,DataSource!C[19])"
    .Range("M2:M" & lRow).FormulaR1C1 = "=IF(RC[-1]<RC[-3],""Ahead"",IF(RC[-1]=RC[-3],""On schedule"",""Late""))"
    .Range("B2:M" & lRow).Value = .Range("B2:M" & lRow).Value
    End With
    
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
```

``

Is there something wrong with the code? or perhaps there is another better solution to accelerate?

Thank you
prima - Indonesia


----------



## kevin9999 (Dec 29, 2022)

Cakz Primz said:


> Dear kevin9999,
> 
> Thanks so much for your kind assistance and help.
> Let me try the code, and I will inform you, tomorrow.
> ...


Thank you for letting me know 👍


----------



## Cakz Primz (Dec 29, 2022)

Dea


Alex Blakenburg said:


> I am not entirely happy with mine either but here is another version.
> 
> 
> ```
> ...


Dear Alex Blakenburg,

Thank you so much for helping me out. 
I will try the code, and I will inform you, tomorrow. 

Thanks for everything. 

Regards,
Prima - Indonesia


----------



## Cakz Primz (Dec 29, 2022)

kvsrinivasamurthy said:


> To convert text format to number format.
> Select the range
> Data->> Text to columns
> Delimited->>Next->>Next
> Select Date ->> Finish


Dear kvsrinivasamurthy,

Thank you for attention, but the problem is why the macro is taking to long to run.
I've got 2 codes from kevin9999 and Alex Blakenburg, that I need to try. 
I believe both the codes are working well. 

Regards,
Prima - Indonesia


----------



## Cakz Primz (Dec 29, 2022)

kevin9999 said:


> I'm not entirely happy with it, but the following code (based on your XL2BB sample extended down) takes around 10 seconds for 85K+ rows.  Let me know how you go with it.
> 
> 
> ```
> ...


Dear kevin9999,

Glad to inform you that your magic spell is working like a charm. It takes only less than 3 seconds to summarize it. 
You are a magician. An angel that send to help us.
I am speechless. 
Problem solved !

Thanks for everything, thank so much.
I am really appreciate it. 

Dear MrExcel,
Thank you very, very, very much. 

Best regards,
Prima - Indonesia


----------



## kevin9999 (Dec 29, 2022)

Cakz Primz said:


> Dear kevin9999,
> 
> Glad to inform you that your magic spell is working like a charm. It takes only less than 3 seconds to summarize it.
> You are a magician. An angel that send to help us.
> ...


Yes, it's interesting that the first time I tested it, it took around 10 seconds - but when I tested it several more times it ran in under 3 seconds!  Anyway, glad we were all able to help


----------



## Cakz Primz (Dec 29, 2022)

Alex Blakenburg said:


> I am not entirely happy with mine either but here is another version.
> 
> 
> ```
> ...


Dear Alex Blakenburg,

Glad to inform you that your magic spell is working like a charm. It takes only less than 6 seconds to summarize it.
You are a magician. An angel that send to help us.
Problem solved !

Both you and kevin9999 and other angels in this forum are a great man. 

Thanks for everything Sir, thank so much.
I am really appreciate it.

Dear MrExcel,
Thank you very, very, very much.


Best regards,
Prima - Indonesia


----------



## Alex Blakenburg (Dec 29, 2022)

Thank you for your kind feedback.


----------

