.Find functie om te controleren of cijfercombinatie bestaat levert geen resultaat

Status
Niet open voor verdere reacties.

RickBu

Gebruiker
Lid geworden
21 aug 2018
Berichten
13
Beste helpers,

Ik wordt zo langzamerhand licht agressief dus het is hoog tijd jullie hulp er bij te roepen, ik ben namelijk bang dat ik iets over het hoofd zie.

Ik ben bezig met het opstellen van een programma om eenvoudig tot een planning te komen en heb binnen het programma een validatiemoment nodig wat nagaat of het Ordernummer en het zogeheten Bonnummer al eens zijn ingevoerd. Dit heb ik als volgt vormgegeven:

Een Order wordt ingevoerd via het formulier Bon Invoeren:
Voorbeeld.JPG

Wanneer het Order en Bonnummer worden ingevoerd (beiden Geel gearceerd) voeg ik in de eerste kolom van de tabel (onder de grijze rechthoek shape) de cijfercombinatie in die zichtbaar is in de formulebalk.
Code:
'Toevoegen van uniek Order en Bon nummer
TabelregelOD.Range(1, 1) = CBOrdernummer.Value & TBBonnummer.Value

Dit is de unieke cijfercombinatie die ik later wil controleren wanneer een nieuwe Order wordt ingevoerd.

Wanneer er vervolgens een nieuwe Order wordt ingevoerd heb ik het volgende validatie script geschreven voor de TextBox Bonnummer After Update:
Code:
Private Sub TBBonnummer_AfterUpdate()
 
'Controleren of order en bonnummer bestaat

    Dim OrdernummerMatch As Range
    Dim Zoekterm As Double
    
    Zoekterm = CBOrdernummer.Value & TBBonnummer.Value
    
    Set OrdernummerMatch = [WijzigKnoppen].Find(What:=CDbl(Zoekterm), LookIn:=xlValues, Lookat:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
        
    If OrdernummerMatch Is Nothing Then
    MsgBox ("Order en Bon nummer zijn uniek")
    Else
    MsgBox ("Combinatie bestaat al")
    End If

End Sub

[WijzigKnoppen] is de lijst die verwijst naar de 1e kolom van de tabel "Orderdata". Ik heb al eerder problemen gehad met de .Find functie van excel, zie: https://www.helpmij.nl/forum/showth...list-object)-geeft-fout-91-tijdens-uitvoering. Dus heb ik deze keer verschillende varianten als String, Long en Double op allerlei manieren getest maar steeds zonder resultaat. Ik blijf terugkrijgen dat de combinatie uniek is ook als dat niet het geval is.

Mijn vraag, wat doe ik verkeerd?? Ik wil simpelweg dat het er een melding zichtbaar wordt als de combinatie van Order en Bon nummer al in de tabel is toegevoegd :p Gezien het feit dat de combinatie soms een slinger van 12 getallen of meer kan vormen is het in mijn ogen noodzakelijk de variant Double te gebruiken? Of is dit anders in te vullen?

Alvast bedankt voor jullie hulp, het bestand is toegevoegd als bijlage. Dit is mijn eerste project in VBA dus ik waarschuw alvast voor het geval de code niet helemaal logisch is opgebouwd.

Groeten,
Rick
 

Bijlagen

  • Voorbeeld helpmij Forum.xlsm
    186,8 KB · Weergaven: 30
Probeer het eens zo:
Code:
Private Sub TBBonnummer_AfterUpdate()
 
'Controleren of bonnummer bestaat

Dim OrdernummerMatch As Range
Dim Zoekterm As Double

Zoekterm = CBOrdernummer.Value & TBBonnummer.Value

    [COLOR="#0000FF"]If Application.WorksheetFunction.CountIf(Sheets("Planning").Range("A:A"), Zoekterm) > 0 Then[/COLOR]
        MsgBox ("Combinatie bestaat al")
    Else
        MsgBox ("Order en Bon nummer zijn uniek")
    End If
    
End Sub
 
Laatst bewerkt:
Code:
Private Sub TBBonnummer_AfterUpdate()
   sn=sheets("planning").columns(1).specialcells(2)
   c00=CBOrdernummer & TBBonnummer

   for j=1 to ubound(sn)
      if format(sn(j,1))=  c00 then exit for
   next

   msgbox c00 & "is " iif(j=ubound(sn)+1,"","niet ") & "uniek"
End Sub
 
Laatst bewerkt:
Bedankt voor jullie reacties! Ik ben als eerst aan de slag gegaan met de suggestie van Gijsbert1 en heb de code nu als volgt werkend:

Code:
Private Sub TBBonnummer_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

    Dim Zoekterm As Double
   
    zoekterm = CBOrdernummer.Value & TBBonnummer.Value

           If Application.WorksheetFunction.CountIf([WijzigKnoppen], Zoekterm) > 0 Then

                  MsgBox ("Combinatie bestaat al"), vbCritical + vbOKOnly

                  Cancel = True

           End If

End Sub

Ik was even bang dat deze oplossing misschien langzaam zou worden in een bestand met een groter aantal regels maar dat is niet het geval. In een proefbestand met 350 regels ging het nog steeds als een speer en dat is ongeveer ook de orde van grote waarmee ik zal gaan werken.

Bij de code van SNB raakte ik helaas wel de kluts kwijt, de UBOUND functie is er toch op gericht om de hoogste waarde binnen een range te vinden? Ik kreeg hem helaas niet werkend.

Verder vraag ik me toch af waarom de Find functie in dit geval geen resultaat gaf?

In ieder geval bedankt voor de genome moeite, het probleem is verder opgelost.

Groeten,
Rick
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan