Max. aantal karakters in een combobox.

Status
Niet open voor verdere reacties.

Abel Visscher

Gebruiker
Lid geworden
28 mei 2007
Berichten
171
Beste,

Is het mogelijk om in een combobox een maimaal aantal tekens in te voeren van b.v. 25 tekens?
Zo ja, hoe doe je dat dan?
Het zou mooi zijn dat als bij het typen van de 26e teken de cursor gewoon blijft staan en het teken dus niet toevoegd.
Ik heb het ergens gezien, maar weet niet meer waar.
 
Het kan met een invoermasker of met een macro. Een invoermasker is waarschijnlijk wat netter.
 
Met een simpele check op je formulier:

Code:
Private Sub Tekst4_Change()
    If Len(Me.Tekst4.Text) > 25 Then
        MsgBox "Je mag maar 25 tekens intypen", vbOKOnly
        Me.Tekst4.Text = Left(Me.Tekst4.Text, Len(Me.Tekst4.Text) - 1)
    End If
End Sub
 
Wampier,

Je oplossing werkt wel, dank daarvoor.
Echter moet ik een teken (tijdelijk) invullen b.v. (_) dit vond ik niet mooi en heb dat proberen aan te passen door een spatie in te vullen. Dit werkt helaas niet en heb daarom een (.) geprobeerd. Maar om heel eerlijk te zijn vind ik ( ) het mooiste. Is dit te realiseren?

Octafisch,

Ook dank voor de gegeven oplossing.
Het werkt wel, maar in combinatie (By Not In List) krijg ik een foutmelding.
Als ik bij het invoeren van tekst in de combo over de 21 tekens ga (zijn ondertussen 21 geworden) dan krijg ik keurig de melding "Je kunt maar 21 ...........". Als je dan op OK klikt dan vraagt hij "Wil je .........toevoegen" keuze ja of nee. Ja is geen probleem, maar bij nee krijg ik een melding "De zoeksleutel is in geen enkele record gevonden" fout 3709 tijdens uitvoering.
Hij geeft deze melding op jou laatste regel.
Waar ligt dit aan?
 
Dit zijn de codes die ik gebruik op het formulier.

Code:
Private Sub LstKlant_Change()
    If Len(Me.LstKlant.Text) > 21 Then
        MsgBox "Je mag maar 21 tekens intypen", vbOKOnly
        Me.LstKlant.Text = Left(Me.LstKlant.Text, Len(Me.LstKlant.Text) - 1)
    End If
End Sub

En

Code:
Private Sub LstKlant_NotInList(NewData As String, Response As Integer)

Dim bytDoorgaan As Byte

bytDoorgaan = MsgBox("Wilt u " & NewData & " aan klantenlijst toevoegen?", vbDefaultButton1 + vbYesNo, "Aan lijst toevoegen")
If bytDoorgaan = vbYes Then
   ' Voeg record toe aan TblKlant
    Dim rst As New ADODB.Recordset
    Dim strSQL As String
    strSQL = "Select * From TblKlant"
    rst.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    With rst
        .AddNew
        !Klant = NewData
        .Update
    .Close
    End With

    Response = acDataErrAdded
    MsgBox "" & NewData & " is toegevoegd aan klantenlijst."

  Else
    Response = Empty
  End If

End Sub
 
Ik snap eigenlijk niet waarom je dit überhaupt zou willen.... De optie .Text werkt volgens mij alleen goed als je de optie <AutoUitbreiden> op <Nee> staat. In dat geval vindt hij helemaal niks, hoeveel letters je ook intypt. Dus daar heb je volgens mij helemaal niks aan. Dus lijkt het mij niet erg slim om de optie <AutoUitbreiden> op <Nee> te zetten.
En met die optie op <Ja> zal Access zodra je een aantal tekens typt die in de lijst voorkomen de juiste record uit de lijst invullen. Lijkt mij bijzonder nuttig! Maar met een check op de lengte van de gevonden waarde zal Access de lengte daarvan net zolang korter gemaakt tot je binnen de 21 tekens zit. Volgens mij heb je dan een 99% kans dat de ingevoerde reeks niet bestaat... Die ene procent is dan de waarde die precies 21 tekens bevat.
Bovendien heb ik zelf nog nooit een keuzelijst gemaakt waarbij ik met 20 tekens géén tekst kan vinden die in de lijst voorkomt. Met een tekentje of 6 moet je alles wel gevonden hebben.

Dus wat je aan het fabrieken bent: geen idee..... Lijkt het mij zinvol? Vergelijkbaar met het leeggieten van een flesje water op de oceaan :)
 
Ik meng me verder niet in de access database discussie omdat 8-vis daar veel beter in is :p (ik ben een postgre fan)

maarruh, je kunt " " gebruiken voor spaties (quotes ook intypen)
 
Wampier,

Dat is de oplossing.

Octafish,

