Microsoft Communityにあった質問「Outlookの閲覧ウインドウのメールの一部(選択状態のもの)をVBAで取得する方法」への回答として書いたコードです。
※ 下記コードは32ビット版のOffice 2010で検証を行いました。
※ 下記コードはVBEから実行すると上手く動作しません。
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 = "" '初期化 With Application.ActiveExplorer If .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 .CommandBars.FindControl(ID:=19).Enabled = True Then .CommandBars.FindControl(ID:=19).Execute ret = CreateObject("htmlfile").parentWindow.clipboardData.getData("text") 'クリップボードから文字列取得 End If End If End If End With GetSelectedTextFromReadingPane = ret End Function
Outlookのオブジェクトを眺めてみても、閲覧ウィンドウから直接選択文字列を取得できるようなメソッドやプロパティは見つけられなかったので、上記コードのような方法をとることにしました。
後になって調べたところ、上記コードと似たようなコードが書かれた質問を見つけました。
・How do I get the selected Text from the reading pane in Outlook 2003?
http://social.msdn.microsoft.com/Forums/vstudio/en-us/7f40c0d0-203b-44fb-ad8a-ce134f793563/
「Selected text – Outlook’s reading pane」にも書かれていましたが、Outlookのオブジェクトモデルには、閲覧ウィンドウから選択文字列を取得できるようなものは用意されていないのかもしれません。
この記事へのコメントはありません。