Microsoft Outlook does not support importing multiple vCards - you need to import them one vcard at a time. While this is tolerable for a few, its frustrating when you a large number to import.
This can also be done using VBA, basically automating the process you'd use to do it manually: open each contact, save in your default Contacts folder then close it. Unless you are Superman, the macro will finish long before you would.
Macro to bulk import vcards
Begin by creating a folder named vcards on root of the c:\ drive. The path will be c:\vcards. Copy all your individual vCard files (.vcf) to this folder. (You can use a different folder but will need to update the macro with the correct folder path.)
Next open Outlook and press ALT + F11 to open the VBA editor.
Go to Tools, References and select Microsoft Scripting Runtime and Windows Script Host Object Model from the list and place checks in the box next to each and click OK.
Click Insert, Module and copy and paste the following code into the blank module. Save and run the macro to automatically import and save all the individual files into Outlook.
Sub OpenSaveVCard()
Dim objWSHShell As IWshRuntimeLibrary.IWshShell
Dim objOL As Outlook.Application
Dim colInsp As Outlook.Inspectors
Dim strVCName As String
Dim fso As Scripting.FileSystemObject
Dim fsDir As Scripting.Folder
Dim fsFile As Scripting.File
Dim vCounter As Integer
Set fso = New Scripting.FileSystemObject
Set fsDir = fso.GetFolder("C:\vcards")
For Each fsFile In fsDir.Files
'original code
'strVCName = "C:\vcards\" & fsFile.Name
'Zeda's fix for spaces in filenames
strVCName = """C:\vcards\" & fsFile.Name & """"
Set objOL = CreateObject("Outlook.Application")
Set colInsp = objOL.Inspectors
If colInsp.Count = 0 Then
Set objWSHShell = CreateObject("WScript.Shell")
objWSHShell.Run strVCName
Set colInsp = objOL.Inspectors
If Err = 0 Then
Do Until colInsp.Count = 1
DoEvents
Loop
colInsp.Item(1).CurrentItem.Save
colInsp.Item(1).Close olDiscard
Set colInsp = Nothing
Set objOL = Nothing
Set objWSHShell = Nothing
End If
End If
Next
End SubImport Contacts Saved as MSG Files
The macro above works with vCard files and replicates the action of opening the vCard and clicking Save, which saves it to the Contacts folder. It won''t work with Contacts saved as .msg files, which are saved to Contacts using the Copy to My Contacts command.

By changing Save in colInsp.Item(1).CurrentItem.Save to Copy or Move, we can import Contacts saved as .msg files.
However, in my tests, Copy created duplicates, while Move created just one contact.
At the top of the macro, under the Dim statements, add these two lines. This tells Outlook where you want to it put the contacts.
Dim olFolder As Outlook.Folder
Set olFolder = Session.GetDefaultFolder(olFolderContacts)
Change the line that saves the message to Move:
colInsp.Item(1).CurrentItem.Move olFolder
Now when you run the macro on a folder containing contacts saved as .msg files, it will place a copy in your default Contacts folder.
More Information
How to use Outlook's VBA Editor
The tools listed at Import vCards in Bulk in Microsoft Outlook will import or export vcards in bulk.
Erik says
Hi and thx for your code.
I am looking for going the other way, i.e. transfer contacts from Outlook to Thunderbird. Outlook exported all contacts in msg-format, that I would need to convert to vcf-format, and then import to Thunderbird.
Is there some VBA-code I could use from within Excel to realise this?
Basilio says
You saved my life!
actually I prefer thunderbird which is free and handles contacts better and so on. But I have a 70-year-old client who doesn't get used to new programs other than commercial ones. Osea perspective.
almost 600 contacts imported into Outlook 365 with your script. Hugely grateful
PS: Thundebird if it pulls multiple contacts from a vcf file
Basil
from Peru
Emanuel Garcia says
Hello!
Thanks for the tutorial!
You have a script to import EML files to outlook???, i have a lot of then...
Diane Poremsky says
Not offhand, but will look at writing one.
Diane Poremsky says
It should be easy to do now that I think about it - open the file, copy to folder.
Diane Poremsky says
In looking at this macro and the one at https://www.slipstick.com/developer/code-samples/move-messages-file-system-outlook/ - they should work. I don't have any eml's handy right now to test it... will try to test it later.
Francisco says
Thanks a lot for this! I used it to import 1900 vcards to Outlook so this really helped a lot.
Kirt P says
Super great script. I'm a super PC user since 1985. Never programmed beyond AutoCAD's AutoLISP or Basic. This was cinch. Your step by step instructions were perfect. THANK YOU for saving me hours importing 229 VCF files into Outlook 2016.
Buzz says
I get an execution error '440' impossible to move the elements (traduction from french) with the line : colInsp.Item(1).CurrentItem.Move olFolder.
The contact is added but duplicated and the macro stops.
Thanks
Diane Poremsky says
what are you using for
Set olFolder = Session.GetDefaultFolder(olFolderContacts) ? (This is the default contacts folder and isn't necessary unless you are using a different folder)
Emil says
That was PERFECT!! I am not VBA literat at al, but thanks to this code all my contacts from 200 vcf cards are propelly imported with just few clicks!!!
federico says
This is GREAT and useful.
Here's what I did:
1) I used gmail to compile & edit a mix of my outlook and android contacts (phone numbers, email and postal addresses, notes, etc.)
2) I exported to my pc the entire list in a single vcard file, to be uploaded to my pc and android device;
3) it worked with android, but outlook was only able to load the first of the many contacts embedded in the single file;
4) I found on the internet and used this portable and free GUI utility to split the single multi-contact vcard file into many single-contact vcard files: VCARD SPLITTER (available at https://vcardsplitter.codeplex.com)
5) I followed the procedure described in this page to load hundreds of vcard files. It worked flawlessly and imported all contacts in seconds.
THANKS!!
Jesse says
Thank you for this macro! It was a tremendous help to me today!
Jordan says
Diane,
This is a great code, and as always I would like to tweak it a little. As previously mentioned by another post, I really want to import these bulk files and update vcard if the email address is the same.
You had mentioned that this code bypasses the duplicate notification. Is there a way to initiate and accept it?
If not, I have also created another code to search for duplicate email addresses and delete. My issue with this strategy is that I cannot delete the older vcard file.
Thanks in advance.
Les Simpson says
Many thanks for enabling me, a newbie, to covert .vcf files to Outlook .csv files correctly first time no issues.
Brilliant work Diane. Ta
Les
Taylor says
The MOVE version of this code works great if i go step by step... ( i had to comment out the .Close olDiscard line because the .vcf file would close after it was moved!)
However, the code will not work when I run it...
I don't really understand how the code could work perfectly when go step by step (F8), but will act differently when it run through (F5)
Diane Poremsky says
Yeah, it seems buggy although I didn't have this problem. I'll try to repro on another machine.
JPVann says
I get a 'null' contact after 5 VCF file imports from a single VCF file and then the macro stops. Any ideas?
Suresh says
Hi, Excellent Program that saved my time
Omer says
out class solution ... i am not IT expert but i make it with easy instructions.. Thanks a lot
puneet says
Hey brother,
What a script that can save the planet earth ;)
sincerest gratitude
Visar M says
How can I import the contacts to a custom folder in Outlook, and not in Default contacts folder?
Diane Poremsky says
This macro just automates the open then save steps to save vcards in contacts. You'd need to watch the contacts folder and move all new items. Or. wait till its finished then add the modified date field to the view and sort by it - select the contacts and move to another folder. Every thing that the macro added will have a similar modified date. The create date might be the date it was added to Outlook's data file - if so, you could use that field instead.
Sco says
Hello,
Many thanks for this script.
My problem is that I need to import a vcf file with multiple users (nearly 300).
The scripts only import the first, have you an idea?
Thanks!
Diane Poremsky says
This macro is for single vcards, not multi. If you have a gmail account, the quickest way to convert it is to import into gmail then export in Outlook format - aka, as a csv file. If you prefer using a utility or don't have a gmail account, see https://www.slipstick.com/outlook/contacts/import-vcards-in-bulk-into-outlook/ for some utilities that can import multicard vcards.
Sco says
Many thanks for your answer.
I finally successed to import all my contacts in outlook using this method:
1-download a vcf splitter and create a vcf file for each contacts : (https://inversekarma.in/technology/freeware/split-contacts-using-vcf-cutter-to-export-to-a-nokia-phone/#prettyPhoto)
2-Use a macro to import each contacts on Outlook (https://www.slipstick.com/developer/macro-to-bulk-import-vcards/)
3-Synchronize my contacts from my Windows Phone
Frate says
Thanks for the script. Save my afternoon and my wife's contacts :-)
meet says
madam its my lucky day that i am follow your Instructions and i got result.....
its simply good and save my time....
Thanks a lot once again......
Bob says
Diane,
Great little macro. I was able to get my contacts out of Outlook 2011 for the Mac into my PC using your VBA program. There were nearly 2000 contacts, so I got past the 451 limit that Jude claims. I did find that if a file in the vcard folder is not a true vcard, the macro will stop. Very well done!!
Jude says
Hi Diane,
Thanks for this neat script!
I don't suppose you know why this script seems to stop after 451 contacts have been processed (out of 1,511)? It will never get past 451!
I then can't run the script again without closing outlook from task manager as it says "the macros in the project are disabled" (closing outlook fixes this error).
I'm using Outoolk 2013!
Diane Poremsky says
I have no idea, but will ask around and see if any one knows. I wonder if its something with objects being recreated within the loop - they are closed (set to nothing) so it shouldn't be a problem - try moving Set objOL = CreateObject("Outlook.Application") above the For Each line and the Set objOL = nothing to the right before end sub.
Nik..... says
its suppporb stuff...thank you so much Diane Poremsky...it really works
gerry clough says
Yes worked fine but you'd think Microsoft would make it easier by getting their 2 email programs to talk to each other nicely instead of having to do stuff like this.
Cudos Dianne
Rusty Burke says
Can't tell you how grateful I am for this technique. My company recently assigned me a Blackberry, and I've been working literally for HOURS trying to convert my iPhone contacts into their proprietary file format. The worst hang-up was that I couldn't import my vcf into Outlook.
I created this macro, ran it, and, VOILA!, my vcf was imported beautifully. Thank you, SO MUCH.
GR O says
Dankeschön!
Sundar from India says
Thanks Diane. I tried the macro option and it worked fine in outlook for contacts exported from my Samsung Galaxy S2 phone. I have saved the macro. Cheers
Lance says
Worked great for Outlook 2013 too!
Jemes says
Thanks Diane. I was dreading the slow import of one or 20 at a time with 1700 vards to import. A great time saver.
Greg W says
Thanks
This worked great for me.
vu2major says
Dim objWSHShell As IWshRuntimeLibrary.IWshShell
I am getting "compiler error "user-defined type not defined" on above line
I am using Outlook 2010
Diane Poremsky says
Did you set the reference for the windows script library?
Go to Tools, References and select Microsoft Scripting Runtime and Windows Script Host Object Model from the list and place checks in the box next to each and click OK.
Daniel Benarosh says
thanks worked great for me!!!!
great toutorial!!
vadzen says
Thanks, but script creates duplicates instead of update existing contacts
Diane Poremsky says
Yeah, unfortunately, this method bypasses the duplicate notification. I would move the original contacts to a new folder, run the script then move the old ones back - that should trigger the warning if any are duplicates.
Dan C. says
Fantastic tool Diane - thank you so much! I'd generated 400 new contacts by importing a CSV file which worked wonderfully other than the fact that Outlook wouldn't recognize anything in the e-mail field as a valid address. Rather than open each item, I exported them all as vCards then reimported using your macro. Worked like a charm!
Diane Poremsky says
Cool. I'll have to remember this when people need to resolve the addresses.
Frank Cricchio says
Diane, Thank you very much. You now have me as a fan. Where do I go for a list of you instructional DVD.s and Books.
Frank Cricchio
Diane Poremsky says
:) Sorry, I don't have books or DVDs available right now.
Frank Cricchio says
Diane,
can the script be written to identify a destination folder?
Diane Poremsky says
possibly, but i don't have any code samples that do it.
Frank Cricchio says
Hello Diane,
I have checked each file folder in Contacts and there is nothing there. This is a new computer. Is there something I should set up?
I there a search that I could run to find them.
I am sorry to be so dumb, but at 80 yrs old, these things are difficult for me.
Note: It was fun to watch the files with the photos zip through my monitor
Diane Poremsky says
Do you have a profile configured in Outlook? That should be all that is necessary to do before running (and it should complain if it can't find a profile). I'll run it on a new test machine and see if i can figure out where they went.
Frank Cricchio says
I got the script to run and each vcard poped up one after the other... now I cannot find them in outlook... what did i do wrong? Or wherre did they go.
Frank
Diane Poremsky says
Yeah, it opens each cards and then saves it, basically the same thing you could do it manually, but it's a lot faster. :)
Go to the Contacts navigation pane and look in each Contacts folder in the list. They are supposed to be saved to the default Contacts folder. This should be the Contacts folder in your default data file (the one with the checkmark) in Account Settings, Data files. If you have more than one email account in Outlook 2010 and use a data file for each account, they could be in the Contacts folder for the account you were viewing at the time you ran the macro.
Frank Cricchio says
I get the following message:
cannot run in "break" mode
can you help me?
frank
Diane Poremsky says
Hit the Stop button in the VBA Editor to end it - its the blue square button - or the "pause" button to finish running. A screenshot of the button is in the Run the macro section at how to use the vba editor.
Zeda says
Peter's right. The vcards with spaces in the name fail. I changed the line
strVCName = "C:vcards" & fsFile.Name
in
strVCName = """C:vcards" & fsFile.Name & """"
After that it worked great. Thank you for posting.
Peter Bromley says
I beleive I've detected the reason for error: If the vcard filename has a space in it the script fails. Renaming all vCards fixed the problem though I expect someone who knows scripting could fix this problem easily
Guy Sainsbury says
I tried this method and I get an error saying "System cannot find the file". It exists - for example, if I print out the strVCName value in the Immediate Window, and paste it into a Windows Explorer window, the vcard file opens. Could security settings be preventing the code from working? Thanks, Guy
Diane Poremsky says
outlook is reading the file, not writing, so i don't think its permissions. I can't repro your error but it seems to say that the folder name or file extension is not expected.