Cellen zoeken op basis van een eigenschap met de CallByName functie
Inleiding
In dit artikel wordt een functie beschreven waaraan een Range object, een string met de gewenste eigenschap en de waarde van die eigenschap wordt doorgegeven, welke vervolgens als resultaat een object geeft waarin alle cellen zitten die aan de criteria voldoen.
CallByName
Om de CallByName methode (geintroduceerd met Office 2000) eens uit te proberen is deze in deze functie toegepast.
Volgens het Help bestand van Office XP VBA:
CallByName Functie
Voert een methode van een object uit, stelt een eigenschap van een object in of geeft die eigenschap als resultaat.
Syntaxis
CallByName(object, procnaam, calltype,[args()])
De syntaxis van de functie CallByName kent de volgende benoemde argumenten:
Stel dat de vulkleur van een cel moet worden opgevraagd:
MsgBox CallByName(ActiveCell.Interior, "Colorindex", VbGet)
End Sub
Om deze methode algemener te krijgen, zou het het eenvoudigst zijn, om slechts het Cel object te gebruiken en de gehele "procnaam" als een string:
MsgBox CallByName(ActiveCell, "Interior.Colorindex", VbGet)
End Sub
Helaas werkt dit niet. Het argument "procnaam" mag slechts 1 entiteit bevatten (Property, Method of Object). Het is dus nodig om deze string op te splitsen in haar individuele elementen.
Zoiets als dit (opm.: Excel 97 kent de functie niet, noch de CallByName function):
Dim vProps As Variant
vProps = Split(sProperties, ".")
lProps = UBound(vProps)
Dus om de colorindex eigenschap van het Interior object van het Cel object te verkrijgen, moet er door de variant vProps gestapt worden:
Set oTemp = CallByName(oTemp, vProps(lCount), VbGet)
Next
De lus wordt gestopt bij het één-na-laatste element van vProps, omdat alle elementen behalve het laatste objecten zullen zijn en het laatste de eigenschap die gezocht wordt. In de volgende stap wordt deze eigenschap gelezen:
CallByName(oTemp, vProps(lProps), VbGet)
De volledige functie is hieronder weergegeven:
ByVal vValue As Variant) As Range
Dim oResultRange As Range
Dim oArea As Range
Dim oCell As Range
Dim bDoneOne As Boolean
Dim oTemp As Object
Dim lCount As Long
Dim lProps As Long
Dim vProps As Variant
vProps = Split(sProperties, ".")
lProps = UBound(vProps)
For Each oArea In oRange.Areas
For Each oCell In oArea.Cells
Set oTemp = oCell
For lCount = 0 To lProps - 1
Set oTemp = CallByName(oTemp, vProps(lCount), VbGet)
Next
If CallByName(oTemp, vProps(lProps), VbGet) = vValue Then
If bDoneOne Then
Set oResultRange = Union(oResultRange, oCell)
Else
Set oResultRange = oCell
bDoneOne = True
End If
End If
Next
Next
If Not oResultRange Is Nothing Then
Set FindCells = oResultRange
End If
End Function
Een klein voorbeeld hoe deze functie te gebruiken, selecteer alle cellen met een witte vulkleur:
FindCells(ActiveSheet.UsedRange, "Interior.ColorIndex", 0).Select
End Sub
Vragen, suggesties en opmerkingen
Heeft u vragen, suggesties of opmerkingen? Gebruik dan dit formulier.
Mocht uw vraag niet direct relevant zijn voor deze pagina, maar een algemene Excel vraag betreffen, dan adviseer ik om deze hier te stellen: excelexperts.nl/forum/index.php.