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

VBA geldige postcode in formulier

Status
Niet open voor verdere reacties.

wimven

Gebruiker
Lid geworden
26 jul 2009
Berichten
54
Beste forumgebruikers,

Hoe krijg ik een geldige notatie voor een postcode in mijn userform in Private Sub TxtPostcd_Change()
Oftewel 4 cijfers, spatie, 2 letters.

Heb het hele www al afgezocht; voor de ingewikkelde engelse postcode vind je genoeg maar helaas niet voor ons simpel lijkende systeem.
 
Laatst bewerkt:
Die had ik wel degelijk gevonden en om in een cel te gebruiken zal het wel werken maar zoals je zelf al in die post aangaf "doe de vertaalslag naar vba".

En laat dat nu juist het probleem zijn met de kenniskruimels die ik her en der opgepikt heb. Ook in de boeken die ik gekocht heb staat er niets zinnigs over. Daar wordt alleen gesproken over tijd/datum/dag

Overigens, wordt in die posting wel onderscheid gemaakt tussen cijfers en letters? Volgens mij niet.
 
Laatst bewerkt:
de function geldigepostcode checkt of een opgegeven postcode van het type 4 cijfers 2 letters eventueel met tussenliggende spatie is. Als resultaat krijg je een True of een False terug, zoals je kan zien als je die andere macro laat lopen

Code:
Sub Testpostcodes()
  MsgBox "123rf " & vbTab & GeldigePostcode("123rf")
  MsgBox "1234 AB" & vbTab & GeldigePostcode("1234 AB")
End Sub

Function GeldigePostcode(Postcode As String) As Boolean
  Dim s        As String
  s = UCase(Replace(Postcode, " ", ""))
  GeldigePostcode = (Len(s) = 6 And s Like "####[A-Z][A-Z]")
End Function
 
wimven,

Probeer deze eens, hij zal wel korter kunnen maar voor mij werkt het.
Code:
Private Sub TxtPostcd_AfterUpdate()
  Pc = TxtPostcd.Text    ' Definieert tekenreeks - Pc = Postcode.
  TxtPostcd = Left(Pc, 4) & " " & UCase(Right(Pc, 2)) 'Maak 5645 HH
End Sub
 
Laatst bewerkt:
Bedankt voor jullie hulp heren; hieronder wat de uiteindelijke VBAcode is geworden voor het postcode veld in het userform.
Helemaal goed werkt het nog niet want als ik 123a invoer wordt de weergave 123a 3A en 1234 wordt 1234 34. In beide gevallen wel met de melding dat het fout is maar de cursor gaat toch naar het volgende veld en dat zou niet moeten.
Toch is dit al weer een behoorlijke stap


Private Sub TxtPostcd_AfterUpdate()

Pc = TxtPostcd.Text
TxtPostcd = Left(Pc, 4) & " " & UCase(Right(Pc, 2))
If Not TxtPostcd.Text Like "[0-9][0-9][0-9][0-9] [A-Z][A-Z]" Then
MsgBox "Ongeldige invoer, probeer opnieuw met ####AZ"
End If

End Sub
 
je vergat op lengte te controleren
Code:
Private Sub TxtPostcd_AfterUpdate()
  If TxtPostcd.Text = "" Then Exit Sub
  pc = UCase(Replace(TxtPostcd.Text, " ", ""))             'je mag zowel "1234AB" als "1234 AB" invoeren
  If Not pc Like "####[A-Z][A-Z]" Or Len(pc) <> 6 Then     'check op lengte en op opmaak
    MsgBox "Ongeldige invoer, probeer opnieuw met ####AZ"
    TxtPostcd.Text = "": Exit Function                     'wis opgegeven tekst en verlaat macro
  End If
  pc = Left(pc, 4) & " " & Right(pc, 2)                    'zo is de goede postcode
  If pc <> TxtPostcd.Text Then TxtPostcd.Text = pc         'was die nog niet zo, dan zet je hem er zo in
End Sub
 
Laatst bewerkt:
cow18,

Ik test dit net even en hij geeft een foutmelding bij;
Code:
TxtPostcd.Text = "": Exit Function
Een melding van zoiets als "Mag geen funtie in een sub staan."
 
Code:
TxtPostcd.Text = "": Exit [COLOR="red"]Sub[/COLOR]
 
Fantastisch en nog slechts één klein vraagje: hoe zorg ik ervoor dat bij de exit sub de cursor op het veld blijft staan in plaats van toch naar het volgende veld te gaan.
In ieder geval met wat ik nu door jullie heb mijn hartelijke dank
 
Laatst bewerkt:
met "setfocus"
 
alles afgezocht op internet maar setfocus schijnt in dit verhaal een bekend probleem te zijn.
De oplossingen werkten bij mij geen van allen.
Het meest eenvoudig zou volgens mij zijn door een code in te voegen die gelijk staat aan SHIFT-TAB zodat je weer een veld terug gaat in het userform en de juiste postcode opnieuw kunt invoeren.
 
Laatst bewerkt:
Zet onderstaande mee in de code van je userform en vervang TextBox1 door de naam v/h object waarheen je springt na het invullen van je Postcode-object
Code:
Private Sub TextBox1_Enter()
If TxtPostcd = "" Then TxtPostcd.SetFocus
End Sub
 
Code:
Private Sub TxtPostcd_AfterUpdate()
  If TxtPostcd.Text = "" Then Exit Sub
  pc = UCase(Replace(TxtPostcd.Text, " ", ""))             'je mag zowel "1234AB" als "1234 AB" invoeren
  If Not pc Like "####[A-Z][A-Z]" Or Len(pc) <> 6 Then     'check op lengte en op opmaak
    MsgBox "Ongeldige invoer, probeer opnieuw met ####AZ"
    TxtPostcd.Text = ""
    TxtPostcd.Setfocus
    Exit Function                     'wis opgegeven tekst en verlaat macro
  End If
  pc = Left(pc, 4) & " " & Right(pc, 2)                    'zo is de goede postcode
  If pc <> TxtPostcd.Text Then TxtPostcd.Text = pc         'was die nog niet zo, dan zet je hem er zo in
End Sub
 
@ Bart
Dat dacht ik eerst ook, maar dat werkt niet. Daarom mijn oplossing in vorige post
 
Warme bakkertje
@ Bart
Dat dacht ik eerst ook, maar dat werkt niet. Daarom mijn oplossing in vorige post
Ik heb ze alle 2 uit geprobeerd zonder succes.
Als je met F8 de code doorloopt zie je dat het werkt maar dan gelijk weer verspringt naar de afterupdate en springt hij toch naar de volgende ook als je exit sub plaatst.
Zou de afterupdate de boosdoener kunnen zijn?
 
ik had het inderdaad niet uitgetest, misschien gemakkelijker voor de TS om in het vervolg een voorbeeldbestandje bij te voegen, maar na een beetje zoeken vond ik deze versie
Code:
Option Explicit
Public bOk     As Boolean


Private Sub TxtPostcd_AfterUpdate()
  Dim pc       As String
  bOk = True                                               'cursor mag straks deze textbox verlaten
  If txtPostcd.Text = "" Then Exit Sub
  pc = UCase(Replace(txtPostcd.Text, " ", ""))             'je mag zowel "1234AB" als "1234 AB" invoeren
  If Not pc Like "####[A-Z][A-Z]" Or Len(pc) <> 6 Then     'check op lengte en op opmaak
    bOk = False                                            'cursor moet hier blijven
    MsgBox "Ongeldige invoer, probeer opnieuw met ####AZ"
    txtPostcd.Text = ""
    Exit Sub                                               'wis opgegeven tekst en verlaat macro
  End If
  pc = Left(pc, 4) & " " & Right(pc, 2)                    'zo is de goede postcode
  If pc <> txtPostcd.Text Then txtPostcd.Text = pc         'was die nog niet zo, dan zet je hem er zo in
End Sub

Private Sub txtPostcd_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  If Not bOk Then Cancel = True                            'als cursor hier moet blijven, dan moet die hier blijven !!!
End Sub
 

Bijlagen

cow18

Ik ben niet de TS maar dit werkt perfect.
Over een voorbeeld bestandje ben ik het met je eens, dan had dit al veel eerder opgelost geweest.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan