Wat is het verschil tussen .Text, .Value en .Value2

Wat is het verschil tussen .Text, .Value en .Value2

15 november 2023 0 Door Björn Meijer

Er zijn drie manieren om met VBA in Excel om met het object Range de waarde uit een cel uit te lezen. Dit kan met de eigenschappen .Value, .Value2 en .Text. Toch zijn er enkele verschillen tussen deze eigenschappen met elk hun voor- en nadelen.

Range.Value

De eigenschap .Value is de standaard eigenschap van de functie Range. Dus als je geen eigenschap achter de functie plaatst, wordt standaard de eigenschap .Value toegepast.
Kortom: Range("A1").Value = Range("B1").Value is hetzelfde als Range("A1") = Range("B1").

Met behulp van Range.Value kun je over het algemeen de oorspronkelijke waarde ophalen uit een cel. Wanneer een cel is opgemaakt als Valuta vindt er een afronding plaats. Dit komt doordat het datatype Valuta een bereik heeft van -922.337.203.685.477,5808 tot 922.337.203.685.477,5807. Zoals je ziet heeft dit datatype een nauwkeurigheid van 4 cijfers achter de komma.

Stel: We hebben in cel A1 de waarde 1,23456789 met als Getalnotatie “Valuta”. Indien we met Range.Value de oorspronkelijke waarde uit de betreffende cel ophalen, wordt deze geconverteerd naar een Valuta waarde. De oorspronkelijke waarde van 1,23456789 wordt afgerond naar 1,2346. Wanneer we hiermee werken kunnen er afrondingsfouten ontstaan.

Sub Value()
Dim varCurrency As Currency

    varCurrency = Range("A1").Value
    Debug.Print "A1: " & Range("A1").Value
    Debug.Print "Double precesion: " & CDbl(Range("A1").Value)
    varCurrency = CCur(varCurrency)
    Debug.Print "Currency: " & varCurrency
    Range("B1").Value = varCurrency
    Debug.Print "B1: " & Range("B1").Value
End Sub

Bovenstaande code geeft onderstaand resultaat:

A1: 123,4568
Double precesion: 123,4568
Currency: 123,4568
B1: 123,46

Zoals je kunt zien, wordt de oorspronkelijke waarde afgerond bij het gebruik van Range.Value.

Range.Text

In tegenstelling tot Range.Value, geeft Range.Text de exacte tekstwaarde van een cel terug, ongeacht de celopmaak. Dit betekent dat als je Range.Text gebruikt om de waarde uit cel A1 op te halen, je de oorspronkelijke ongewijzigde waarde van “1,23456789” krijgt, zonder afronding.

Sub Text()
    Dim cellText As String

    cellText = Range("A1").Text
    Debug.Print "A1 Text: " & cellText
End Sub

Bovenstaande VBA-code geeft het volgende resultaat:

A1 Text: 1,23456789

Het gebruik van Range.Text is handig als je de exacte tekstwaarde van een cel nodig hebt, zonder enige opmaak- of conversiebewerkingen.

Range.Value2

Range.Value2 is vergelijkbaar met Range.Value, maar het heeft een belangrijk verschil. Range.Value2 houdt zich niet bezig met de opmaak van een cel en levert altijd de ruwe numerieke waarde van een cel, zonder afronding. Het is sneller dan Range.Value en wordt aanbevolen als je precisie belangrijk is en je geen opmaakwisselingen wilt zien.

Sub Value2()
    Dim value2 As Variant

    value2 = Range("A1").Value2
    Debug.Print "A1 Value2: " & value2
End Sub

Bovenstaande VBA-code geeft het volgende resultaat:

A1 Value2: 1,23456789

Range.Value2 is een goede keuze wanneer je gegevens manipuleert en precisie essentieel is.

Conclusie

Het kiezen tussen .Value, .Value2 en .Text in VBA voor Excel hangt af van je specifieke behoeften. Als je de ruwe numerieke waarde wilt, zonder opmaak of afronding, is Range.Value2 de beste optie. Als je de exacte tekstwaarde nodig hebt, zonder opmaak, gebruik dan Range.Text. Maar wees voorzichtig met Range.Value, omdat het celopmaak en afronding kan bevatten.

Het begrijpen van deze eigenschappen en wanneer ze moeten worden toegepast, zal je helpen om effectiever met Excel-gegevens om te gaan in je VBA-projecten. Kies de eigenschap die het beste past bij je specifieke situatie en vereisten.