Library OfficePrivate
C:\Program Files\WindowsApps\Microsoft.Office.Desktop_16XXX.XXXXX.XXXXX.X_x86__規則性のある乱数\VFS\ProgramFilesCommonX86\Microsoft Shared\OFFICE16\MSOPRIV.DLL
Microsoft Office.NET Private Object Library
Class Hailstorm
OfficePrivate のメンバー
Hail storm 雹の意味
名前では見つからないのでDLL名から検索すると、
Microsoft Office.NET Private object Library
が本当の名前らしい。
日本語以外の言語でExcel,Word,AccessかOutlook使用時に参照する?
ネットで検索すると日本語以外の言語圏域でAccess2013のaccdbファイルをAccess2010で開いたときにエラーメッセージが表示される。
これを参照設定から外すとWordかOutlookとの連携がうまくいかなくなるようだ。
http://veroniquefrizzell.com/more-automation/
これがOutlookとまたは、もしくはMSOPRIV.DLLを参照設定しろとある
参照設定をするのにCreateObjectを使用しておりややこしい。
GALを使っているので、このOutllokとExcelは法人用のものだ
Excelを起動し、
次のマクロをセットして
A1に登録されている名前を入れる
ここで重要なのは姓名の間にスペースを入れないこと
また法人の株式会社表示、名前に連続して所属が表示されている場合、それを削って比較しないと合致しない。
なので実際はGalや連絡先の登録の仕方によって、文字列のスペースを削るなどもっと調整が必要。
合致すると第一番目のメールアドレスが、3列目に入る。
あと個人的なこだわりになるのかもしれないが、
- 参照設定したので、コードを統一。 CreateObjectを使わない(ただし完成したら遅延バインディングしてもよい)
- OutlookとExcelのどのオブジェクトか明示。参照設定をはずしたら Outlook. で置換して削る。
- Defaultfolderを取得(エラー時にアカウントを確認するなどバグの時に使う)
Sub test()
'For Excel
Dim olApp As Outlook.Application: Set olApp = New Outlook.Application
Dim NS As Outlook.Namespace: Set NS = olApp.GetNamespace("mapi")
Dim olDfolder As Outlook.Folder: Set olDfolder = NS.GetDefaultFolder(Outlook.olFolderContacts)
Dim myCItem As Outlook.ContactItem
Dim olAddLst As Outlook.AddressList, olAddLsts As Outlook.AddressLists
Dim olAddEns As Outlook.AddressEntries, olAddEn As Outlook.AddressEntry
Dim wb as Excel.Workbook, Set wb = Thisworkbook
Dim c As Excel.Range, r As Excel.Range, AddressName As String
Dim exchangeUser As Outlook.exchangeUser
Dim i As Long
i = Cells(Rows.Count, 1).End(xlUp).Row + 1
'Set olAddLsts = NS.AddressLists
'Set olAddLst = NS.AddressLists.Item("Gloabal Address Lists")
Set olAddLst = NS.GetGlobalAddressList
Set r = Range(Cells(1, 1), Cells(i, 1))
For Each c In r
AddressName = Trim(c.Value)
Set olAddEns = olAddLst.AddressEntries
For Each olAddEn In olAddEns
If olAddEn.Name = AddressName Then
Set exchangeUser = olAddEn.GetExchangeUser
c.Offset(0, 2).Value = exchangeUser.PrimarySmtpAddress
Set exchangeUser = Nothing
Exit For
End If
Next
Next c
End Sub
しかしこのコードでも、Office Privateは必要がない。
いったい何なのか。
https://www.ka-net.org/blog/?p=11788
おそらくこれが同趣旨のはずだが、やはり参照設定していない。
とりあえず、参照設定して使うサンプルがないこと、当方でも過去に使用実績がないこと、海外の情報を検索すると、参照設定していると互換性でトラブルが起きる例しかないので、当面はこの参照設定は使わないことにした。
https://outlooklab.wordpress.com/2016/06/25/%E9%80%A3%E7%B5%A1%E5%85%88%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E3%81%AE%E9%83%A8%E7%BD%B2%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/
なお、ここでメールアドレスをまたGALからメールアドレスをとるようなことをしているが、実際はほかの情報が取得できる(肩書とか)。しかし住所録(連絡先)に登録すると、GALと切れてしまうため、再び取得するにはアドレスや名前をキーにしてGALから取得しなければならない。
こういうGAL(グローバルアドレスリスト)を検索するVBAが海外を含めて存在する理由はこうした背景があるわけです。
参考サイト
namespace.getglobaladdresslist
https://docs.microsoft.com/ja-jp/office/vba/api/outlook.namespace.getglobaladdresslist