Beste helpers,
In een macro die duizenden rijen moet afwerken, moeten we eerst controleren of waarden uit één kolom van een werkblad voorkomen in een kolom van een ander werkblad. In plaats van telkens terug te gaan naar het werkblad met de kolom waarmee we willen vergelijken, vullen we een array met alle voorkomende unieke waarden uit de kolom van het werkblad waarmee we willen vergelijken. Hierdoor kunnen we de snelheid van de macro deftig verhogen. Enkel indien een waarde voorkomt in de array gaan we verder met de macro
Het aantal unieke waarden waarmee we vergelijken, kan variëren van 1 tot 9. Het aantal posities in de array is dus variabel.
Alles gaat goed behalve indien er slechts één unieke waarde is om de array te vullen dan krijgen we een fout 9 tijdens het uitvoeren "het subscript valt buiten het bereik".
We hebben dit nu opgelost door de code te aan te passen en een voorwaarde in te bouwen indien er maar 1 waarde in de array voorkomt.
Dit werkt wel maar we vragen ons af of er geen elegantere (kortere en rechtlijnige) oplossing is om tot hetzelfde resultaat te komen.
Hieronder het stukje code om de array te vullen en aansluitend het aantal waarden in de array te tellen (die telling is onder meer nodig om nadien de beschreven fout te kunnen omzeilen).
En hieronder de code om waarden uit een kolom van een ander werkblad te vergelijken met de waarden in de array.
Het eerste stukje is erbij gekomen om de fout te omzeilen wanneer de array slechts 1 waarde bevat. Daarvoor zoeken we dus een elegantere oplossing.
Dank bij voorbaat voor eventuele suggesties.
Paul
In een macro die duizenden rijen moet afwerken, moeten we eerst controleren of waarden uit één kolom van een werkblad voorkomen in een kolom van een ander werkblad. In plaats van telkens terug te gaan naar het werkblad met de kolom waarmee we willen vergelijken, vullen we een array met alle voorkomende unieke waarden uit de kolom van het werkblad waarmee we willen vergelijken. Hierdoor kunnen we de snelheid van de macro deftig verhogen. Enkel indien een waarde voorkomt in de array gaan we verder met de macro
Het aantal unieke waarden waarmee we vergelijken, kan variëren van 1 tot 9. Het aantal posities in de array is dus variabel.
Alles gaat goed behalve indien er slechts één unieke waarde is om de array te vullen dan krijgen we een fout 9 tijdens het uitvoeren "het subscript valt buiten het bereik".
We hebben dit nu opgelost door de code te aan te passen en een voorwaarde in te bouwen indien er maar 1 waarde in de array voorkomt.
Dit werkt wel maar we vragen ons af of er geen elegantere (kortere en rechtlijnige) oplossing is om tot hetzelfde resultaat te komen.
Hieronder het stukje code om de array te vullen en aansluitend het aantal waarden in de array te tellen (die telling is onder meer nodig om nadien de beschreven fout te kunnen omzeilen).
Code:
Dim shName1 As String
Dim shName2 As String
Dim shName3 As String
Dim LastRow As Long
Dim LastCol As Long
shName1 = "alfa"
shName2 = "beta"
shName3 = "gamma"
LastRow = ActiveSheet.UsedRange.rows(ActiveSheet.UsedRange.rows.Count).Row
rng = Range("'" & shName2 & "'!V2:V" & LastRow)
With CreateObject("System.Collections.ArrayList")
For Each it In rng
If it <> "" And Not .contains(it) Then .Add it
Next
.Sort
MyArray = Application.Transpose(.toarray())
vAantal = .Count
End With
En hieronder de code om waarden uit een kolom van een ander werkblad te vergelijken met de waarden in de array.
Het eerste stukje is erbij gekomen om de fout te omzeilen wanneer de array slechts 1 waarde bevat. Daarvoor zoeken we dus een elegantere oplossing.
Code:
LastCol = Cells(1, Columns.Count).End(xlToLeft).Column + 2
If vAantal = 1 Then
color = RGB(255, 192, 0) 'oranje (49407)
If MyArray(1) = "FVA" Then
GoTo FVA
ElseIf MyArray(1) = "OZI" Then
GoTo OZI
Else: GoTo OTHER
End If
End If
For i = 1 To UBound(MyArray)
LastCol = Cells(1, Columns.Count).End(xlToLeft).Column + 2
If MyArray(i, 1) = "FLA" Then
color = RGB(255, 255, 0) 'geel (65535)
ElseIf MyArray(i, 1) = "FCH" Then
color = RGB(255, 0, 0) 'rood
ElseIf MyArray(i, 1) = "FME" Then
color = RGB(146, 208, 80) 'groen (5296274)
ElseIf MyArray(i, 1) = "FPA" Then
color = RGB(0, 176, 80) 'donkergroen
ElseIf MyArray(i, 1) = "FTI" Then
color = RGB(0, 176, 240) 'hemelsblauw (15773696)
ElseIf MyArray(i, 1) = "FGR" Then
color = RGB(0, 112, 192) 'blauw
ElseIf MyArray(i, 1) = "FVA" Then
color = RGB(255, 192, 0) 'oranje (49407)
ElseIf MyArray(i, 1) = "OZI" Then
color = 5287936
End If
If MyArray(i, 1) = "FVA" Then
GoTo FVA
ElseIf MyArray(i, 1) = "OZI" Then
GoTo OZI
Else: GoTo OTHER
End If
Dank bij voorbaat voor eventuele suggesties.
Paul
Laatst bewerkt: