VBAは外部のライブラリを参照する事によって、そのアプリケーションには無い機能を利用することができます。今回はExcelでOutlook連絡先のアドレス帳データを取得するコードを紹介します。マクロ初心者の人にもわかるように全ての作業を図説しています。エクセルに連絡先を出力したい人は是非トライしてみてください。
出力するデータは個別に選択できます。紹介するサンプルはアドレス帳(宛先名やメールアドレス)を取得してエクセルシートに出力します。
連絡先のアドレス帳を取得するマクロ
公式リファレンスにあるコードを参考にしています。変更点は以下の通りです。
- ハイパーリンクは不要なので削除
- 出力の条件分岐も不要なので削除
- シートの指定をシート名からオブジェクト名に変更
- フィールド名とフィールドの指定以外はコードを書き換えなくてもいいようにする
- データを配列に格納してまとめて出力する(処理時間短縮)
- アドレス帳と同じデータを出力する
4番目は、例えば出力するデータ項目を増やす場合、基コードの.Cells(1, 6).Value = “Email”とCells(lnContactCount, 6).Value = .Email1Addressをコピペしてフィールド名とプロパティ名を新たに指定、6を7に変更する、といった作業が必要になります。
この作業をまるっと無くすのが目的です。
アドレス帳取得コード
6ステップで完了です。数分で完了します。
事前準備としてマクロの実行ができるように開発タブを表示して下さい。
ファイル→オプション→リボンのユーザー設定で開発のチェックボックスをオンにします。(画像クリックで拡大)
開発タブでVisual BasicアイコンをクリックするとVBE(VisualBasicEditor)が表示されます。
ショートカットはAlt+F11です。
VBEメニューの挿入から標準モジュールをクリックします。これでコードを貼り付ける準備は完了です。
プロジェクトウィンドウ内のSheet1(Sheet1)をクリックし、下に現れるプロパティウインドウ内の(オブジェクト名)をSheet1からwsアドレスに変更してください。
最初にクリックした場所がwsアドレス(Sheet1)に変更されれば成功です。
プロジェクトウィンドウ内のModule1をダブルクリックし、下のコードをコピペして下さい。
コードのコピーはコード右上にコピーボタンがあります。
※画像は皆さんの画面と色が違いますが気にしないで下さい。
Public Sub アドレス帳インポート()
Dim アウトルック As Object, 名前空間 As Object, フォルダ As Object, 連絡先 As Object, r As Object
Dim フィールド名 As Variant, アドレス帳() As Variant
Dim フィールド数 As Long, フィールド行 As Long, i As Long, k As Long
Application.ScreenUpdating = False
Set アウトルック = CreateObject("Outlook.Application")
With wsアドレス 'ワークシートのオブジェクト名を変更して下さい
.Range("A1").CurrentRegion.Clear
フィールド名 = Array("名前", "表示名", "電子メールアドレス") '好きなフィールド名に書き換え
For i = 0 To UBound(フィールド名)
.Cells(1, i + 1).Value = フィールド名(i)
Next i
フィールド数 = UBound(フィールド名) + 1
With .Range("A1").Resize(1, フィールド数)
.Font.Bold = True
.Font.ColorIndex = 10
.Font.Size = 11
End With
Set 名前空間 = アウトルック.GetNamespace("MAPI")
Set フォルダ = 名前空間.GetDefaultFolder(10)
Set 連絡先 = フォルダ.Items
フィールド行 = 0
ReDim アドレス帳データ(フォルダ.Items.Count, フィールド数)
For Each r In 連絡先
With r
アドレス帳 = Array(.Subject, .Email1DisplayName, .Email1Address) 'ContactItemプロパティ
End With
If TypeName(r) = "ContactItem" Then
For k = 0 To UBound(アドレス帳)
アドレス帳データ(フィールド行, k) = アドレス帳(k)
Next k
フィールド行 = フィールド行 + 1
End If
Next r
.Range("A2").Resize(フォルダ.Items.Count, フィールド数) = アドレス帳データ
Set r = Nothing
Set 連絡先 = Nothing
Set フォルダ = Nothing
Set 名前空間 = Nothing
Set アウトルック = Nothing
.Range("A2", .Cells(2, フィールド数).End(xlDown)).Sort key1:=.Range("A2"), order1:=xlAscending
.Range(.Columns(1), .Columns(フィールド数)).EntireColumn.AutoFit
End With
Application.ScreenUpdating = True
MsgBox "アドレス帳をインポートしました", vbInformation
End Sub
開発タブでマクロアイコンをクリックし、ダイアログ内のアドレス帳インポートを実行すれば完了です。
マクロのショートカットはAlt+F8です。
このコードはアドレス帳と同じフィールドを出力します。出力するフィールドを変更したい場合は以下の箇所を変更してください。
- フィールド名…11行目の” “内(デフォルトは名前,表示名,電子メールアドレス)
- フィールドのプロパティ名…32行目(デフォルトは.Subject, .Email1DisplayName, .Email1Address)
32行目のContactItemプロパティ名は記事の最後に一覧表を作成しているのでそこから探してください。
既知の不具合
フィールド名数 < フィールド数だとエラーが出ます。フィールド名数とフィールド数は合わせて下さい。アドレス帳が空の場合もエラーが出ます。アドレス帳に1件以上データがある状態でマクロを実行して下さい。
ContactItemオブジェクトのプロパティ名一覧
出力するフィールドを変更したい場合、一覧から目的のプロパティ名を探してください。フィールド名は任意ですが、プロパティ名は間違えるとエラーが出ます。
連絡先でよく使うフィールドとそのプロパティ名
名前関連
フィールド名 | プロパティ名 |
---|---|
姓 | LastName |
名 | FirstName |
勤務先 | CompanyName |
フリガナ(姓) | YomiLastName |
フリガナ(名) | YomiFirstName |
フリガナ(勤務先名) | YomiCompanyName |
部署 | Department |
役職 | JobTitle |
表題 | FileAs |
インターネット
フィールド名 | プロパティ名 |
---|---|
メール | Email1Address |
電子メール 表示名 | Email1DisplayName |
Webページ | WebPage |
IMアドレス | IMAddress |
電話
フィールド名 | プロパティ名 |
---|---|
秘書の電話 | AssistantTelephoneNumber |
勤務先電話 | BusinessTelephoneNumber |
勤務先電話2 | Business2TelephoneNumber |
勤務先 FAX | BusinessFaxNumber |
コールバック | CallbackTelephoneNumber |
自動車電話 | CarTelephoneNumber |
勤務先代表電話 | CompanyMainTelephoneNumber |
自宅電話 | HomeTelephoneNumber |
自宅電話 2 | Home2TelephoneNumber |
自宅 FAX | HomeFaxNumber |
ISDN | ISDNNumber |
携帯電話 | MobileTelephoneNumber |
その他の FAX | OtherFaxNumber |
その他の電話 | OtherTelephoneNumber |
ポケットベル | PagerNumber |
通常の電話 | PrimaryTelephoneNumber |
無線電話 | RadioTelephoneNumber |
テレックス | TelexNumber |
TTY/TDD | TTYTDDTelephoneNumber |
住所
フィールド名 | プロパティ名 |
---|---|
郵便番号(勤務先) | BusinessAddressPostalCode |
都道府県(勤務先) | BusinessAddressState |
市区町村(勤務先) | BusinessAddressCity |
番地(勤務先) | BusinessAddressStreet |
国/地域(勤務先) | BusinessAddressCountry |
郵便番号(自宅) | HomeAddressPostalCode |
都道府県(自宅) | HomeAddressState |
市区町村(自宅) | HomeAddressCity |
番地(自宅) | HomeAddressStreet |
国/地域(自宅) | HomeAddressCountry |
郵便番号(その他) | OtherAddressPostalCode |
都道府県(その他) | OtherAddressState |
市区町村(その他) | OtherAddressCity |
番地(その他) | OtherAddressStreet |
国/地域(その他) | OtherAddressCountry |
郵便番号(郵送先) | MailingAddressPostalCode |
都道府県(郵送先) | MailingAddressState |
市区町村(郵送先) | MailingAddressCity |
番地(郵送先) | MailingAddressStreet |
国/地域(郵送先) | MailingAddressCountry |
その他
フィールド名 | プロパティ名 |
---|---|
事業所 | OfficeLocation |
職業 | Profession |
上司 | ManagerName |
秘書 | AssistantName |
ニックネーム | NickName |
敬称(Dr,Mrs) | Title |
敬称(殿,様) | Suffix |
配偶者/パートナー | Spouse |
誕生日 | Birthday |
記念日 | Anniversary |
連結して値を返すプロパティ名
各フィールドを連結して値を返すプロパティもいくつか存在します。連絡先の表題に用意されているパターンもこれらのプロパティを使用しているのでしょう。
次のサンプルを例に表にしました。
- 姓
煉獄(英字:Rengoku)
- 名
杏寿郎(英字:Kyoujyurou)
- 勤務先
鬼殺隊(英字:Demon Slayer)
- 敬称
殿(英字:Dr.)
名前関連
連結するフィールド名 | プロパティ名 | サンプルの表示結果 |
---|---|---|
姓,名 | LastFirstNoSpace | 煉獄杏寿郎 |
姓 [ ] 名 | LastFirstSpaceOnly | 煉獄 杏寿郎 |
姓,名 [ ] 敬称 | LastFirstNoSpaceAndSuffix | 煉獄杏寿郎 殿 |
姓,名 [↓] 勤務先 | LastFirstNoSpaceCompany | 煉獄 杏寿郎 鬼殺隊 |
姓 [ ] 名 [↓] 勤務先 | LastFirstSpaceOnlyCompany | 煉獄 杏寿郎 鬼殺隊 |
勤務先 [↓] 姓,名 | CompanyLastFirstNoSpace | 鬼殺隊 煉獄杏寿郎 |
勤務先 [ ] 姓[↓]名 | CompanyLastFirstSpaceOnly | 鬼殺隊 煉獄 杏寿郎 |
英字の名前や英字の敬称(Dr,Mrs)を付与している場合、以下のプロパティを使用します。
連結するフィールド名 | プロパティ名 | サンプルの表示結果 |
---|---|---|
英字敬称 [ ] 名 [ ] 姓 [ ] | FullName ※ | Dr. Kyoujyurou Rengoku |
姓 [ ] 名(英字) | LastNameAndFirstName | Rengoku, Kyoujyurou |
姓 [ ] 名 [↓] 勤務先(英字) | FullNameAndCompany | Rengoku, Kyoujyurou Demon Slayer |
勤務先 [↓] 姓 [ ] 名(英字) | CompanyAndFullName | Demon Slayer Rengoku, Kyoujyurou |
※FullNameは日本語でも値を返します。英字の敬称(Dr,Mrs)を付与していなければ、結果は「 姓 [ ] 名 [ ] 敬称 」になるのでLastFirstNoSpaceAndSuffix「姓名 [ ] 敬称」とは空白1個分の違いがあります。
住所関連
住所のフィールドを連結するプロパティ もあります。
連結するフィールド名 | プロパティ名 |
---|---|
勤務先:郵便番号 [↓] 都道府県,市区町村,番地 | BusinessAddress |
自宅: ↑ | HomeAddress |
その他: ↑ | OtherAddress |
郵送先: ↑ | MailingAddress |
アドレス帳の[名前]
フィールド名 | プロパティ名 |
---|---|
アドレス帳の[名前]と同じもの | Subject |
アドレス帳の名前欄は、これまでに紹介したプロパティでは表示できません。仕様は「日本語だと姓,名,敬称、英字だと名,姓(敬称抜き)」みたいな感じです(多分)。紹介したコードもこのプロパティを使用しています。
Outlookを起動せずにPDFファイルをメール添付・送信するマクロも別記事で紹介しています。よかったらご覧下さい。