Ik heb een werkblad ‘Vergelijken’ met 250.000 regels en 4 kolommen (A t/m D). Binnen dat blad worden via VBA formules toegevoegd in de kolommen E t/m I. Die formules maken voornamelijk gebruik van de MATCH-functie waarbij gezocht moet worden in een aantal andere bereiken (more_id, more_sleutel1 en more_sleutel2) in andere werkbladen.
- Bereik ‘more_id’ bevat 40.000 regels (1 kolom)
- Bereik ‘more_sleutel1’ bevat 450.000 regels (1 kolom)
- Bereik ‘more_sleutel2’ bevat 450.000 regels (1 kolom)
Zie hieronder de code om de formules te genereren.
Bij een veel kleinere populatie van de bereiken werkt de code op zich goed en duurt het niet te lang, maar bij bovengenoemde bereiken duurt het een eeuwigheid….
Hoe kan de code sneller uitgevoerd worden? Ik heb de Calculation aan begin al uitgezet maar dat helpt niet. Kan het misschien met CreateObject(“scripting.dictionary”)? Ik zie die optie af en toe voorbij komen maar weet niet of dat de oplossing is en hoe dat werkt en of dat ingepast kan worden in mijn code.
- Bereik ‘more_id’ bevat 40.000 regels (1 kolom)
- Bereik ‘more_sleutel1’ bevat 450.000 regels (1 kolom)
- Bereik ‘more_sleutel2’ bevat 450.000 regels (1 kolom)
Zie hieronder de code om de formules te genereren.
Bij een veel kleinere populatie van de bereiken werkt de code op zich goed en duurt het niet te lang, maar bij bovengenoemde bereiken duurt het een eeuwigheid….
Hoe kan de code sneller uitgevoerd worden? Ik heb de Calculation aan begin al uitgezet maar dat helpt niet. Kan het misschien met CreateObject(“scripting.dictionary”)? Ik zie die optie af en toe voorbij komen maar weet niet of dat de oplossing is en hoe dat werkt en of dat ingepast kan worden in mijn code.
Code:
Sub VergelijkingMaken()
Dim sht As Worksheet
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
.DisplayAlerts = False
End With
Set sht = ThisWorkbook.Sheets("Vergelijken")
With sht
LR = .Cells(.Rows.Count, "A").End(xlUp).Row
.Range("E2:E" & LR).FormulaR1C1 = _
"=IF(ISERROR(MATCH(RC1,more_id,0)),""Nee"",""Ja"")"
.Range("F2:F" & LR).FormulaR1C1 = _
"=RC1&RC2"
.Range("G2:G" & LR).FormulaR1C1 = _
"=IF(ISERROR(MATCH(RC[-1],more_sleutel1,0)),""Nee"",""Ja"")"
.Range("H2:H" & LR).FormulaR1C1 = _
"=IF(ISERROR(MATCH(RC[-2],more_sleutel2,0)),""Nee"",""Ja"")"
.Range("I2:I" & LR).FormulaR1C1 = _
"=IF(ISERROR(MATCH(""Ja"",RC[-2]:RC[-1],0)),""Nee"",""Ja"")"
'Formules omzetten naar waarden
.Range("E2:I" & Rij).Value = .Range("E2:I" & Rij).Value
End With
With Application
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
.DisplayAlerts = True
End With
End Sub