When you sync Outlook contacts with some smartphones (like Androids), phone numbers can't be dialed because they contain the country code. This VBA code removes the +1 prefix from Outlook phone numbers. If you need to remove 2-digit country codes, you'll need to edit the function.
The code checks to see if the contact is a contact or a distribution list. If it's a distribution list, it's skipped and the code moves on to the next item.
Note that when you sync, Outlook may reformat the number. Use a 4-digit or 5-digit area code (ie, 1234 or 99999) in Control Panel's Phone and Modem Options to prevent numbers from being formatted.
Remove the country code from phone numbers
To use, select a contacts folder then open the VBA editor (use Alt+F11). Right click on the Project name and choose Insert > Module. Paste the code into the module. Press F8 or the Run button to run the macro.
This basis for this code was originally posted in the old Microsoft Newsgroups by Michal Bednarz of CodeTwo software and tweaked by Patrick. I tweaked it to use one function and check for (and skip over) distribution lists.
Sub FixPhoneFormat() Dim oFolder As MAPIFolder Set oFolder = Application.ActiveExplorer.CurrentFolder ' Confirm it's a contacts folder by looking at the default form name ' to see if it begins with "ipm.contact". ' This allows it to work on folders with custom forms If Left(UCase(oFolder.DefaultMessageClass), 11) <> "IPM.CONTACT" Then MsgBox "You need to select a Contacts folder", vbExclamation Exit Sub End If Dim nCounter As Integer nCounter = 0 Dim oItem For Each oItem In oFolder.Items Dim oContact As ContactItem ' If the current item is a not a Contact Group process the phone numbers ' If it's a DL, the code moves on to the next item If TypeName(oItem) <> "DistListItem" Then Set oContact = oItem With oContact .AssistantTelephoneNumber = FixFormat(.AssistantTelephoneNumber) .Business2TelephoneNumber = FixFormat(.Business2TelephoneNumber) .BusinessFaxNumber = FixFormat(.BusinessFaxNumber) .BusinessTelephoneNumber = FixFormat(.BusinessTelephoneNumber) .CallbackTelephoneNumber = FixFormat(.CallbackTelephoneNumber) .CarTelephoneNumber = FixFormat(.CarTelephoneNumber) .CompanyMainTelephoneNumber = FixFormat(.CompanyMainTelephoneNumber) .Home2TelephoneNumber = FixFormat(.Home2TelephoneNumber) .HomeFaxNumber = FixFormat(.HomeFaxNumber) .HomeTelephoneNumber = FixFormat(.HomeTelephoneNumber) .ISDNNumber = FixFormat(.ISDNNumber) .MobileTelephoneNumber = FixFormat(.MobileTelephoneNumber) .OtherFaxNumber = FixFormat(.OtherFaxNumber) .OtherTelephoneNumber = FixFormat(.OtherTelephoneNumber) .PagerNumber = FixFormat(.PagerNumber) .PrimaryTelephoneNumber = FixFormat(.PrimaryTelephoneNumber) .RadioTelephoneNumber = FixFormat(.RadioTelephoneNumber) .TelexNumber = FixFormat(.TelexNumber) .TTYTDDTelephoneNumber = FixFormat(.TTYTDDTelephoneNumber) .Save nCounter = nCounter + 1 End With End If Next MsgBox nCounter & " contacts processed.", vbInformation End Sub Private Function FixFormat(strPhone As String) As String strPhone = Trim(strPhone) FixFormat = strPhone If strPhone = "" Then Exit Function Dim prefix As String prefix = Left(strPhone, 1) ' Configured for US ' Enter the correct prefix here Do While (prefix = "+" Or prefix = "1") ' if the prefix is 2 digits, change to 4; ' if 3 digits, change to 5 strPhone = Mid(strPhone, 3) prefix = Left(strPhone, 1) Loop ' After we clean up the country code, we remove non-numeric characters ' Can be tweaked to change formatting, ie: change 202.555.1212 to 202-555-1212 strPhone = Replace(strPhone, "(", "") strPhone = Replace(strPhone, ")", "") strPhone = Replace(strPhone, ".", "") strPhone = Replace(strPhone, " ", "") strPhone = Replace(strPhone, "-", "") FixFormat = strPhone End Function
Add the Country code
My function above can be tweaked to change the country code by changing the last line of the function to this format (assuming +1 was the old country code and +44 is the new country code).
FixFormat = "+44" + strPhone
Add Prefix Function
Michal's original code sample added the country code to contacts, replicating the Check Phone Number dialog.
Private Function FixFormat(strPhone As String) As String FixFormat= strPhone strPhone = Trim(strPhone) If strPhone = "" Then Exit Function If Left(strPhone, 1) = "+" Then Exit Function If Left(strPhone, 2) = "(+" Then Exit Function If Left(strPhone, 2) = "00" Then Exit Function If Left(strPhone, 3) = "(00" Then Exit Function If Left(strPhone, 1) = "1" Then Exit Function If Left(strPhone, 2) = "(1" Then Exit Function FixFormat= "1" + strPhone End Function
Change the function
You can change the function to alter phone numbers in any number of ways - if you need to add a number to dial out, change an area code, and more.
This sample checks for US number (+1) and exits the function if found, otherwise it adds 6 to the beginning of the number.
Private Function FixFormat(strPhone As String) As String strPhone = Trim(strPhone) If strPhone = "" Then Exit Function If Left(strPhone, 2) = "+1" Then Exit Function strPhone = "6" & strPhone FixFormat = strPhone End Function
Hmm, this code makes the huge simplifying assumption that all country codes are 1 digit, which they most certainly are not. In fact the only one digit country codes I see are "1" (US/Canada) and "7" (Russia). Some codes are 1 digit, some are 2, and some are three. And that's the trick, because I don't see any simple rule.
You just need to tweak the cod to apply it to other countries. If you have multiple codes to fix, you need to run it twice, first checking one code, then the next... .
From the code:
Diane,
I have tried to use the VBA script per your instructions to remove the country code from my Outlook contacts (to allow my smartphone to dial numbers correctly) and I am not seeing any changes, despite the fact that I see a message that 1700 contacts have been processed. Could the fact that I use categories be the reason for the failure? If not, what might you suggest?
What prefix are you removing? My guess is the formats in FixFormat aren't correct. Is anything getting changed on them?
I am trying to remove numeral 1 in the Country/Region field of phone numbers that adds +1 to the phone number, which leads to smartphone dialing error messages that refer to international numbers.
Can you please help me with removing "area code 504" from all contacts that have that 504?
I had an issue with outlook 2016 and now most contacts have been imported with that 504 in "area code".
This needs changed in the macro = and assumes it is 504-123-456 format, no +1. I did not test the changes- so test any changes on a few contacts copied to a new folder.
strPhone = Trim(strPhone)
FixFormat = strPhone
If strPhone = "" Then Exit Function
Dim prefix As String
prefix = Left(strPhone, 3)
' Configured for US
' Enter the correct prefix here
Do While (prefix = "504")
' if the prefix is 2 digits, change to 4;
' if 3 digits, change to 5
strPhone = Mid(strPhone, 5)
prefix = Left(strPhone, 1)
Loop
Thank you very much for this info.
Life saver. 5,200 contacts updated! Easily adapted the code to equivalent UK phone code format issues. Many many thanks.
Hi Diane, Thank you very much for sharing those valuable information with us! ☺ Your script is almost exact what I am looking for. However I need to have all my phone numbers formatted like shown in the first picture. I am working with Microsoft CRM 2011 and have to deal with lots and lots of Accounts, and contacts. All of them are synchronized with my Outlook 2010 contacts on my laptop as well as on my iPhone 4S, however, everybody types his information into the system without following a uniform "pattern". Unfortunately I am an absolute greenhorn with this scripts and do not want to mess around with those numbers, because if I am accidentally delete one digit or switch two digits of all phone and Fax numbers, I am in big trouble. My colleagues are going to kill me. ☺ Therefore, I truly would appreciate, if you could you publish a script, which would address my needs as well? Here is what I would like to change: All phone fax number to this format: +1 (202) 555-1414 Currently many different variations are used in the system like: +1(202) 555-1414 +12025551414 12025551414 1.202.555.1414 1-202-555-1414 1202 555 1414 202 555… Read more »
Thank you so much for this! Such a help!
The code works great with one exception for me - I can't get the .Save to change the record. The substitutions are made but when the function returns to the Sub, the .businessTelephoneNumber remains as it was. What could I be doing wrong?