VBAで自動的にメモ帳に文字を入力させる

VBAではWin32APIを使って、外部アプリケーションとの連携を行うことが可能です。

ここではVBAからメモ帳(Notepad)に自動で文字列を入力する方法を紹介します。

利用するWin32APIは以下の4つです。

API名 説明
FindWindow 特定のクラス名・ウィンドウタイトルを持つアプリケーションのハンドルを取得します。
FindWindowEx 親ウィンドウの中から特定の子ウィンドウ(例:入力欄)を探すために使います。
SetForegroundWindow 対象アプリケーションをアクティブなウィンドウに切り替えます。
SendMessage アプリケーションにメッセージ(今回は文字列)を指定するウィンドウへ直接送信します。

これらを組み合わせることで、「VBA → メモ帳へテキストを自動入力」という流れが可能になります。

API解説

1. FindWindow – ウィンドウ全体を探す

FindWindow は、指定されたクラス名またはウィンドウタイトルからウィンドウのハンドル(識別番号)を取得する関数です。

VBAでの宣言(64bit対応)

パラメータ

  1. lpClassName: ウィンドウのクラス名(”Notepad”など)
  2. lpWindowName: ウィンドウのタイトル(”無題 – メモ帳”など)

コード例

2. FindWindowEx – 子ウィンドウや入力欄を探す

FindWindowEx は、親ウィンドウの中から特定の子ウィンドウ(例:入力欄)を探すために使います。

VBAでの宣言(64bit対応)

パラメータ

  1. hWndParent: 親ウィンドウのハンドル(FindWindowで取得)
  2. hWndChildAfter: どの子ウィンドウから検索を始めるか(通常は 0)
  3. lpszClass: 子ウィンドウのクラス名(メモ帳の入力欄は “Edit”)
  4. lpszWindow: 子ウィンドウのタイトル(通常は vbNullString)

コード例

3.SendMessage – テキストを送る

SendMessage は、特定のウィンドウに命令(メッセージ)を送るAPIです。今回は”WM_SETTEXT”を使って、ウィンドウにテキストを入力しています。

VBAでの宣言(64bit対応)

定数(他にも複数あり)
Const WM_SETTEXT As Long = &HC

パラメータ

  1. hWnd: メッセージを送信する対象ウィンドウのハンドル
  2. wMsg: 送信するメッセージの種類(例:WM_SETTEXT)
  3. wParam: メッセージごとの追加情報(用途はメッセージによる)
  4. lParam: メッセージごとの追加情報。文字列や構造体など

コード例

この命令で、対象のウィンドウ(例:メモ帳の入力欄)に文字列「メッセージおくったよ」が送信されます。

4. SetForegroundWindow – ウィンドウを最前面にする

SetForegroundWindow は、指定したウィンドウを画面の一番手前に表示します。必須ではないですが、一般的には使った方が分かりやすくなります。

VBAでの宣言(64bit対応)

パラメータ
hWnd: 前面表示するウィンドウのハンドル

コード例

Excelのアクティブシートの内容をメモ帳に自動で送信するVBAコード

メモ帳を起動した状態で、以下のコードのSendSheetTextToNotepad()を実行すると、アクティブシートに書いてある内容を全てメモ帳に貼り付けます。

注意点として、メモ帳の既存の内容を上書きしますので、新規メモでの実行をお勧めします。

コードの内容はコメントに大体書いてる通りですが、以下の流れで処理を行っています。

  1. アクティブシートに入力されている全てのセル範囲を処理対象とします。
  2. シートの1行ごとに改行を入れて、全てのセルの文字列を連結します。
  3. FindWindow()でメモ帳のウィンドウハンドルを取得します。ウィンドウハンドルとはWindowsOSが管理しているアプリケーションウィンドウごとに割り当てられた番号です。
  4. FindWindowEx()でメモ帳の入力欄のハンドルを取得します。メモ帳本体ではなく入力部にSendMessageでテキストを送る必要があるためこの指定が必要です。
  5. SetForegroundWindow()でメモ帳を最前面に表示します。前面表示しなくてもセル文字列はメモ帳に張り付きます。
  6. SendMessage()でメモ帳の入力部に文字列を送信します。これによりメモ帳にセル文字列が表示されます。

実行結果

以下のようにアクティブシートに入力します。

SendSheetTextToNotepad()を実行します。

このようにメモ帳に張り付きます。

複数のAPIを使うことになりますが、VBAからでも外部アプリケーションの制御を行うことが可能になります。