• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Validatie met eigen functie

Status
Niet open voor verdere reacties.

erik1235

Gebruiker
Lid geworden
13 nov 2008
Berichten
29
Ik wil de gegevensinvoer in kolom A valideren met een functie die ik zelf geschreven heb in VBA.

Het lukt met niet dmv DATA>VALIDEREN>AANGEPAST en formule wat doe ik verkeerd?

In bijlage een voobeeld met de functie in VBA (ValidatieNN).

Kan jij me helpen?

Erik
 

Bijlagen

Los van het feit hoe en of je die functie kan aanroepen bij Data validatie, waarom worden er geen parameters doorgegeven aan de functie ValidShortDate? En wat zou validatieRR moeten voorstellen?
 
Ik wil de gegevensinvoer in kolom A valideren met een functie die ik zelf geschreven heb in VBA.

Het lukt met niet dmv DATA>VALIDEREN>AANGEPAST en formule wat doe ik verkeerd?

In bijlage een voobeeld met de functie in VBA (ValidatieNN).

Kan jij me helpen?

Erik

Snap ook niet goed wat ValidShortDate moet controleren.
Maar datums valideren zou toch ook in Excel zonder VBA moeten gaan?

Maar nu even over dat rijksregisternummer: in VBA werkt de Mod operator NIET met getallen hoger dan een lange integer. Voor bankrekeningen die bvb met 8 beginnen kun je dat niet gebruiken en moet je iets anders uitvinden. Weet niet of dit bij rijksregisternummers ook een probleem kan zijn.
De functie Rest in Excel geeft dan weer geen probleem.
 
Los van het feit hoe en of je die functie kan aanroepen bij Data validatie, waarom worden er geen parameters doorgegeven aan de functie ValidShortDate? En wat zou validatieRR moeten voorstellen?
De functie ValidShortDate moet inderdaad een parameter meekrijgen: ValidShortDate(een_cel_uit_kolom_A).
ValidRR(geg) valideert een rijksregisternummer. De functie ValidRR(geg) wordt opgeroepen door ValidatieNN(geg) indien de parameter kwa lengte en numeriek voldoet aan de kenmerken van een rijksregisternummer. Rijksregisternummers hebben een lengte van 11 posities. Het getal gevormd door de eerste 9 posities, gedeeld door 97 geeft een rest. Deze rest moet gelijk zijn aan de twee meest rechtse cijfers van het rijksregisternummer.
De functie ValidatieNN(geg) heeft als voornaamste functie uitzoeken of de input in kolom A een rijksregisternummer is of een geboortedatum. De afweging gebeurt op basis van de lengte van de te valideren data ingave.
Zowel ValidRR(geg), ValidatieNN(geg) en ValidShortDate(geg) hebben als uitkomst WAAR of ONWAAR.
Mijn belangrijkste vraag: Kan zo'n eigen functie (ValidatieNN(geg)) opgeroepen worden in Data>Validateren? Ik zou schrijven =ValidatieNN(geg)=Waar maar de validatie gebeurt dan niet correct. Mogelijk is dit te wijten aan de uitleg in de tweede reactie op dit bericht.
Ik voeg de aangepaste workbook toe.

Bedankt voor je snelle reactie!
Erik
 

Bijlagen

Laatst bewerkt:
Snap ook niet goed wat ValidShortDate moet controleren.
Maar datums valideren zou toch ook in Excel zonder VBA moeten gaan?

Maar nu even over dat rijksregisternummer: in VBA werkt de Mod operator NIET met getallen hoger dan een lange integer. Voor bankrekeningen die bvb met 8 beginnen kun je dat niet gebruiken en moet je iets anders uitvinden. Weet niet of dit bij rijksregisternummers ook een probleem kan zijn.
De functie Rest in Excel geeft dan weer geen probleem.

ValidShortDate(geg) controleert of geg een correcte datum bevat in de vorm JJMMDD.

Rijksregisternummers bestaan uit 11 cijfers. De eerste 9 cijfers bepalen de laatste twee cijfers door te delen door 97 en de rest te bepalen. Ik zal hier inderdaad naar een alternatief moeten zoeken.
 
Met Integers kom je niet toe. Maar vermits je sowieso een probleem krijgt bij getallen langer dan een Long moet je een andere redenering volgen:

1. Maak de deling van de 10 eerste cijfers door 97
2. Kap het resultaat af. Let op: doe dit met Int functie en zeker niet met CInt (deze laatste rondt af op volgende even getal als je bvb 6.5 hebt)
3. Als dan
(de 10 eerste cijfers) - (97 * het afgekapt resultaat)
gelijk is aan
de 2 laatste cijfers
dan heb je een correct rekeningnummer
 
Met Integers kom je niet toe. Maar vermits je sowieso een probleem krijgt bij getallen langer dan een Long moet je een andere redenering volgen:

1. Maak de deling van de 10 eerste cijfers door 97
2. Kap het resultaat af. Let op: doe dit met Int functie en zeker niet met CInt (deze laatste rondt af op volgende even getal als je bvb 6.5 hebt)
3. Als dan
(de 10 eerste cijfers) - (97 * het afgekapt resultaat)
gelijk is aan
de 2 laatste cijfers
dan heb je een correct rekeningnummer

Je methode werkt perfect, maar dan met de 9 eerste cijfers.

De functie doet wat hij moet. De validatie werkt echter nog niet
In de validatie van cel A5 heb ik nu staan:
AANGEPAST
ValidRR(A5)=WAAR (ik heb ook geprobeerd: ValidRR(A5)=true)
Resultaat: De foutmelding die ik heb ingesteld bij FOUTE waarde. Nochtans is het resultaat van ValidRR(A5)= true.
 
Laatst bewerkt:
Iets bescheidener:

Code:
Function ValidRR(RR As Variant) As Boolean
  ValidRR = (Left(RR, 9) Mod 97) = Val(Right(RR, 2))
End Function

overigens is jouw voorbeeld onjuist:
64120124915 is een geldig nummer
 
Laatst bewerkt:
Je methode werkt perfect, maar dan met de 9 eerste cijfers.

De functie doet wat hij moet. De validatie werkt echter nog niet
In de validatie van cel A5 heb ik nu staan:
AANGEPAST
ValidRR(A5)=WAAR (ik heb ook geprobeerd: ValidRR(A5)=true)
Resultaat: De foutmelding die ik heb ingesteld bij FOUTE waarde. Nochtans is het resultaat van ValidRR(A5)= true.

probeer eens als validatie
=ValidRR(A5)

dus = ervoor en die = waar weglaten

9 of 10 cijfers:heb het niet uitgewerkt, maar pas op voor 0 aan het begin. Misschien opmaken als tekst?
 
Iets bescheidener:

Code:
Function ValidRR(RR As Variant) As Boolean
  ValidRR = (Left(RR, 9) Mod 97) = Val(Right(RR, 2))
End Function

overigens is jouw voorbeeld onjuist:
64120124915 is een geldig nummer

Dank je!
Je hebt over de hele lijn gelijk.

Hoe gebruik ik nu de functie ValidRR in de validatie van cel A5 waar nu het nummer 64120124915 in staat?

Bij mij geeft die validatie nog steeds "Onjuist".
 
Iets bescheidener:

Code:
Function ValidRR(RR As Variant) As Boolean
  ValidRR = (Left(RR, 9) Mod 97) = Val(Right(RR, 2))
End Function

overigens is jouw voorbeeld onjuist:
64120124915 is een geldig nummer

Zoals ik al zei: Mod (en \, geheel deel van een deling) in VBA werkt niet bij getallen groter dan een Long, geeft Overfow! (fout 6) Staat nergens gedocumenteerd, maar probeer maar eens 3000000000 mod 97
 
