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
ただ、長年、メールは、秀丸エディタ上で、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