• ベストアンサー

Word2007数式でIMEオン/オフをマクロで

Word2007で数式入力開始時に,IMEを自動的に半角英数にしたいので次のようなマクロを作ってみました.(Word2003以前は自動でIMEがオフになったのに) Sub EquationPlus() If IMEStatus <> vbIMEModeHiragana Then 'SendKeys "{kanji}" SendKeys "%{kanji}" '漢字キーの代わりに変換キーを使っているので WordBasic.EquationEdit Else WordBasic.EquationEdit End If End Sub 問題は,数式モードを抜けたらIMEを全角ひらがなに戻したいのですが,WordBasic.EquationEditの直後にSendKeys "%{kanji}"を付けると,数式モードを抜ける前に全角ひらがなに戻ってしまいます. 数式モードを抜けたことを検出してIMEを全角ひらがなに戻すことは可能なのでしょうか.

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 本来、私はコードを書くべきなんですが、確実といえるものがひとつもないのです。今のところ、Win32API のSendKey がありますが、そこからキーを送る方法があります。CreateObject("Wscript.Shell").SendKeys は、VBAと同じキーコードですが、これは、外部からキーコードを送りますから、一旦命令を送れば、その後のWord内の内部オブジェクトに影響されません。 それと、 >RunでOLEを指定すると思うのですが,それが無い? Run で動かすのは、Exe ファイルです。OLEは、タイプテーブルかダイナミックリンクですから、Run では呼び出せません。 どうやら、ご自身で、調べながらでもコードを作ることが出来そうですね。 ただ、もう一度、最初の質問のコードを良くみると、良く分からない部分がまだありますね。 そのコードのロジックで、IMEのオンオフは可能だったのでしょうか。 たぶん、トグルになっているのだと思いますが、 '------------------------------------------- If IMEStatus <> vbIMEModeHiragana Then  ひらがなモードでなければ、[Alt+ 漢字] キーを押せば、IMEはOn になるはずです。 その後で、Equation Editor を起動する/Off にする '------------------------------------------- 起動していれば、 そのまま、 Equation Editor を起動する/Offにする '------------------------------------------- と読んでいます。 以下は、ためしに作ったもので、思ったよう動かないかもしれません。 '標準モジュール 'Option Explicit Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)      Public Const VK_SHIFT As Long = &H10   Public Const VK_LMENU As Long = &HA4   Public Const VK_KANJI As Long = &H19     Public Const KEYEVENTF_EXTENDEDKEY = &H1   Public Const KEYEVENTF_KEYUP = &H2 Public Sub IMEControl_Prc() 'Word 2007 VBA Only  If IMEStatus = vbIMEModeOn Then    'IMEMode Off    keybd_event VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY Or 0, 0    keybd_event VK_KANJI, 0, 0, 0    keybd_event VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0    WordBasic.EquationEdit   Else    'rid of 'Equation Editor'    If Selection.OMaths.Count >0 Then      Selection.HomeKey Unit:=wdStory '数式エディタを外す    End if    'IMEMode On    keybd_event VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY Or 0, 0    keybd_event VK_KANJI, 0, 0, 0    keybd_event VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0  End If End Sub

tofunatto
質問者

補足

