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:

Onderdeel
Beschrijving
Object
Vereist; Variant (Object). De naam van het object waarop de functie wordt uitgevoerd.
Procnaam
Vereist; Variant (String). Een tekenreeksexpressie met de naam van een eigenschap of methode van het object.
calltype
Vereist; Constant. Een constante van het type vbCallType dat het type procedure weergeeft dat wordt opgeroepen.
args()
Optioneel: Variant (Array).

Stel dat de vulkleur van een cel moet worden opgevraagd:

Sub test()
    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:

Sub test()
    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 lProps As Long
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:

For lCount = 0 To lProps - 1
    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:

Function FindCells(ByRef oRange As Range, ByVal sProperties As String, _
        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:

Sub UseFindCellsExample()
    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.




Als u VBA code in uw commentaar plaatst, gebruik dan [VB] tags: [VB]Uw code[/VB].