vba裏技,技,論理 - インプットボックス入力 ひらがな、英語の自動書換え
インプットボックスなどに入力する時に、全角半角を予め設定しておきたい。こんな要求がある。しかしこの設定は単純で簡単そうに見えるが、そうではない。
コーディングで使用する「vbIMEModeOff」,「vbIMEModeOn」及び「SendKeys」
の動きが不安定である上に、「SendKeys」の使い方にバグが入っているので、ナンバーロックが外れることがある。
これを解決する方法はネットでも色々と紹介されているので、試してみるとやはり動きに支障がある。仕方がないので、私は次の方法を創作した。
まずIMEModeが半角になっている場合、
If IMEStatus = vbIMEModeOff Then SendKeys “{kanji}”
と書けばいいのだが、もしナンバーロックがオンになっていれば、SendKeysが実行されるとのナンバーロックがオフになってしまう。そしてこれを自動的に再度オンにしなければならない。
しかしもし事前にナンバーロックがオフになっていればになっている場合は逆にオンになる。
こうしたことに対応するため、ナンバーロックがオンになっているかオフになっているかの安定した検索方法はなく、ネットで紹介されている方法は全て不安定であるか、作動ができない。
これをコーディングで解決する方法は結局ない。従って無理に切り替えをさせるにはユーザーに協力してもらうしかない。
v = InputBox(“1を入力してください”)
If v = “” Then
Set WshShell = CreateObject(“WScript.Shell”)
WshShell.SendKeys “{NUMLOCK}”
End If
これはナンバーロックがオフになっているとき「1」を入力しても変数の「v」は「””」になって「1」にならないという原理を利用するものだ。そのときにはナンバーロックをオンにする。そうでない場合、ナンバーロックはすでにオンになっているので、条件が満たされないので、オンのままだ。
片やIMEModeが半角になっている場合は
If IMEStatus <> vbIMEModeOn Then SendKeys “{kanji}”
とやや矛盾するような書き方をする。
上記を総合すると
漢字、ひらがなに設定したい場合(全角)
If IMEStatus = vbIMEModeOff Then
SendKeys “{kanji}”
End If
v = InputBox(“1を入力してください”)
If v = “” Then
SetWsjjShell= CreateObject(“WScript.Shell”)
WshShell.SendKeys “{NUMLOCK}”
End If
片かな、英語に設定したい場合(半角)
If IMEStatus <> vbIMEModeOn Then SendKeys “{kanji}”
v = InputBox(“1を入力してください”)
If v = “” Then
Set WshShell = CreateObject(“WScript.Shell”)
WshShell.SendKeys “{NUMLOCK}”
End If
これ以外に書く方法があるかも知れないが、これで目的が達成される。
酒巻 修平