私はVBAを初めて使用し、自動化されたWord文書を機能させようとしています。現時点では、ドキュメントにボタンがあり、押すと、ドキュメントが添付された電子メールが送信されます。
ただし、メールを送信している現在のユーザーのメールアドレスも取得する必要があるため、送信する前にドキュメント内に配置できます。インターネットで検索しても、私の状況に合った使用可能なコードは見つかりませんでした。私の現在のコードは以下の通りです。
Set OL = CreateObject("Outlook.Application")
Set EmailItem = OL.CreateItem(olMailItem)
Set Doc = ActiveDocument
Doc.Save
With EmailItem
.Subject = "Requesting Authorization Use Overtime"
.Body = "Please review the following request for overtime" & vbCrLf & _
"" & vbCrLf & _
"Thanks"
.To = "[email protected]"
.Importance = olImportanceNormal
.Attachments.Add Doc.FullName
.Send
End With
これが関連するかどうかはわかりませんが、ドキュメントが使用されているときは、ユーザーがサインインした状態でOutlookアプリケーションが常に開かれます。このような状況でインテリセンスヘルプを使用することに慣れているので、メソッドやプロパティをいじくり回すことができます。インテリセンスからの助けはほとんどないようです。
通常、電子メールアドレスはOutlookメールフォルダに割り当てられた名前です。
だからこれを試してみてください:
'~~> add these lines to your code
Dim olNS As Outlook.NameSpace
Dim olFol AS Outlook.Folder
Set olNS = OL.GetNamespace("MAPI")
Set olFol = olNS.GetDefaultFolder(olFolderInbox)
MsgBox olFol.Parent.Name '~~> most cases contains the email address
これは、オブジェクト参照が適切に設定された状態でEarly Bindを使用していることを前提としています。
このような情報にアクセスする別の方法は、名前空間プロパティを直接使用することです。
MsgBox olNS.Accounts.Item(1).DisplayName '~~> usually email address
MsgBox olNS.Accounts.Item(1).SmtpAddress '~~> email address
MsgBox olNS.Accounts.Item(1).UserName '~~> displays the user name
上記のいずれかが何らかの形で役立つことを願っています。
それはすべて「現在のユーザーアドレス」の定義に依存します。
Appication.Session.CurrentUser
_から取得できます(Recipient
オブジェクトを返します)。 _Recipient.Address
_プロパティを使用します。ただし、Exchangeアカウント(_Recipient.AddressEntry.Type == "EX"
_)の場合は、EXタイプのアドレスを受け取ることに注意してください。 SMTPアドレスを取得するには、Recipient.AddressEntry.GetExchangeUser().PrimarySmtpAddress
を使用します。エラーが発生した場合にnull /例外を処理できるように準備してください。これは、特定のケースで最も必要になる可能性が高いものです。拡張MAPIレベル(C++またはDelphi)では、_IMAPISession::QueryIdentity
_を使用します( OutlookSpy --IMAPISessionボタンをクリックしてからQueryIdentityをクリックします)。次に、_PR_ADDRTYPE
_プロパティ( "EX" vs "SMTP")および_PR_EMAIL_ADDRESS
_(_PR_ADDRTYPE
_ = "SMTP"の場合)または(Exchangeの場合)_PR_SMTP_ADDRESS
_を読み取ることができます。 (存在することが保証されていません)および_PR_EMS_AB_PROXY_ADDRESSES
_(複数値のプロパティは、すべてのプロキシ(エイリアス)アドレスを含むアドレスを交換します)。
プロファイルに複数のアカウントがある場合、複数のアカウントを介して電子メールを送受信できます。その場合は_MailItem.SendUsingAccount
_を使用します(Account
オブジェクトを返します。nullの場合もあります。その場合は_Application.Session.CurentUser
_を使用してください)。これは、受信、送信、または作成中の電子メール(_Application.ActiveInspector.CurrentItem
_または_Application.ActiveExplorer.ActiveInlineResponse
_)の両方に有効です。
特定のプロファイル内のすべてのアカウントには、_Namespace.Accounts
_コレクション_(Application.Session.Accounts
_)を使用してアクセスできます。アカウントのアドレスには、_Account.SmtpAddress
_プロパティを使用してアクセスできます。 Outlookオブジェクトモデルはメールアカウントのみを公開することに注意してください。一部のストアアカウント(PSTなど)は、他のアカウント(POP3/SMTPなど)がそのストアに配信できる場合でも、固有のユーザーIDを持たないため、コレクションに含まれていません。すべてのアカウントにアクセスする場合は、 Redemption とその RDOSession 。Accountsコレクション( RDOAccounts オブジェクト)を使用できます。
拡張MAPIレベルでは、アカウントは IOlkAccountManager インターフェイスを介して公開されます。 IOlkAccountManagerボタンをクリックすると、 OutlookSpy で遊ぶことができます。
PR_MAILBOX_OWNER_ENTRYID
_プロパティはオンラインストアによってのみ公開され、キャッシュされたストアでは使用できないことに注意してください)。 ExchangeストアのエントリIDを解析し、そこからEXタイプのアドレスを抽出できます。次に、EXアドレスを指定してGALオブジェクトエントリIDを作成できます。 Redemption とその RDOExchangeMailboxStore オブジェクトを使用してストア所有者にアクセスすることもできます。およびそのOwner
プロパティ。この回答は遅延バインディング用であるため、参照ライブラリを用意する必要はありません。次のコードをモジュールに配置します。
Dim OL As Object, olAllUsers As Object, oExchUser As Object, oentry As Object, myitem As Object
Dim User As String
Set OL = CreateObject("Outlook.application")
Set olAllUsers = OL.Session.AddressLists.Item("All Users").AddressEntries
User = OL.Session.CurrentUser.Name
Set oentry = olAllUsers.Item(User)
Set oExchUser = oentry.GetExchangeUser()
msgbox oExchUser.PrimarySmtpAddress