Op de vraag waarom ik dit zou willen is het antwoord dat dit te maken heeft met het afdrukken van een palletkaart met een grote lettertype.
Dit wordt afgdrukt op een A4tje waarbij dus ook de klantnaam leesbaar moet zijn.
Nu kan het voorkomen dat een klantnaam groter is dan 21 tekens, bij het afdruken verdwijnen dan de tekens boven 21. Met mijn vraag probeer ik te voorkomen dat bij het invullen van een nieuwe klant men niet meer dan 21 tekens mag gebruiken.
Meestal bestaat de klantnaam uit een naam met toevoeging b.v. Handelsmaatschapij Doornbos. Dit zijn meer dan 21 tekens, men moet nu kiezen voor een afkorting b.v. Handelsmij. Doornbos
De oplossing van wampier werkt wel, maar die van jou is gebruikersvriendelijker in mijn ogen. Ik gebruik dit niet alleen.
Dus vandaar dat ik het zo probeer.
 
Je gebruikt een verkeerde methode om het record toe te voegen.

Code:
Private Sub LstKlant_NotInList(NewData As String, Response As Integer)
Dim b
Dim strSQL As String

    b = MsgBox("Wilt u " & NewData & " aan klantenlijst toevoegen?", vbDefaultButton1 + vbYesNo, "Aan lijst toevoegen")
    If b = vbYes Then
        strSQL = "INSERT INTO TblKlant ([Klant]) Values ('" & NewData & "')"
        CurrentDb.Execute strSQL, dbFailOnError
        Response = acDataErrAdded
        MsgBox "" & NewData & " is toegevoegd aan klantenlijst."
        strSQL = "SELECT [Klant] FROM TblKlant WHERE [Klant] ='" & NewData & "'"
        With CurrentDb.OpenRecordset(strSQL)
            Me.LstKlant.Value = .Fields(0).Value
            .Close
        End With
    Else
        Response = acDataErrContinue
    End If

End Sub

Van mij hoeft er verder ook geen discussie over het hoe en waarom; in mijn eigen voorbeeldjes kreeg ik alleen maar onzin toegevoegd in mijn lijstjes.... Dus ik zie het nut nog steeds niet :D
 
Laatst bewerkt:
Beste Octafish,

Hoeft ook geen discussie te zijn.:)

De code die je mij gegeven hebt doet het wel, maar ik krijg nog steeds dezelfde foutmelding als ik op "nee" klik bij de vraag "Wilt u ..... aan klantenlijst toevoegen" nadat ik eerst de melding heb gekregen dat ik maar 21 tekens mag gebruiken.
Blijf ik bij het invullen onder de 21 tekens dan gaat alles wel goed als ik op diezelfde "nee" klik.

De melding:
"De zoeksleutel is in geen enkele record gevonden" fout 3709 tijdens uitvoering.
Hij geeft deze melding op de laatste regel: Me.LstKlant.Text = Left(Me.LstKlant.Text, Len(Me.LstKlant.Text) - 1) in LstKlant_change.

Ik hoop dat mijn uitleg duidelijk is.
 
Ik weet ook niet of je probleem is op te lossen; een zoeklijst laat waarden uit een tabel zien, en die bevatten nu eenmaal een aantal tekens. Dat je geen melding krijgt bij het niet-vinden van een waarde onder de 21 tekens is wel logisch, omdat de NotInList procedure netjes kan worden afgewerkt. Bij meer dan 21 tekens krijg je het probleem dat de check op de lengte zoekt naar een niet-bestaand record. Je kunt Response = acDataErrContinue eens vervangen door Me.LstKlant..Undo; kijken of dat scheelt. Eventueel met een IF..END IF nog checken op de lengte, zodat je de Undo alleen doet bij lengtes boven de 21 tekens.

Ik blijf vinden dat je volgens mij op een verkeerde weg zit, maar omdat je geen voorbeeldje geeft, is dat verder niet hard te maken...
 
Ik snap niet helemaal wat je aan het doen bent; je hebt een tabel Klanten, met een veld Klant, die ook als basis dient voor je keuzelijst. In je keuzelijst wil je geen waarden kunnen kiezen die meer dan 21 tekens beslaan. Feitenlijk wil je de maximale lengte van het veld dus inperken tot 21 tekens. Maar als ik dan in de tabel kijk, dan zie ik daar een veldlengte staan van 50 tekens... Dus waarom mag je in de tabel wèl 45 tekens invoeren, maar in de keuzelijst niet? En wat doe je met het volgende voorbeeld: Gemeente Krimpenerwaard? Die zullen niet blij zijn als ze worden aangeschreven als Gemeente Krimpenerwaa... Maar bovenal zit je probleem dus al dat je verschillende keuzes maakt voor één veld. Zet eerst je veldeigenschappen goed, bijvoorbeeld met een Validatie regel op het veld Klantnaam (zoiets bijvoorbeeld: Len([Klant])<22 in combinatie met een Validatietekst: De klantnaam mag maximaal 21 tekens bevatten) zodat je gegevens overeenkomen met je formulier instellingen.

Door de optie <AutoUitbreiden> op <Nee> te zetten haal je volgens mij ook het nut van een keuzelijst met invoervak weg; nu zie je niet gelijk meer welke waarden er al in staan.
Met een kleine aanpassing kun je overigens de foutmelding die je krijgt wel omzeilen:

Code:
Private Sub LstKlant_Change()
[B][COLOR="blue"]    On Error Resume Next[/COLOR][/B]
    If Len(Me.LstKlant.Text) > 21 Then
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan