Outlookの閲覧ウインドウのメールの一部(選択状態のもの)をVBAで取得する方法

Outlookで、閲覧ウインドウに表示されている受信メール本文に対して、メール本文の一部をマウスで選択(反転表示)状態にした場合、VBAでその文字列を取得するにはどのようにコードを書けばよいか、教えていただけないでしょうか?
 

質問情報


最終更新日 2019年5月24日 表示 1,772 適用先:
回答
回答
こんにちは。

Outlookのオブジェクトを調べてみましたが、閲覧ウィンドウから文字列を直接取得できるようなものは見つけられませんでしたので、

(1)入力フォーカスがあるウィンドウを取得。
(2)(1)のウィンドウのクラス名とタイトルがそれぞれ"_WwG"と"メッセージ"であるか判別。
(3)"コピー"コマンドが有効か無効かを判別。
(4)コピーコマンドを実行。
(5)クリップボードから文字列を取得。

というような処理を考えてみました。
下記コードは32ビット版のOutlook 2010でテストしました。
64ビット版のOutlookで実行する場合には、一部コードを変更する必要があります。


Option Explicit

Private Declare Function GetFocus Lib "user32" () As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Public Sub Sample()
  Dim s As String
 
  s = GetSelectedTextFromReadingPane()
  If Len(Trim(s)) > 0 Then MsgBox s
End Sub

Private Function GetSelectedTextFromReadingPane() As String
'閲覧(プレビュー)ウィンドウの選択文字列を取得
  Dim h As Long
  Dim clsName As String
  Dim clsBuf As String * 255
  Dim winName As String
  Dim winBuf As String * 255
  Dim ret As String
 
  ret = "" '初期化
  If Application.ActiveExplorer.IsPaneVisible(olPreview) = True Then
    h = GetFocus()
    GetClassName h, clsBuf, Len(clsBuf)
    clsName = Left$(clsBuf, InStr(clsBuf, vbNullChar) - 1)
    GetWindowText h, winBuf, Len(winBuf)
    winName = Left$(winBuf, InStr(winBuf, vbNullChar) - 1)
    If clsName = "_WwG" And winName = "メッセージ" Then
      '"コピー"の有効・無効判別
      If Application.ActiveExplorer.CommandBars.FindControl(ID:=19).Enabled = True Then
        Application.ActiveExplorer.CommandBars.FindControl(ID:=19).Execute
        ret = CreateObject("htmlfile").parentWindow.clipboardData.getData("text") 'クリップボードから文字列取得
      End If
    End If
  End If
  GetSelectedTextFromReadingPane = ret
End Function

この回答で問題は解決しましたか?

役に立ちませんでした。

回答としてマークしていただきありがとうございます。

この返信の満足度をお教えください。

フィードバックをお送りいただきありがとうございます。今後のサイト改善に役立てて参ります。

この回答の満足度をお教えください。

フィードバックをお送りいただきありがとうございます。