Hi everyone,
I can't find a custom format to validate a properly formatted Canadian postal code on entry, so I think my last hope is to ask someone to write me a VBA code.
Canadian postal codes consist of six characters with a space in the middle: a capital letter, a number, a capital letter, a space, a number, a capital letter, and a number. Therefore, M2A 3J4 is a properly formated postal code.
I want a code to fix an improperly fomatted postal code (such as M2A3J4 or m2a3j4 or m3a 2j4) on entry.
Can anyone please help me?
Thanks,
Gos-C
Using Excel 2007 & 2010/Windows XP
"It is better to be prepared for an opportunity and not have one than to have an opportunity and not be prepared."
Gos-C
Try this macro - It does not verify Letters & Number are placed in the correct order - This can be added if required.
Copy this macro
Goto Excel
Right Click on Sheet Name Tab > select View Code
Past macro into the Worksheet Module displayed
Change Column number to suit (shown In red in this posting)
Return to Excel and test
Code:Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range For Each Rng In Target If Rng.Column = 1 Then Application.EnableEvents = False Select Case Len(Rng.Value) Case 6 Rng.Value = UCase(Left(Rng.Value, 3) & " " & Right(Rng.Value, 3)) Case 7 Rng.Value = UCase(Rng.Value) End Select End If Next Rng Application.EnableEvents = True End Sub
Hi Mudraker,
Thank you very much. It works but, if you don't mind, can you add the verification of the letters and numbers in the correct order. That would be perfect. I really appreciate your help.
Thanks again,
Gos-C
Using Excel 2007 & 2010/Windows XP
"It is better to be prepared for an opportunity and not have one than to have an opportunity and not be prepared."
Gos
This version verifies letters, numbers, space in correct location.
Change Column number to suit
For invalid Postcode entries if you remove the ' before 'rng.ClearContents it will clear the entry
Code:Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range Dim iChar As Integer For Each Rng In Target If Rng.Column = 1 Then Application.EnableEvents = False Select Case Len(Rng.Value) Case 6 Rng.Value = UCase(Left(Rng.Value, 3) & " " & Right(Rng.Value, 3)) Case 7 Rng.Value = UCase(Rng.Value) End Select If Len(Rng.Value) <> 7 Then MsgBox "Invalid Post Code Entyry in " & Rng.Address Exit For End If For iChar = 1 To 7 Step 1 Select Case Mid(Rng.Value, iChar, 1) Case "A" To "Z" Select Case iChar Case 2, 4, 5, 7 MsgBox Rng.Address & " - " & Mid(Rng.Value, iChar, 1) _ & " is invalid for Postcode" 'rng.ClearContents Exit For End Select Case 0 To 9 Select Case Mid(Rng.Value, iChar, 1) Case 1, 3, 4, 6 MsgBox Rng.Address & " - " & Mid(Rng.Value, iChar, 1) _ & " is invalid for Postcode" 'rng.ClearContents Exit For MsgBox Rng.Address & " - " & Mid(Rng.Value, iChar, 1) _ & " is invalid for Postcode" 'rng.ClearContents Exit For End Select Case " " Select Case Mid(Rng.Value, iChar, 1) Case 1 To 3, 5 To 7 MsgBox Rng.Address & " - " & Mid(Rng.Value, iChar, 1) _ & " is invalid for Postcode" 'rng.ClearContents Exit For End Select Case Else MsgBox Rng.Address & " - " & Mid(Rng.Value, iChar, 1) _ & " is invalid for Postcode" 'rng.ClearContents Exit For End Select Next iChar End If Next Rng Application.EnableEvents = True End Sub
Here's an alternative if you require a formula, with your data entry in A1, then this in B1
=LEFT(UPPER(A1),3)&" "&RIGHT(UPPER(A1),3)
oldchippy
-------------
![]()
![]()
If you are happy with the help you have received, please click the blue scales icon in the blue bar of the post.
Click here >>> Top Excel links for beginners to Experts
Forum Rules >>>Please don't forget to read these
Hi Mudraker,
Thanks again for taking time to help me. I sincerely appreciate it.
When I enter an improperly formatted postal code -- e.g., a1b2c3 -- in cell A1, it gets formatted properly (A1B 2C3) but I get the message: $A$1 - 1 is invalid for Postcode. It happens all the time. Do I need to modify the code?
Thanks,
Gos-C
Using Excel 2007 & 2010/Windows XP
"It is better to be prepared for an opportunity and not have one than to have an opportunity and not be prepared."
I should have been a bit more thourgh on the testing before posting the code
Code:Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range Dim iChar As Integer For Each Rng In Target If Rng.Column = 1 Then Application.EnableEvents = False Select Case Len(Rng.Value) Case 6 Rng.Value = UCase(Left(Rng.Value, 3) & " " & Right(Rng.Value, 3)) Case 7 Rng.Value = UCase(Rng.Value) End Select If Len(Rng.Value) <> 7 Then MsgBox "Invalid Post Code Entyry in " & Rng.Address Exit For End If For iChar = 1 To 7 Step 1 Select Case Mid(Rng.Value, iChar, 1) Case "A" To "Z" Select Case iChar Case 2, 4, 5, 7 MsgBox Rng.Address & " - " & Mid(Rng.Value, iChar, 1) _ & " is invalid for Postcode" 'rng.ClearContents Exit For End Select Case 0 To 9 Select Case iChar Case 1, 3, 4, 6 MsgBox Rng.Address & " - " & Mid(Rng.Value, iChar, 1) _ & " is invalid for Postcode" 'rng.ClearContents Exit For End Select Case " " Select Case iChar Case 1 To 3, 5 To 7 MsgBox Rng.Address & " - " & Mid(Rng.Value, iChar, 1) _ & " is invalid for Postcode" 'rng.ClearContents Exit For End Select Case Else MsgBox Rng.Address & " - " & Mid(Rng.Value, iChar, 1) _ & " is invalid for Postcode" 'rng.ClearContents Exit For End Select Next iChar End If Next Rng Application.EnableEvents = True End Sub
Got it! Mudraker, you're the best! Thanks a million.
Gos-C
Using Excel 2007 & 2010/Windows XP
"It is better to be prepared for an opportunity and not have one than to have an opportunity and not be prepared."
Glad to hear all is now working correctly & thanks for the feed back
I beleive this might also helpful if you are entering Postcode in Range 'A1'.
Sub Postal_Verify()
If Len(Range("A1").Text) = 6 And _
IsAlpha(Mid(Range("A1").Text, 1, 1)) = True And _
IsAlpha(Mid(Range("A1").Text, 3, 1)) = True And _
IsAlpha(Mid(Range("A1").Text, 5, 1)) = True And _
IsNumeric(Mid(Range("A1").Text, 2, 1)) = True And _
IsNumeric(Mid(Range("A1").Text, 4, 1)) = True And _
IsNumeric(Mid(Range("A1").Text, 6, 1)) = True Then
Range("A1") = Left(Range("A1"), 3) & " " & Right(Range("A1"), 3)
Else
MsgBox "Invalid Postal Code."
End If
End Sub
Function IsAlpha(chr As String) As Boolean
If Asc(chr) >= 97 And Asc(chr) <= 122 Or Asc(chr) >= 65 And Asc(chr) <= 90 Then
IsAlpha = True
Else
IsAlpha = False
End If
End Function
Regards,
Gajendra Gupta
This is even more simpler..![]()
Sub Postal_Verify()
If Range("D1") Like "[A-Za-z][0-9][A-Za-z][0-9][A-Za-z][0-9]" Then
Range("A1") = Left(Range("A1"), 3) & " " & Right(Range("A1"), 3)
Else
MsgBox "Invalid Postal Code."
End If
End Sub
Regards,
Gajendra Gupta
Gajendra
Fantastic bit of code - I would never have thought of using Like
I have modified my macro to incorporate your code.
The new macro retains all the requirements as per Gos-C 1st posting and is much simpler than what I had coded
Code:Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range Dim iChar As Integer For Each Rng In Target If Rng.Column = 1 Then Application.EnableEvents = False Select Case Len(Rng.Value) Case 6 Rng.Value = UCase(Left(Rng.Value, 3) & " " & Right(Rng.Value, 3)) Case 7 Rng.Value = UCase(Rng.Value) End Select If Rng.Value Like "[A-Z][0-9][A-Z][ ][0-9][A-Z][0-9]" Then 'do nothing Else MsgBox Rng.Address & " - invalid Postcode" End If End If Next Rng Application.EnableEvents = True End Sub
Hi Mudraker,
This is certainly going to be a popular/much sought-after code. Good job! I think it would be better if the invalid postal code is cleared when the message is shown. Do you mind adding this last bit?
Gajendra, thanks also for your great input.
Regards,
Gos-C
Last edited by Gos-C; 02-09-2007 at 12:14 PM.
Using Excel 2007 & 2010/Windows XP
"It is better to be prepared for an opportunity and not have one than to have an opportunity and not be prepared."
Gos-C
Contents now cleared on invalid postcodes - New line shown in red
Code:Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range Dim iChar As Integer For Each Rng In Target If Rng.Column = 1 Then Application.EnableEvents = False Select Case Len(Rng.Value) Case 6 Rng.Value = UCase(Left(Rng.Value, 3) & " " & Right(Rng.Value, 3)) Case 7 Rng.Value = UCase(Rng.Value) End Select If Rng.Value Like "[A-Z][0-9][A-Z][ ][0-9][A-Z][0-9]" Then 'do nothing Else MsgBox Rng.Address & " - invalid Postcode" Rng.ClearContents End If End If Next Rng Application.EnableEvents = True End Sub
Perfect!
Thanks again, Mudraker.
Gos-C
Using Excel 2007 & 2010/Windows XP
"It is better to be prepared for an opportunity and not have one than to have an opportunity and not be prepared."
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks