テーマ:未分類(甘党)

日々、思いついたことを記録します。

RunEditor v.0.04

2007年04月20日 06時36分43秒 | Outlook Tips
Outlookのメール作成画面から、秀丸エディタを起動するためのVBAマクロのRunEditorを、ちょっとだけ、修整してしたところ、かなり、良くなってきてきました。

ただ、長年、メールは、秀丸エディタ上で、Ctrl+Aで全選択、Ctrl+Cでコピー、Alt+Tabで Outlookに移って、メール作成画面でCtrl+Vという一連の操作が、染み付いていて、まだ、RunEditorから復帰するときに、単に、エディタを終了すればよいという操作になれません。

まぁ、ただ、確実に、キー操作が減るはずなので、 RunEditorを使っていきたいと考えています。
ここまでで、動作的には、安定して、それなりの使い勝手になってきたので、ほぼ、完成の領域だと思っています。

---------------------------------------------------------

'#####################################################
' Outlook2003のメール作成ウィンドウからエディタを起動
' copyright 2007 by 甘党のプログラマ
'#####################################################
' 【機能】
' Outlook2003のメール作成ウィンドウからエディタを起動して、そのエディタ上で編集をして、エディタの編集結果を取り込みます。
' (現状、"C:Progra~1HidemaruHidemaru.exe"で決めうち)

' 【参考】
'millefeuille氏の「マイクロソフト・インサイド・アウト」
'「Outlook Tips | HTML メールのソース編集をするマクロ」
'http://ameblo.jp/millefeuille/theme12-10000018720.html
'
'Tatsu's room on the Web
'2005/01/14(金) Outlookのメール作成をエディタとマクロで強化し損ねる
'http://homepage3.nifty.com/Tatsu_syo/Nikki/200501.html
'
' 【履歴】
' v0.01 2007/4/12 初版 : タイトルと日時から一時ファイル名を生成、秀丸エディタの起動、編集済みの一時ファイルからの読み出しを一気に行う
' v0.02 2007/4/17 v.0.01が、原因不明の調子が悪さがあるために、RunEditorは、タイトルと.CreationTimeから一時ファイル名を生成、秀丸エディタの起動のみ。
' v0.03 2007/4/18 エディタを起動して戻ってきたら、オートリロードする機能を追加。秀丸エディタから戻ってきたら、1行目を、メールのタイトルに設定。
' v0.04 2007/4/19 秀丸エディタを起動したときに、2行目にカーソルを設定。リロードのときのMsgBoxをvbYesNoCancelに変更して、Cancelの場合には、もう一度、Activateしたときに、再ロードできるようにした。
'
' 【TODO】
' ・重複起動は、後の方が、参照だけで、戻ってきたときのオートリロードができない状態にしようとしたが、どうも、最初のオートリロードの機能が間違ったところにロードしてしまう不具合があったため、重複起動機能をつぶしている。
' ・本当は、同時に複数のメールをエディタで編集できるようにしたい。
' ・Outlook側にフォーカスがあたったら、一時ファイルの存在の有無とタイムスタンプ更新をチェックして、取り込むようにしたい。
' ・もう少し、ソースコードの綺麗にしたい。(文字列が散らばっていたり、決めウチの文字列が、直接、埋まっていたり、知性がないコードになってしまっている。)
Public WithEvents myOlInspector As Inspector
Public myOlMailItem As MailItem
Public strFileName As String
Public strRunEditorTitle As String

