なぜVBAで「再変換」を扱う必要があるのか
業務でExcelやWordを操作する際、一度確定した文字列の誤字に気づいてやり直した経験は誰にでもあるはずです。通常であれば手動で再変換を行いますが、VBAで大量のテキストを処理する際や、特定のセル範囲に対して一括で変換候補を呼び出したいというニーズが発生することがあります。
今回は、Wordの「再変換機能」をVBAから擬似的に実行する手法を解説します。「確定済みの文字を、あたかも今入力したかのように変換し直す」この処理を自動化することで、データの整形効率を一段階引き上げましょう。
基礎知識:SendKeysとは
VBAには「再変換」を直接実行する専用のメソッドは用意されていません。そこで登場するのがSendKeysメソッドです。これは、キーボードから入力されたかのような信号をアプリケーションに送る機能です。
Windowsの標準機能として、確定後の文字列を選択して[変換]キー(またはスペースキー)を押すと再変換が行われます。この操作をプログラムで再現します。
実装:再変換の自動化ロジック
VBAで再変換を実行するには、以下の3ステップが必要です。
1. 対象の文字列を選択状態にする。
2. SendKeysメソッドで「変換キー(再変換のトリガー)」を送信する。
3. 候補を表示・確定させるためのキー信号を送る。
※注意:SendKeysは非常に強力ですが、実行中に他の操作を行うとキー信号が混ざる可能性があるため、必ず対象のアプリがアクティブな状態で実行してください。
サンプルプログラム:選択範囲の文字を再変換する
以下のコードは、現在選択しているWordの文字列に対して再変換候補を表示するサンプルです。
Sub AutoReConvert()
‘ 選択されている文字列がない場合は終了
If Selection.Type = wdSelectionIP Then
MsgBox “対象の文字列を選択してください。”
Exit Sub
End If
‘ 1. SendKeysで「変換キー」を送信する
‘ {}で囲むことで特殊キーを指定できます
‘ ※環境により「{CONVERT}」が効かない場合は「” “(スペース)」を代用
SendKeys “{CONVERT}”
‘ 2. 処理を待機させる(重要:キー信号の伝達を待つ)
DoEvents
‘ 補足:この後、必要に応じてSendKeys “{DOWN}”等で候補を選択し、
‘ SendKeys “{ENTER}”で確定する処理を繋げます。
MsgBox “再変換候補を呼び出しました。”
End Sub
応用と注意点:現場で陥りやすいバグ
1. DoEventsの重要性
SendKeysは即座にキーを入力するわけではなく、OSのメッセージキューにキー信号を投げます。そのため、プログラムの行が実行された瞬間にキーが反映されないことがあります。DoEventsを挟むことで、OSがキー入力を処理する隙間を作ることが不可欠です。
2. 競合の回避
VBAを実行中にユーザーがマウスをクリックしたり、別のアプリがフォーカスを奪ったりすると、キー信号が意図しない場所に入力されてしまいます。実務で利用する場合は、実行前に AppActivate で対象のアプリケーションを確実にアクティブにすることを忘れないでください。
3. 確実な方法との使い分け
大量データの変換が目的であれば、SendKeysに頼るよりも、VBAの `Replace` 関数や `Dictionary` オブジェクトを用いた「文字列の置換リスト」による変換の方が、圧倒的に高速でバグも発生しません。SendKeysによる再変換は、あくまで「ユーザーが手動で行う操作の補助」として限定的に使うのが、ベテランの作法です。
