Getallen formatteren zodat alleen significante cijfers worden getoond

Inleiding

Bij het analyseren van meetresultaten is het gebruikelijk om deze bij rapportage weer te geven met het juiste aantal significante cijfers. Dit aantal hangt meestal af van de nauwkeurigheid van het hele meetproces (monstername, monsterpreparatie, analyse, omrekening naar gewenste eenheden).

Hoewel Excel verschillende methoden kent om getallen af te ronden (via functies of via het getalsformaat van de cel), is er geen methode om eenvoudig getallen van verschillende orde grootte af te ronden:

Getal
Weergave
1234567
1,23E+6
1,234567
1,23
0,001234567
0,00123

Natuurlijk zou gebruik gemaakt kunnen worden van wetenschappelijke notatie (zie figuur 1), maar mijn ervaring heeft geleerd dat veel mensen (inclusief managers) moeite hebben met het interpreteren van getallen als 1.23E-1, terwijl men 0,123 wel kan bevatten.
Venster Cel Eigenschappen, Getal, wetenschappelijke notatie

Figuur 1: Cel Eigenschappen, Getal, wetenschappelijke notatie

Om deze reden heb ik onderstaande functie geschreven, welke ale getallen in de selectie omzet naar het aantal opgegeven significante cijfers:

Sub RoundToDigits()
    Dim dDigits As Double
    Dim iCount As Integer
    Dim iRoundDigits As Integer
    Dim rArea As Range
    Dim rCell As Range
    Dim rRangeToRound As Range
    Dim sFormatstring As String
    Dim vAnswer As Variant
    On Error Resume Next
    Set rRangeToRound = Selection
    If rRangeToRound Is Nothing Then Exit Sub
    vAnswer = InputBox("How many digits?", "Rounding function")
    If TypeName(vAnswer) = "Boolean" Then Exit Sub
    If vAnswer = "" Then Exit Sub
    iRoundDigits = CInt(Application.Max(1, vAnswer))
    On Error GoTo 0
    For Each rArea In rRangeToRound.Cells
        For Each rCell In rArea
            If IsNumeric(rCell.Value) And rCell.Value <> "" Then
                sFormatstring = "0"
                If rCell.Value = 0 Then
                    dDigits = 3
                Else
                    dDigits = Log(Abs(rCell.Value)) / Log(10)
                    dDigits = -Int(dDigits) + iRoundDigits - 1
                    dDigits = Application.Min(Len(Abs(rCell.Value)), dDigits)
                End If
                If dDigits >= 1 Then
                    If Int(rCell.Value) = 0 Then
                        sFormatstring = sFormatstring & "." & String(dDigits - 1, "0")
                    Else
                        sFormatstring = sFormatstring & "." & String(dDigits, "0")
                    End If
                ElseIf dDigits < 0 Then
                    sFormatstring = sFormatstring & "." _
                    & String(iRoundDigits - 1, "0") & "E+00"
                End If
                rCell.NumberFormat = sFormatstring
            End If
        Next rCell
    Next rArea
End Sub


Listing 1: Code om het formaat van getallen zodanig te wijzigen zodat alleen significante cijfers worden getoond.


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].