Sub RunEditor()
    strRunEditorTitle = "RunEditor v0.04"
    Dim objShell As Object
    Dim objFso As Object
    Dim strTempFileName As String
    Dim stmFile As Object
  
    Set objShell = CreateObject("WScript.Shell")
    Set objFso = CreateObject("Scripting.FileSystemObject")
    Set myOlMailItem = ActiveInspector.CurrentItem
    With myOlMailItem
        ' メールを一旦保存する
        .Save

        ' 一時ファイル名を生成
        MakeTempFileNameForEditor strTempFileName, objShell

        If myOlInspector Is Nothing Then
            If MsgBox("エディタを呼び出しますか?" & Chr(13) & Chr(10) & "戻ってきたときに、オートリロード可能です。" & Chr(13) & Chr(10) & "(1行目は、メールのタイトルです。)", vbYesNo, "RunEditor v0.04") = vbNo Then GoTo Finish
            Set myOlInspector = ActiveInspector
            strFileName = strTempFileName
        Else
            '[todo]
'           If MsgBox("未リロードのメール編集画面が立ち上がっているため、これで起動するエディタから戻ってきてもオートリロードできませんが、エディタを呼び出しますか?", vbYesNo, "RunEditor") = vbNo Then GoTo Finish
            MsgBox ("未リロードのメール編集画面が立ち上がっているときには、RunEditorを起動しないでください。以前、起動したエディタから復帰もできなくなりました。")
            Set myOlInspector = Nothing
            strFileName = ""
            GoTo Finish
        End If
      

        ' 一時ファイルの作成とメッセージの本文の書き出し
        Set stmFile = objFso.CreateTextFile(strTempFileName, True)
        stmFile.WriteLine "[タイトル] : " & .Subject
        stmFile.WriteLine .Body
        stmFile.Close
      
        ' 秀丸エディタの起動
        objShell.Run "C:Progra~1HidemaruHidemaru.exe /j2 " & strTempFileName, , False
      
    End With
Finish:
End Sub


Private Sub MakeTempFileNameForEditor(ByRef strFileName As String, objShell As Object)
 Dim strSubject As String
    With ActiveInspector.CurrentItem
        ' タイトルの取得
        If .Subject <> "" Then
            strSubject = .Subject
        Else
            strSubject = "(無題)"
        End If
      
        ' タイトルと.CreationTimeから一時ファイル名を生成
        strFileName = strSubject & "(" & Year(.CreationTime) & "-" & Month(.CreationTime) & "-" & Day(.CreationTime) & "-" & Hour(.CreationTime) & "-" & Minute(.CreationTime) & "-" & Second(.CreationTime) & ")" & ".txt"
        strFileName = Replace(strFileName, ":", ":")
        strFileName = Replace(strFileName, "<", "<")
        strFileName = Replace(strFileName, ">", ">")
        strFileName = Replace(strFileName, "?", "?")
        strFileName = Replace(strFileName, "/", "/")
        strFileName = Replace(strFileName, "", "¥")
        strFileName = objShell.ExpandEnvironmentStrings("%temp%") & strFileName
    End With
End Sub


Private Sub myOlInspector_Activate()
    Dim objFso As Object
    Dim stmFile As Object
  
    Set objFso = CreateObject("Scripting.FileSystemObject")
  
    If myOlInspector Is Nothing Then
        MsgBox ("RunEditorの2重起動の不具合が直っていません。リロードできません。")
    Else
        With myOlMailItem
            btn = MsgBox("エディタで編集したテキストを取り込みますか?", vbYesNoCancel, "RunEditor v0.04")
            If btn = vbYes Then
                ' 編集済みの一時ファイルからの読み出し
                Set stmFile = objFso.OpenTextFile(strFileName, 1)
                .Subject = Mid(stmFile.ReadLine, Len("[タイトル] : ") + 1, 1024)
                .Body = stmFile.ReadAll
                stmFile.Close
      
                ' 最悪、このファイルから作成したテキストを復帰できるように、一時ファイルは削除しない。
                'objFso.DeleteFile strFileName
                      
                Set myOlInspector = Nothing
                strFileName = ""
            ElseIf btn = vbNo Then
                Set myOlInspector = Nothing
                strFileName = ""
            End If
        End With
    End If
End Sub




最新の画像もっと見る

コメントを投稿