excel

【作ってみた】Excel VBAからメモ帳に出力するやつ

Excel VBA の処理結果をメモ帳に出力するやつを書いてみた。思いのほか便利。メッセージダイアログとか作らないで、メモ帳に出しちゃったほうがいろいろと楽。

毎度のことながら、 Windows API は仕様がごちゃごちゃしていてわけがわからん…

Excel 側はこんな感じ。意味もなく赤字さん。

excel

VBA のソースはこんなん。めんどいので全部 Sheet1 にべた書き。 SendMessage の第4引数の型が Any なので、値渡しの String であることを明示。セルの値そのままだと Variant になっていまう(「 DLL を正しく呼び出せません。」が出る)。

Option Explicit

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _
        ByVal hwndParent As Long, _
        ByVal hwndChildAfter As Long, _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String _
    ) As Long

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
        ByVal hwnd As Long, _
        ByVal wMsg As Long, _
        ByVal wParam As Long, _
        lParam As Any _
    ) As Long

Private Const WM_SETTEXT = &HC

Public Sub Main()
    Dim hwnd As Long
    Dim hwndTarget As Long
    Dim rc As Long

    Shell "notepad", vbNormalFocus

    hwnd = FindWindowEx(0, 0, "Notepad", "無題 - メモ帳")
    If hwnd = 0 Then
        MsgBox "メモ帳が起動していません。"
        Exit Sub
    End If
    
    hwndTarget = FindWindowEx(hwnd, 0, "Edit", "")
    If hwndTarget = 0 Then
        MsgBox "メモ帳がなんか変です。"
        Exit Sub
    End If

    rc = SendMessage(hwndTarget, WM_SETTEXT, 0, ByVal CStr(Me.Cells(1, 1).Value))
    If rc = 0 Then
        MsgBox "メモ帳にメッセージを送信できませんでした。"
        Exit Sub
    End If
End Sub

実行結果はこんな感じ。

notepad

( VBA からメモ帳へ)赤字さんよく来たわね、いらっしゃい。

Shell でメモ帳を起動し、 FindWindowEx でウィンドウを探して SendMessage でメッセージを送るだけ。 “user32″ と書いてあるが、64bit環境にも “user32.dll” は存在するので問題なく動く。

難点は、ウィンドウ名で検索していることで、「無題 – メモ帳」という名前のウィンドウが他にいたらそっちにメッセージが飛んじゃう可能性があること(ここらへんの仕様は正直よくわからん)。しかも、メモ帳の内容を上書きしてしまうので、編集中の「無題 – メモ帳」があったら潰してしまう…のかもしれない。 Shell が pid を返すから、 pid とウィンドウハンドルの紐付けができればいいのだろうけど。

これの何が便利って、文字列を作って送るだけという手軽さがあること。通常、テキストファイルを出力するときは Scripting.FileSystemObject とかを使って TextStream#writeLine をループで回したりして出力するのだが、これが結構めんどい。特に保存先の指定とか書き込み権限がないときの例外処理とか。メモ帳に出してしまえば、あとはユーザーが適宜保存なり破棄なりしてくれる。

え、メモ帳じゃなくて秀丸エディタに出力したい?知らんがな(´・ω・`)


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>