Zoals ik al zei: Mod (en \, geheel deel van een deling) in VBA werkt niet bij getallen groter dan een Long, geeft Overfow! (fout 6) Staat nergens gedocumenteerd, maar probeer maar eens 3000000000 mod 97

Jouw getal heeft 10 posities. Ik werk maar met een long van 9 posities. Maakt dat iets uit?
 
Jouw getal heeft 10 posities. Ik werk maar met een long van 9 posities. Maakt dat iets uit?

Ik heb een test gedaan met beide voorstellen:
- voorstel SNB (met MOD 97) is vervat in functie ValidRR(RR)
- voorstel RENEEMETRIE (zonder MOD 97) is vervat in functie ValidRR2(RR)

Opdat andere lezers nog kunnen volgen stuur ik de Excell nogmaals mee met enkel de twee voorgestelde functies. Beide functies doen hetzelfde, maar op een andere wijze.

De test:
- als ik jullie functies gebruik in Excell (cellen B4 en C4) werken ze perfect
- als ik jullie functies gebruik dmv validatie (in respectievelijk cellen A5 en A6) dan is het alsof de input fout is (de formules werken, maar geven dus Onwaar als resultaat)

Opmerkingen:
1) Als ik in de validatie =ValidRR(A5) schrijf, dan krijg foutboodschap "Er is geen bereik gevonden met de naam die u hebt opgegeven"
2) De check van het nummer is eigenlijk 97 - nummer MOD 97. Ik heb beide voorstellen in de zelfde zin aangepast.
 

Bijlagen

Ik gebruik deze funkties:
Code:
Function ValidRR9(RR As Variant) As Boolean
  ValidRR9 = Left(RR, 9) Mod 97 = Val(Right(RR, 2))
End Function

Code:
Function ValidRR10(RR As Variant) As Boolean
  ValidRR10 = Left(RR, 10) - (97 * Int(Left(RR, 10) / 97)) = Val(Right(RR, 2))
End Function

Om te valideren gebruik ik een trucje met een hulpcel
In C6 zet ik
=validRR10(A6)
In A6 zet ik als validatie
aangepast
=C6=WAAR

Waarom het niet rechtstreeks kan is me niet duidelijk.
 
Laatst bewerkt:
Er is geen bereik gevonden met de naam die u hebt opgegeven"

Ik denk dat de functies van VBA niet herkend worden.
Ik had het geprobeerd met een eigen simpele VBA functie "Istekst" en op het eerste werkte het, maar dit is ook een ingebouwde functie van Excel, had ik niet aan gedacht...

Nu heb ik het volgende gedaan (voor Belgisch rek nr):

In VBA:

Code:
Public Function RekeningNummerOK(str_rekeningnummer As String) As Boolean
Dim dbl_Links10 As Double, byt_rechts2 As Byte, byt_Modulus As Byte


'Rekeningnummer is correct alsde rest na deling van de 10 eerste cijfers gedeeld door 97 gelijk is aan de twee laatste cijfers.
'Normaal kan je hiervoor weken met mod, maar dit geeft fout bij getallen langer dan long
'Vandaar andere redenering :
'13 - 4*3 = 1
'deeltal - deler * afgekapte deling = rest na deling
'10 eerste cijfers - 97* afgekapte deling = 2 laatste cijfers
'Rekeningnr als string gedefinieerd wegens eventuele leading zero's
    dbl_Links10 = Left(str_rekeningnummer, 10)
    byt_rechts2 = Right(str_rekeningnummer, 2)
    byt_Modulus = dbl_Links10 - Int(dbl_Links10 / 97) * 97
    RekeningNummerOK = (byt_Modulus = byt_rechts2)
End Function

In excel sheet:

Rekeningnummer opgemaakt als tekst
in de kolom naast het rek nr zet ik de VBA functie,ze geeft Waar of Onwaar. Deze kolom kan je uiteraard verbergen.
Bvb rek nr staat in A2, de VBA functie in B2
Als validatie voor A2 geef ik als formule in: = B2
Omweg, maar het werkt!
 
Ik gebruik deze funkties:
Code:
Function ValidRR9(RR As Variant) As Boolean
  ValidRR9 = Left(RR, 9) Mod 97 = Val(Right(RR, 2))
End Function

Code:
Function ValidRR10(RR As Variant) As Boolean
  ValidRR10 = Left(RR, 10) - (97 * Int(Left(RR, 10) / 97)) = Val(Right(RR, 2))
End Function

Om te valideren gebruik ik een trucje met een hulpcel
In C6 zet ik
=validRR10(A6)
In A6 zet ik als validatie
aangepast
=C6=WAAR

Waarom het niet rechtstreeks kan is me niet duidelijk.

Haha, jij was sneller dan ik:o

Maar =C6 alleen is genoeg,resulteert ook in Waar of Onwaar ;)
 
Er is geen bereik gevonden met de naam die u hebt opgegeven"

Ik denk dat de functies van VBA niet herkend worden.
Ik had het geprobeerd met een eigen simpele VBA functie "Istekst" en op het eerste werkte het, maar dit is ook een ingebouwde functie van Excel, had ik niet aan gedacht...

Nu heb ik het volgende gedaan (voor Belgisch rek nr):

In VBA:

Code:
Public Function RekeningNummerOK(str_rekeningnummer As String) As Boolean
Dim dbl_Links10 As Double, byt_rechts2 As Byte, byt_Modulus As Byte


'Rekeningnummer is correct alsde rest na deling van de 10 eerste cijfers gedeeld door 97 gelijk is aan de twee laatste cijfers.
'Normaal kan je hiervoor weken met mod, maar dit geeft fout bij getallen langer dan long
'Vandaar andere redenering :
'13 - 4*3 = 1
'deeltal - deler * afgekapte deling = rest na deling
'10 eerste cijfers - 97* afgekapte deling = 2 laatste cijfers
'Rekeningnr als string gedefinieerd wegens eventuele leading zero's
    dbl_Links10 = Left(str_rekeningnummer, 10)
    byt_rechts2 = Right(str_rekeningnummer, 2)
    byt_Modulus = dbl_Links10 - Int(dbl_Links10 / 97) * 97
    RekeningNummerOK = (byt_Modulus = byt_rechts2)
End Function

In excel sheet:

Rekeningnummer opgemaakt als tekst
in de kolom naast het rek nr zet ik de VBA functie,ze geeft Waar of Onwaar. Deze kolom kan je uiteraard verbergen.
Bvb rek nr staat in A2, de VBA functie in B2
Als validatie voor A2 geef ik als formule in: = B2
Omweg, maar het werkt!

Dank je allebei voor de geweldige hulp!

De conclusie is:
- eigen functies gebruiken in Validatie is niet mogelijk of toch niet gevonden in deze discussie
- er zijn enkele workarrounds mogelijk met behulp van andere cellen in de worksheet

Ik houd het item nog even open. Misschien komt er iemand voorbij die kan uitleggen waarom eigen functies niet kunnen gebruikt worden in validaties.

Bedankt!
:thumb:
 
Ik probeerde met:

=Module1!RekeningNummerOK(A2)

en kreeg als melding dat je voor gegevensvalidatie niet naar andere sheets of werkboeken kunt verwijzen.
Dus lijkt hte me ook logisch dat je niet naar de modules kunt verwijzen.
Iets voor Excel 2010?
 
Dan gaan we deze vraag afsluiten.

En Piet, wat hebben we vandaag geleerd?
1) Er is bijzonder weinig documentatie over aangepast valideren
2) Eigen functies kunnen niet worden gebruikt in valideren
3) Het is goed dat helpmij.nl bestaat om dit soort vragen uit te klaren

Merci!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan