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:
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