Valideren van waarden (getallen) voor uitvoeren van functie

Status
Niet open voor verdere reacties.

kvanmiddelkoop

Gebruiker
Lid geworden
12 aug 2015
Berichten
7
Hallo, ik heb een functie geschreven in VBA die een berekening uitvoert op basis van 6 waarden. (getallen)
Indien deze cellen nog niet gevuld zijn dient de functie niet uitgevoerd te worden of de waarde "" te zijn.
Dit is de code die nu werkt maar dit is niet de meest efficiënte manier denk ikWie heeft er een betere oplossing:

Function fn_DeltaE_ab(L1, a1, b1, L2, a2, b2) As String
'*********************************************************************************************************************************
'Deze functie berekent het kleurverschil tussen 2 sets Lab-getallen
'volgens de CIE 1976 formule zoals beschreven in ISO 13655:20090 Annex K
'*********************************************************************************************************************************

If _
Not IsNumeric(L1) Or IsEmpty(L1) Or _
Not IsNumeric(a1) Or IsEmpty(a1) Or _
Not IsNumeric(b1) Or IsEmpty(b1) Or _
Not IsNumeric(L2) Or IsEmpty(L2) Or _
Not IsNumeric(a2) Or IsEmpty(a2) Or _
Not IsNumeric(b2) Or IsEmpty(b2) Then

fn_DeltaE_ab = ""

Else: fn_DeltaE_ab = ((L1 - L2) ^ 2 + (a1 - a2) ^ 2 + (b1 - b2) ^ 2) ^ 0.5

End If


End Function
 
Zoiets wellicht?
Maar waarom geef je het berekende getal als String terug? Als je die ook als Long terug geeft kan de hele controle eruit.
Code:
Function fn_DeltaE_ab(L1 As Long, _
                      a1 As Long, _
                      b1 As Long, _
                      L2 As Long, _
                      a2 As Long, _
                      b2 As Long) As String
    '**************************************************************************
    'Deze functie berekent het kleurverschil tussen 2 sets Lab-getallen
    'volgens de CIE 1976 formule zoals beschreven in ISO 13655:20090 Annex K
    '**************************************************************************
    If L1 = 0 Or _
       a1 = 0 Or _
       b1 = 0 Or _
       L2 = 0 Or _
       a2 = 0 Or _
       b2 = 0 Then
        fn_DeltaE_ab = ""
        Exit Function
    End If
    
    fn_DeltaE_ab = ((L1 - L2) ^ 2 + (a1 - a2) ^ 2 + (b1 - b2) ^ 2) ^ 0.5

End Function
 
Laatst bewerkt:
String om een lege waarde in de betreffende cel te krijgen

Hoi Ed, Ik kreeg de functie alleen werkend als ik de berekende waarde als string declareer.
Verder is het best veel code om alleen te checken of de waarde geldige getallen bevatten met als resultaat een getal als waarde en anders een lege cel.
 
Laatst bewerkt:
Waarschijnlijk omdat je geen Long mee gaf in de definitie en dan worden ze behandeld als een Variant.
 
Kan het nog slimmer - met minder code

Ik heb het gevoel dat het nog wat omslachtig is, kan het nog slimmer - met minder code?
 
Wat ik al zei, probeer het zo eens:
Code:
Function fn_DeltaE_ab(L1 As Long, _
                      a1 As Long, _
                      b1 As Long, _
                      L2 As Long, _
                      a2 As Long, _
                      b2 As Long) As Long
    '**************************************************************************
    'Deze functie berekent het kleurverschil tussen 2 sets Lab-getallen
    'volgens de CIE 1976 formule zoals beschreven in ISO 13655:20090 Annex K
    '**************************************************************************
    fn_DeltaE_ab = ((L1 - L2) ^ 2 + (a1 - a2) ^ 2 + (b1 - b2) ^ 2) ^ 0.5

End Function
 
Nu met tekst in cellen - #WAARDE! of een verkeerde berekening als één van de cellen

Dank je voor je snelle reactie!
Nu met tekst in cellen - #WAARDE! of een verkeerde berekening als één van de cellen leeg is.
 
Daar kan ik niks van zeggen zonder het document zelf.
 
Ik zou de uitkomst van jouw functie niet as string meegeven maar as variant (of leeg...)

je wilt immers of een string "" als uitkomst of een Double (zelden dat de uitkomst van een wortel, een Long is)
 
En vwb jouw opmerking qua constanten/arrays (in jouw code/module1)

"Het lukt niet om Array's als constanten te declareren helaas. Nu staan de array's in elke functie..."

Je zou ze bijv. eenmalig in een functie kunnen zetten en steeds deze functie kunnen aanroepen
 
Hoewel ik jouw functie niet zo lang vind;

Code:
Function fn_DeltaE_ab2(L1 As Range, a1 As Range, b1 As Range, L2 As Range, a2 As Range, b2 As Range, Optional NoComplete As String = "") As Variant
    '**************************************************************************
    'Deze functie berekent het kleurverschil tussen 2 sets Lab-getallen
    'volgens de CIE 1976 formule zoals beschreven in ISO 13655:20090 Annex K
    '**************************************************************************
    fn_DeltaE_ab2 = NoComplete
    If Application.Count(L1, a1, b1, L2, a2, b2) = 6 Then fn_DeltaE_ab2 = ((L1 - L2) ^ 2 + (a1 - a2) ^ 2 + (b1 - b2) ^ 2) ^ 0.5

End Function
 
Hoi Eric,

Bedankt voor jou voorstel. dit werkt perfect!!

Hoewel ik jouw functie niet zo lang vind;

Code:
Function fn_DeltaE_ab2(L1 As Range, a1 As Range, b1 As Range, L2 As Range, a2 As Range, b2 As Range, Optional NoComplete As String = "") As Variant
    '**************************************************************************
    'Deze functie berekent het kleurverschil tussen 2 sets Lab-getallen
    'volgens de CIE 1976 formule zoals beschreven in ISO 13655:20090 Annex K
    '**************************************************************************
    fn_DeltaE_ab2 = NoComplete
    If Application.Count(L1, a1, b1, L2, a2, b2) = 6 Then fn_DeltaE_ab2 = ((L1 - L2) ^ 2 + (a1 - a2) ^ 2 + (b1 - b2) ^ 2) ^ 0.5

End Function

De oplossing "Optional NoComplete As String = """ is nieuw voor me.
Zou je nog even kunnen beschrijven hoe deze functie precies werkt?
Alvast bedankt, Gr. Kees
 
Optioneel, dus je hoeft niks in te vullen, dan geeft de functie, wanneer deze niet compleet is "" terug.

Maar je kunt nu ook in jouw sheet bijvoorbeeld de functie zo aanroepen:
Code:
=fn_DeltaE_ab2(A10;B10;C10;D10;E10;F10;"let op")

Optionele parameters dienen altijd als laatste te staan
 
Helemaal helder en zeer handig

Geweldig Eric, dank je wel voor je zeer nuttige toelichting.
Gr. Kees
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan