Outlook 研究所

2016年8月20日

メール本文のテキストのみをコピーするマクロ

コメントにて以下のご相談をいただきました。


初めての訪問です。ご相談があって書き込みをさせていただきます。
実は、Outlookで受信したメールの本文に含まれる「氏名」をコピペして、FileMakerで構築したDBを検索すると、以前はヒットしていたものが、2016以降、ヒットしなくなりました。
同じメールをGmailやWindows10のメールで受信して同じことをやると以前のようにヒットしますので、Outlook2016の問題ではないかと睨んでいます。
ところが、試しに本文中の「氏名」を件名にコピペして、さらにそれをコピペすると、FileMakerでの検索がヒットします。
つまり、ヒットしないのは、「本文中にある氏名」をコピペした場合のみです。
メール設定をいろいろと試してみましたし、「本文中にある氏名」をペーストする際にプレーンテキストとして貼り付けたりもしてみましたが、どうしてもうまくいきません。
日常業務に支障が出始めておりますが、今のところ原因・解決のめどがまったく立っておらず、こうして藁をもすがる思いで書き込みをさせていただきました。
もし、何かヒントでもございましたら、ぜひ、ご教示いただけないでしょうか。
よろしくお願いいたします。



一度件名にコピー&ペーストしてからさらにコピー&ペーストで発生しないとなると、Outlook の本文からのコピーの際にテキスト情報以外のものが含まれることで、検索に影響が発生している可能性が考えられます。
Windows でコピー&ペーストを行うと、内部的には以下のような動作が行われます。

  1. コピー元のアプリケーションからコピー先のアプリケーションに転送できるデータの形式を通知する
  2. コピー先のアプリケーションが取得できる最適な形式を指定してコピー元のアプリケーションからデータを受け取る

例えば、Outlook の HTML メールの本文をコピー&ペーストする場合、コピー先のアプリケーションにはデータ形式としてプレーン テキストと HTML テキストが通知されます。
そして、例えば受け取る側がメモ帳ならプレーン テキストが選択されて単なる文字列がコピーされ、Word なら HTML テキストが選択されて HTML タグを含んだ文字列がコピーされます。
おそらくは FileMaker がペーストした際にプレーン テキストではないデータを要求することで現象が発生しているのではないかと推測しますが、私の手元に FileMaker がないため、実際にそのような動作なのかはちょっと確認できません。

そこで、Outlook で選択した本文のプレーン テキストのみをコピーするというマクロを作ってみました。
このマクロを使用するには、まず以下の手順で Microsoft Forms 2.0 というライブラリを参照設定として追加します。

  1. Visual Basic Editor で [ツール]-[参照設定] をクリックします。
  2. [参照] をクリックします。
  3. 以下のいずれかの DLL を選択し、[開く] をクリックします。
    C:\Windows\System32\FM20.DLL
    C:\Windows\SysWOW64\FM20.DLL
  4. [OK] をクリックします。

そして、以下のマクロを定義し、本文のテキストのみをコピーしたいときにはこのマクロを実行します。
こちらで現象が回避できるか試してみてください。

' ここをトリプルクリックでマクロ全体を選択できます。
Public Sub CopyTextOnly()
    Dim dataObject As New MSForms.dataObject
    dataObject.SetText ActiveInspector.WordEditor.Application.Selection
    dataObject.PutInClipboard
End Sub

マクロの登録方法やメニューへの追加について

2016年8月13日

Outlook 2016/2013/2010/2007 のセキュリティ修正プログラム MS16-099 がリリース

Filed under: 修正プログラム — outlooklab @ 12:00 PM

8/9 に Office 2016、Office 2013、Office 2010 および Office 2007 のセキュリティ修正プログラムがリリースされました。
Outlook も 2016、2013、2010、2007 でセキュリティ修正がリリースされています。
また Word や Office コンポーネントのセキュリティ修正には、Outlook のセキュリティ関連ではない修正も含まれています。
以下は各製品のそれぞれの KB へのリンクです。

Office 2016

Outlook 2016 のセキュリティ修正

MS16-099: Description of the security update for Outlook 2016: August 9, 2016
12 件のセキュリティ関連ではない不具合修正も行われています。

Office 2016 共通コンポーネントのセキュリティ修正

MS16-099: Description of the security update for Office 2016: August 9, 2016
1 件の Outlook 関連の不具合修正が行われています。

Word 2016 のセキュリティ修正

MS16-099: Description of the security update for Word 2016: August 9, 2016
1 件の Outlook 関連の不具合修正が行われています。

Office 2013

Outlook 2013 のセキュリティ修正

MS16-099: Description of the security update for Outlook 2013: August 9, 2016
15 件のセキュリティ関連ではない不具合修正も行われています。

Office 2013 共通コンポーネントのセキュリティ修正

MS16-099: Description of the security update for Office 2013: August 9, 2016
1 件の Outlook 関連の不具合修正が行われています。

Office 2010

Outlook 2010 のセキュリティ修正

MS16-099: Description of the security update for Outlook 2010: August 9, 2016
1 件のセキュリティ関連ではない不具合修正も行われています。

Outlook 2007 のセキュリティ修正

MS16-099: Description of the security update for Outlook 2017: August 9, 2016
セキュリティ修正のみが行われています。

2016年8月6日

メールを読んだ際に自動的に返信するマクロ

コメントにて以下のご要望をいただきました。


お世話になります。
指定した相手から届いたメールを読んだ際にメールを読んだ事を相手に自動的に返信する様な機能をマクロで実現出来ないでしょうか?
バージョンはoutlook2016です。



このような処理を行う場合、以下の処理が必要になります。

  • メールを受信時に指定した相手からのメールであれば返信が必要という意味のカスタム プロパティを設定する。
  • メールを開いた際に、返信が必要というプロパティが設定されていれば自動的に返信する。

これを実装したマクロは以下のようになります。

' ここをトリプルクリックでマクロ全体を選択できます。
Dim WithEvents mInspectors As Inspectors
'
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    On Error Resume Next
    Dim arrSender As Variant
    Dim oneSender As Variant
    Dim objMail 'As MailItem
    ' 返信が必要な差出人を , で区切って指定
    arrSender = Array("user1@example.com", "user2@example.com", "mchiba@jpoffolk.local")
    Set mInspectors = Application.Inspectors
    Set objMail = Session.GetItemFromID(EntryIDCollection)
    For Each oneSender In arrSender
        If objMail.SenderEmailAddress = oneSender Then
            ' 差出人が一致したらカスタム プロパティを設定
            Dim userProp As UserProperty
            Set userProp = objMail.UserProperties.Add("NeedReadReply", olText)
            userProp.Value = "Yes"
            objMail.Save
        End If
    Next
End Sub
'
Private Sub mInspectors_NewInspector(ByVal Inspector As Inspector)
    Dim objMail As MailItem
    Dim userProp As UserProperty
    Set objMail = Inspector.CurrentItem
    ' 開いたメールのカスタム プロパティを確認
    Set userProp = objMail.UserProperties.Find("NeedReadReply")
    If Not userProp Is Nothing Then
        ' 返信が必要なら開封済みのメッセージを送信
        If userProp.Value = "Yes" Then
            Dim objReply As MailItem
            Set objReply = objMail.Reply
            objReply.Body = "以下のメールを開封しました。" & vbCrLf & _
                "送信日時:" & objMail.SentOn & vbCrLf & "件名:" & objMail.Subject
            objReply.Send
            ' カスタム プロパティに返信済みと設定
            userProp.Value = "Done"
            objMail.Save
        End If
    End If
End Sub

マクロの登録方法やメニューへの追加について

2016年7月30日

受信メールの宛先やCcをアドレス帳の名前に置き換えるマクロ

コメントにて以下のご要望をいただきました。


初めまして。
windows10でoutlook2013を使用しています。
相手からのメールを受け取った際に、複数に送られている宛先がアドレスのみで表示されているのを
アドレス帳の名前で分かるようにしたいのですが、マクロで出来ますか?
よろしくお願い致します。



以下のようなマクロで実現できます。

