0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Office VBA 当面不使用 2016以降に参照設定できる Office Private

Posted at

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?