ありがとうございます. If IMEStatus <> vbIMEModeHiragana Then  について,スレッド作成時に恥ずかしい間違いをしてしまいました.^^; 最初の補足内容で書いてはいたのですが見づらくて申し訳ありませんでした. 以下が要件でございます. 数式入力時にはIMEを必ずオフにしておきたい. 数式入力終了後は(数式入力)以前のIME状態に戻したい. でございます. サンプルをお教えいただいて,Word2007における, (1) VBAからWin32APIの呼び出し方. (2) keybd_eventの使い方.(winuser.hにコード表有り) VK_LMENUなどの拡張キーに必要なフラグ キーを戻すときは,| KEYEVENTF_KEYUPも付けるなど. (3) Selection.OMaths.Countで数式状態かが判別できる. (4) Selection.HomeKey Unit:=wdStoryで文頭に移動できる. (Selection.EndKeyにして使用しています) といった大事なことが理解できました. 私の環境では, Change KeyというソフトやIMEの設定で, キーを入れ替えたりしているので独自の記述が必要になったのですが,すべてOKでした. VBAにフックの概念はあるのか?,オブジェクトの状態をバックアップしてどこかに記憶させておくことは可能なのか?などが今後の調査課題ですが,とりあえず不自由はなくなったので必要になったときにまた考えるようにします. 本当にありがとうございました.

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんにちは。 >MFCと.NetFrameWorkの対応が良く分からないことにかなり戸惑いました.もうひとつ私にとって痛いのは,そもそもプログラムが必要となるような対象がほとんどなくなってしまったことなのですが 分かっている話なのかもしれませんが、.Net FrameWork のプログラミングというのは、つまるところ、VS2008 とか、Microsoft が供給するVSシリーズになるのではありませんか。これを、まったく知らないというわけには行かないとは思うのですが、* Office VBAに、この.Net の波が来るのはだいぶ後になりそうです。Office 2003 以降は、.Net FrameWork はある程度対応しているようです。** (*前回と今回のCと.Net FrameWork の関係の根拠) Microsoft Win32 と Microsoft .NET Framework API との対応 http://msdn.microsoft.com/ja-jp/library/aa302340.aspx (**Office VBAで、オートメーション・オブジェクトから、.Net FrameWork の一部を利用する) CreateObject("System.Collections.ArrayList") ただ、私個人からすると、Office VBAの Excel, Access は、研究尽くされてはいても、それ以外の情報は、あまり良く得られません。日本語の情報にはかなり限界があります。それに、Word VBAに関しては、Excel VBAより仕様が先に行っているようです。それだけに、高い技術が必要とされるようです。 私自身の後の残りの人生のことを考えると、今のところ、C言語に関係するものは、特別にMicrosoft 側の新しい技術に追従する必要性がないような気がしています。たぶん、いつまで経っても、追いつかずに振り回されるだけのような気がします。Microsoft というのは、そういう仕組みになっているのではないでしょうか。もっと、ベースの部分を固めていれば、ほとんどのことは対応できるのではないかと思っています。   プログラム言語でも、必要のあるなしに関係なく、最終目的を置かないことかもしれませんね。 目的はなくても、淡々と先を求めていけば、いずれは形になるのではないかと思ったりします。 適切な答えになっているか分かりませんが、そう思いました。

tofunatto
質問者

補足

返信が遅くなってしまい申し訳ありません. VBA, .Net Frameworkの全体像を教えていただきありがとうございます. > 今のところ、C言語に関係するものは、特別にMicrosoft 側の新しい技術に追従する必要性がないような気がしています。 私は,C/C++でプログラムを書くときに,(これでいいのかな?と)リソースの開放が気になってしまいます.C言語はハードの動きをイメージすると理解しやすいので,逆にハードの動きが見えなくなると不安を感じます. なるべく多くのプログラミングに挑戦しながら一つ一つ理解していきたいと思います.今後ともよろしくお願い申し上げます.

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 >最初の補足内容で書いてはいたのですが見づらくて申し訳ありませんでした. そうでした。最初に見ていた時点では、別のことを考えていたので、頭に残っていませんでした。失礼しました。 良く研究されていますね。そこで、ひとつ・ふたつのアドバイスと、本質的な今後の問題に関して大事なことを書かせていただきます。 >VBAにフックの概念はあるのか?, 何に対するフックか分かりませんが、Win32APIに関してはいくつかあります。 >オブジェクトの状態をバックアップしてどこかに記憶させておくことは可能なのか? それは、良く分かりません。しかし、目算のない考えですが、数式エディタに関しては、あらかじめ作るという方法は可能だと思います。 今後の課題ということをお書きになっていましたが、大きな問題は、私は、Win32API自体は、C++に戻っていくものだと思います。Microsoft 側では、.Net FrameWork を使う方向に進んでいます。だから、Win32API + VBの有名なサイトが、ひとつ消えました。別途、WMIを使用することが増えてきています。C言語は、あくまでも、独自路線だと思います。 今の段階では、これらは選択肢のひとつに過ぎません。私個人は、どうするかは、ある程度決めています。

tofunatto
質問者

補足

今後の課題にまで光明を与えていただきまして本当にありがとうございます.先輩方の「可能だと思う」という進言は本当に心強いです..Net FrameWorkの方は,かつてXMLをかじったときに便利に感じました.(XMLはかじっただけです)一方で,他のウインドウをキャプチャするプログラムを作ろうとしたときにhWndを取得する方法がわからずに挫折したような記憶があります.MFCでプログラミングを始めた人間なので,MFCと.NetFrameWorkの対応が良く分からないことにかなり戸惑いました.もうひとつ私にとって痛いのは,そもそもプログラムが必要となるような対象がほとんどなくなってしまったことなのですが. 一般人でもプログラミングを楽しめるような秘策があると良いのですが.(最後はかなり脱線してしまいました.すみません.) 今後ともよろしくお願いいたします.

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 私の疑問は解けました。 >Word2003以前は自動でIMEがオフになったのに と書かれていたので、Word2003 で、お使いになっていたコードだと思っていました。 それは、Word2007 のコードで、Word2007のみのものだったのですね。 >ちょっと厄介そうに感じてきました. うまく行かないのは、内部オブジェクトを呼び出す、そのタイムロス(正しくはオーバーヘッド)があるからですから、やはり、IMEに対しては、WordBasic.EquationEdit を操作する前に、IMEに命令を先にしてあげるか、CreateObject("Wscript.Shell").SendKeys で命令を送るという方法があります。 そうでなければ、Win32APIを使ってみる価値はあります。

tofunatto
質問者

補足

ありがとうございます.キーワードをいろいろと教えていただいてとても勉強になりました. (でも,私の力不足で解決できなくてすみません.) 1.CreateObjectでWscript.Shellオブジェクトの生成を完了してからSendKeysを送る方法について (createobject wscript.shell sendkeys)で検索し,@ITのページを知ることができました. @ITでは, (1)Wscript.Shellオブジェクトへの参照objShellを得る. (2)objShell.Run "外部アプリケーション" (3)objShell.SendKeysでその外部アプリケーションにキーを送る. のようでした.OLEオブジェクトをVBAで扱う際に参考になりそうです. (ただ,SendKeysを送りたいのが, CreateObjectを実行したオブジェクトそのものなので, どう指定してよいのか分かりませんでした. RunでOLEを指定すると思うのですが,それが無い?) 2.VBAからWin32APIを呼び出す. Declare FunctionでDLLとAPI関数を指定することを検索で知ることができました.IMEは,ImmSetConversionStatus APIが使えそうに思いました. 現在の状況として, ○ 数式入力モードになった時点で,IMEを半角直接入力にすることは, SendKeys "%{kanji}" (私は,変換キーを漢字キーと入れ替えています) で,OK. ○ 数式モードを抜けた時点で,IMEを元の全角ひらがなに戻す方法は未解決. でございます. とりあえず,数式モードを抜けた時点でマニュアル入力で全角ひらがなに戻して使っております. 従来,数式モードに入った時点で全角のまま入力すると,それに気づいてBSキーを押しただけで勝手に数式モードを抜けてしまって困っておりました.それが無くなっただけでだいぶ楽になりました. いろいろとありがとうございました.

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 うまく行かない場合は、IMEの命令とオブジェクトの設定を逆にすると良いようです。また、Win32APIを使ってみたらどうかということも考えます。 ただ、以下の部分が良く分からないのです。 > WordBasic.EquationEdit これは、数式エディタを呼び出すものだとは思うのですが、数式エディタは、OLE Object ですから、WordBasicオブジェクトにはないはずで、呼び出せないと思います。どういうテクニックなのでしょうか?

tofunatto
質問者

補足

お世話になります. (Word2007 数式 OLE)でGoogle検索したところ,2007以降の数式はOLEではないような主旨の情報が見つかりました. ちょっと厄介そうに感じてきました. 質問の本質ではないのですが,恥ずかしいことに If IMEStatus <> vbIMEModeHiragana Thenは, If IMEStatus = vbIMEModeHiragana Thenの誤りでございます. どうやら,XP SP3の言語設定で,詳細なテキストサービスをオフにしておかなかったので,IMEStatusの返り値が常にvbIMEModeOffでした.

関連するQ&A

  • 日本語入力ONかつ「NumLock」ONのマクロ

    Excelを起動したときに、「NumLock」キーがOFFにならないようにしてONのままで、IMEが日本語入力ONで起動できるようにしたいのです。 Excel2010では、起動したとき、下記の3行マクロで「NumLock」キーがOFFにならずにONのままで、IMEを日本語入力ONで起動できておりました。。 Sub Auto_Open() SendKeys ("{kanji}") End Sub しかし、Excel2013では、IMEは日本語入力ONになるにはなるのですが、SendKeysの影響で「NumLock」キーがOFFになってしまいます。 「NumLock」キーをONにするために、Call numLockOnを挿入して、 Sub Auto_Open() SendKeys ("{kanji}") Call numLockOn End Sub としましたが、「NumLock」キーがOFFになってしまいます。 「NumLock」キーをONにしたいのですが、記述の何が足らないかお教えいただけませんか。 よろしく、お願いします。

  • IME98で・・・

    初歩的な質問ですが、IME98でひらがなモードにしている時に CapsLockキーを押すと全角英数モードになりますが以前は もう一度CapsLockキーを押すとひらがなモードに戻りまし たが何時の間にか戻らなくなってしまいました。 IMEのプロパティを見てもどこを触っていいのかいまいちよく わかりませんでした。 お恥ずかしい話ですがどなたか教えて頂けないでしょうか?

  • メモ帳を、IME入力モード「あ」で開く構文について

    メモ帳を起動したとき、IMEの入力モードが、通常、半角英数「A」で開くようになっています。そのメモ帳を、IMEの入力モードが、ひらがな「あ」で開くようにしたいのですが、何度、試しても、うまくできません。 次の(1)に、(2)を、どこに、どのように、追加すればよいか、お教えください。 構文が、間違っておりましたら、ご指摘くださいますよう、お願いいたします。 よろしく、お願いいたします。 (1) Option Explicit Dim objWshShell Set objWshShell = WScript.CreateObject("WScript.Shell") objWshShell.Run "C:\Windows\System32\notepad.exe" Set objWshShell = Nothing (2) Sub IMEの初期入力モードをひらがなに設定する() If IMEStatus <> vbIMEModeHiragana Then SendKeys "{kana}", True End If End Sub

  • IME2003です。キーボードにテンキーはないタイプです。例えば、ひら

    IME2003です。キーボードにテンキーはないタイプです。例えば、ひらがな入力モード中に 半角スラッシュ / を入れた直後に 全角スラッシュ /を入力したい場合、都度マウスで、入力モードの切り替えをしないとだめですか。 半角/全角キーの切り替えでは 半角英数とひらがなとの相互での切り替えになってしまいます。 半角スラッシュ / を入れた直後に、入力モードを全角英数にしたうえで半角/全角キーで切り替えれば、半角英数と全角英数の切り替えができ 半角スラッシュと全角スラッシュがスムーズに入力できますが、次にカタカナひらがなキーでひらがな入力モードにし直すと前の通りで、半角(全角)英数とひらがなとの相互での切り替えになってしまいます。 ひらがな入力 → 半角英数 → ひらがな入力 → 全角英数 → 半角英数 → ひらがな入力、という感じのことをマウスで入力モードを切り替えせずに、キー操作で自由に切り替えすることはできないのでしょうか。

  • エクセルVBAでIME入力モードの制御

    エクセルVBAでIME入力モードの制御について教えてください。 Sub IMEの現在の状態() 状態 = IMEStatus() MsgBox 状態 & "です", vbInformation, "IMEの現在の状態" End Sub これでIMEStatus関数の戻り値が 1 オンの状態 2 オフの状態 4 全角ひらがな入力モード 5 全角カタカナ入力モード 6 半角カタカナ入力モード 7 全角英数入力モード 8 半角英数入力モード であることがわかりましたが、逆にIMEの状態を設定するにはどのように記述すればいいのでしょうか? たとえば、Sheets("AAA").Range("B1:B20")は「半角英数入力モード」にする場合。 DialogSheets("GGG")のダイアローグを呼び出したとき、その中のEditboxes("HHH")には「全角ひらがな入力モード」。 などです。 よろしくお願いします。

  • IMEのオンでキーボードシフトが切り替わらない

    半角/全角キー等でIMEをオンにして日本語入力を始めるとき、入力モードは「全角ひらがな」になっているにも係わらず、半角英数モードで入力されて変換できないときが多々あります。 この問題が起こらないようにする方法をご存知の方は回答をお願いいたします。 ・Windows XPから起こるようになり、Windows 7でも継続している ・MS IMEだけでなく、Google日本語入力にしても発生しているので、根本はWindowsの問題?

  • IMEの設定で質問です

    通常ひらがな入力の時キーボードの「CapsLook」キーを押すと全角英数モードに変わりますよね。再度「CapsLook」キーを押すとひらがなモードに変わるはずなんですが突然戻らなくなりました。 「カタカナひらがな」キーを押すとひらがなモードには戻るのですがなぜか「CapsLook」キーを押しても戻りません。 IMEの設定をいろいろ触ったんですがうまくいきません。 以前から癖で「CapsLook」キーを押してモード変換させてしまう癖があるので不便なんですがどなたか戻し方教えて頂けないでしょうか?

  • IME2000について・・・

    いままで半角全角ボタンを押すと、IME2000が開いて入力モードのところがひらがなになっていたのですが、突然開くたびに半角英数になってしまいました。 今は入力のたびにカタカナひらがなボタンを押してひらがなにしています。 IMEをひらいたときに初めからひらがなモードに設定するにはどうしたらいいのですか?よろしくおねがいします。

  • Microsoft IMEで全角英数入力

    Win10環境でMicrosoft IMEを使用しています。入力方式はかな入力です。 全角ひらがなモードの時に「カタカナ・ひらがな・ローマ字」キーを押すと半角英数になりますが、全角英数に変わるようにするにはどうすればいいですか? 「?」文字などを入力するときに全角英数にする必要があります。

  • IME?がおかしいのでしょうか。それともワードが・・・?

    主に文章を作るとき、ワード、メモ帳、エクセルを使うのですが、なぜかワードの時だけ、キーを打つと最初に表示されるのが全角のアルファベットになってしまいます。IMEのプロパティの「全般」での設定は「カナ入力」にして、初期入力モードを「ひらがな」にしているのですが・・・・。メモ帳とエクセルはちゃんと表示されます。なぜワードだけおかしいのでしょうか。パソコンはXP HOME ワードは2000です。みなさん、よろしくお願いします。

専門家に質問してみよう