' ここをトリプルクリックでマクロ全体を選択できます。
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    On Error Resume Next
    Dim objItem 'As MailItem
    Dim objRec As Recipient
    Dim recType As OlMailRecipientType
    Dim fldContacts As Folder
    Dim objContact As ContactItem
    Dim strAddress As String
    Dim strContact As String
    Dim cRec As Integer
    Dim i As Integer
    ' 受信メールを取得
    Set objItem = Session.GetItemFromID(EntryIDCollection)
    ' 連絡先フォルダーを取得
    Set objContacts = Session.GetDefaultFolder(olFolderContacts)
    ' 受信時の受信者数を取得
    cRec = objItem.Recipients.Count
    For i = 1 To cRec
        ' 受信者オブジェクトを取得
        Set objRec = objItem.Recipients(i)
        strAddress = objRec.Address
        ' アドレスにより連絡先フォルダーを検索
        Set objContact = objContacts.Items.Find("[Email1Address] = '" & strAddress _
            & "' or [Email2Address] = '" & strAddress _
            & "' or [Email3Address] = '" & strAddress & "'")
        If Not objContact Is Nothing Then
            ' 連絡先アイテムが見つかったらアドレスに対応する表示名を取得
            With objContact
                If .Email1Address = strAddress Then
                    strContact = .Email1DisplayName
                End If
                If .Email2Address = strAddress Then
                    strContact = .Email2DisplayName
                End If
                If .Email3Address = strAddress Then
                    strContact = .Email3DisplayName
                End If
            End With
            If InStr(strContact, strAddress) = 0 Then
                ' 表示名にアドレスが含まれていなければ追加
                strContact = strContact & "<" & strAddress & ">"
            End If
        Else
            ' 連絡先アイテムが見つからなければ元の表示名のまま追加
            If InStr(objRec.Name, objRec.Address) = 0 Then
                ' 表示名にアドレスが含まれていなければ追加
                strContact = objRec.Name & "<" & strAddress & ">"
            Else
                strContact = objRec.Name
            End If
        End If
        ' To か Cc かを保存しておく
        recType = objRec.Type
        ' 解決した名前で追加
        Set objRec = objItem.Recipients.Add(strContact)
        objRec.Type = recType
        objRec.Resolve
    Next
    ' 元の受信者は削除
    For i = cRec To 1 Step -1
        objItem.Recipients(i).Delete
    Next
    objItem.Save
End Sub

マクロの登録方法やメニューへの追加について

2016年7月23日

フォルダーに含まれるメールをすべてテキスト形式に変換するマクロ

コメントにて以下のご要望をいただきました。


初めまして、お世話になります。
日常的にoutlookを使用しており、メールフォルダが20GBを超える状態です。
添付ファイルはこちらのマクロで、一括削除を行う方法を知り、ずいぶん整理が進みました。
マクロ制作のお願いですが、授受しているメールが、HTMLか、リッチテキスト形式なのですが、
その受信メールをフォルダごと、テキストへ変換するマクロがあると、とても助かります。
よろしくご検討願います。



MailItem の BodyFormat プロパティには本文形式が格納されているのですが、このプロパティにテキスト形式を意味する olFormatPlain を設定して保存すると、本文形式をテキストに変換することができます。
表示中のフォルダーに含まれるメールをすべてテキスト形式にするマクロは以下のようになります。

' ここをトリプルクリックでマクロ全体を選択できます。
Public Sub ConvertToText()
    Dim fldCurrent As Folder
    Dim objItem As MailItem
    ' 現在表示中のフォルダーを取得
    Set fldCurrent = ActiveExplorer.CurrentFolder
    ' フォルダーのすべてのアイテムをチェック
    For Each objItem In fldCurrent.Items
        ' 本文形式を確認
        If objItem.BodyFormat <> olFormatPlain Then
            ' テキスト形式でなければ、テキスト形式にして保存
            objItem.BodyFormat = olFormatPlain
            objItem.Save
        End If
    Next
End Sub

マクロの登録方法やメニューへの追加について

2016年7月16日

Outlook 2016/2013/2010 のセキュリティ修正プログラム MS16-088 がリリース

Filed under: 修正プログラム — outlooklab @ 12:00 PM

7/13 に Office 2016、Office 2013、Office 2010 および Office 2007 のセキュリティ修正プログラムがリリースされました。
Outlook 自体は 2016、2013、2010 でセキュリティ修正がリリースされています。
また Word 2016、2013 のセキュリティ修正には、Outlook のセキュリティ関連ではない修正も含まれています。
以下は各製品のそれぞれの KB へのリンクです。

Office 2016

Outlook 2016 のセキュリティ修正

2016 の Outlook のセキュリティ更新プログラム MS16-088: 説明: 2016 年 7 月 12 日
7 件のセキュリティ関連ではない不具合修正も行われています。

Word 2016 のセキュリティ修正

MS16-088: Description of the security update for Word 2016: July 12, 2016
5 件の Outlook 関連の不具合修正が行われています。

Office 2013

Outlook 2013 のセキュリティ修正

MS16-088: Description of the security update for Outlook 2013: July 12, 2016
5 件のセキュリティ関連ではない不具合修正も行われています。

Word 2013 のセキュリティ修正

Word 2013 のセキュリティ更新プログラム MS16-088: 説明: 2016 年 7 月 12 日
1 件の Outlook 関連の不具合修正が行われています。

Office 2010

Outlook 2010 のセキュリティ修正

MS16-088: Description of the security update for Outlook 2010: July 12, 2016
セキュリティ修正のみが行われています。

2016年7月9日

入力した文字列で検索し、見つかったアイテムをその文字列の名前のフォルダーに移動するマクロ

コメントにて以下のご要望をいただきました。


Outlook2010で受信トレイを開いた状態で特定文字を入力を促すボックスを表示、入力した特定文字でOutlookのフォルダを作成した上でその文字を含むメールをコピーする
例えば、マクロを起動すれば入力を促すボックスが現れ、
①「検索文字を入力してください」
② 「五月晴れ」と入力
③ Outlookのフォルダに受信トレイ-「五月晴れ」とフォルダが作成される。
④ 受信トレイの本文に「五月晴れ」という文字を含んだメールが「五月晴れ」フォルダにコピーされる。
ようなマクロを探してますが見つかりません。
作成していただければ幸いです。


以下のようなマクロで実現できます。

' ここをトリプルクリックでマクロ全体を選択できます。
Public Sub FindAndMoveByKeyword()
    On Error Resume Next
    Dim strKeyword As String
    Dim fldCurrent As Folder
    Dim fldMoveTo As Folder
    Dim i As Integer
    ' 検索文字列の入力
    strKeyword = InputBox("検索文字を入力してください")
    ' 検索文字列が入力されたら検索
    If strKeyword <> "" Then
        ' 表示中のフォルダーを取得
        Set fldCurrent = ActiveExplorer.CurrentFolder
        ' 表示中のフォルダーの下の検索文字列と同じ名前のフォルダーを取得
        Set fldMoveTo = fldCurrent.Folders(strKeyword)
        If fldMoveTo Is Nothing Then
            ' フォルダーがなければ作成
            Set fldMoveTo = fldCurrent.Folders.Add(strKeyword)
        End If
        ' 現在のフォルダーのアイテムを一つずつ確認
        For i = fldCurrent.Items.Count To 1 Step -1
            With fldCurrent.Items(i)
                ' 本文に検索文字列が含まれていたら移動
                If .Body Like "*" & strKeyword & "*" Then
                    .Move fldMoveTo
                End If
            End With
        Next
    End If
End Sub

マクロの登録方法やメニューへの追加について

2016年7月2日

自動仕分けの条件にない条件で処理を実行するマクロ

コメントにて以下のご要望をいただきました。


用意されている仕分けルールでは望んだ仕分けができない場合、
マクロ機能を使って自動仕分けウィザードに新たなルールを挿入する
方法はあるでしょうか?

希望するルール

宛先が[名前]の場合、指定したフォルダに移動する

outlook2010では、宛先またはCCが[名前]の場合、指定したフォルダに移動する
というルールしか用意されておらず、宛先ではなくCCで送った人のフォルダに
メールが仕分けられてしまい困っています。


Outlookの標準機能で様々な条件でメールの自動仕分けができます
が「宛先またはCCに自分の名前がある場合」という条件を付けられ
ますが「宛先に自分の名前がありCCに特定のアドレスがある場合」
というような条件を付ける事ができません。
マクロを使って任意の仕分け条件を作る事は可能でしょうか?



Outlook の標準の自動仕分けにないルールで処理を実行したい場合、メールの受信時にマクロを実行し、そのマクロの中で条件をチェックして処理を実行します。
メールの受信時にマクロを実行するには、Application_NewMailEx を使用します。
例えば、To に usera@example.com、Cc に userb@example.com がある場合に、受信トレイの下の Sample フォルダーにメールを移動するというような場合は、以下のようなマクロで実現できます。

' ここをトリプルクリックでマクロ全体を選択できます。
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    Const TO_ADDRESS = "usera@example.com"
    Const CC_ADDRESS = "userb@example.com"
    Const MOVE_FOLDER = "sample"
    Dim objMsg
    Dim objRecip As Recipient
    Dim bToFound As Boolean
    Dim bCcFound As Boolean
    ' 受信メッセージの取得
    Set objMsg = Session.GetItemFromID(EntryIDCollection)
    bToFound = False
    bCcFound = False
    ' 受信者の確認
    For Each objRecip In objMsg.Recipients
        ' 宛先に指定されているアドレスのチェック
        If objRecip.Type = olTo And objRecip.Address = TO_ADDRESS Then
            bToFound = True
        End If
        ' Cc に指定されているアドレスのチェック
        If objRecip.Type = olCC And objRecip.Address = CC_ADDRESS Then
            bCcFound = True
        End If
    Next
    ' 宛先と Cc の条件が合致した場合の処理
    If bToFound And bCcFound Then
        Dim fldInbox As Folder
        Dim fldMoveTo As Folder
        ' 受信トレイを取得
        Set fldInbox = Session.GetDefaultFolder(olFolderInbox)
        ' 受信トレイの下のフォルダーを取得
        Set fldMoveTo = fldInbox.Folders(MOVE_FOLDER)
        ' メッセージをフォルダーに移動
        objMsg.Move fldMoveTo
    End If
End Sub

マクロの登録方法やメニューへの追加について

2016年6月25日

連絡先グループのメンバーの部署を取得する

コメントにて以下のご要望をいただきました。


いつも参考にさせていただいております。

OS:Windows7にてOutlook2010を利用し、Exchange環境で利用しております。
ご送信防止のため、送信時の宛先を判定しExchangeUserの場合、特定の部署のみ送信可能とするマクロを作成しております。

単体のExchangeUserの場合、RecipentよりAddressEntery.GetExchangeUserにて部署情報を取得できますが、「連絡先グループ」にてExchangeUserをグループ登録している場合、Outlook.Distlistitem.GetMemberでRecipent情報は取得できるのでですが、部署が取得できません。

ご教授いただけると助かります。よろしくお願いいたします。



連絡先グループに追加されたメンバーを Recipient オブジェクトとして取得すると、メールアドレスが LegacyExchangeDN ではなく、SMTP アドレスとなっています。
このような場合、Exchange のアドレス帳からは切り離された状態となっているため、部署情報が取得できません。
したがって、アドレスから再び名前解決を実行し、名前解決後の Recipient オブジェクトから ExchangeUser を取得することで、部署などの情報が取得できます。
指定した連絡先グループに含まれるメンバーの部署をイミディエイト ウィンドウに表示するマクロのサンプルは以下のようになります。

' ここをトリプルクリックでマクロ全体を選択できます。
Public Sub CheckDepartmentInContactGroup(distList As DistListItem)
    On Error Resume Next
    Dim i As Integer
    Dim recMember As Recipient
    Dim recResolve As Recipient
    Dim objExchUser As ExchangeUser
    '
    For i = 1 To distList.MemberCount
        Set recMember = distList.GetMember(i)
        ' 名前解決用のオブジェクト生成
        Set recResolve = Session.CreateRecipient(recMember.Address)
        ' 名前解決を改めて実行
        recResolve.Resolve
        ' 名前解決後のオブジェクトから Exchange ユーザーを取得
        Set objExchUser = recResolve.AddressEntry.GetExchangeUser()
        If Not objExchUser Is Nothing Then
            Debug.Print objExchUser.Name, objExchUser.Department
        End If
    Next
End Sub

マクロの登録方法やメニューへの追加について

2016年6月18日

Office 2016/2013 のセキュリティ修正のリリース

Filed under: 修正プログラム — outlooklab @ 12:00 PM

6/14 に Office 2016、Office 2013、Office 2010 および Office 2007 のセキュリティ修正プログラムがリリースされました。
Outlook 自体のセキュリティ修正はリリースされていませんが、Word のセキュリティ修正の中に Outlook 関連の修正が含まれているものがあります。以下は各製品のそれぞれの KB へのリンクです。

Office 2016

Word 2016 のセキュリティ修正

2016 の Word のセキュリティ更新プログラム MS16-070: 説明: 2016 年 6 月 14 日
2 件の Outlook 関連の不具合修正が行われています。

Office 2013

Word 2013 のセキュリティ修正

Word 2013 のセキュリティ更新プログラム MS16-070: 説明: 2016 年 6 月 14 日
2 件の Outlook 関連の不具合修正が行われています。

次ページへ »

WordPress.com で無料サイトやブログを作成.

フォロー

新しい投稿をメールで受信しましょう。

現在108人フォロワーがいます。