[[20030610223504]] 『IMEをマクロで変更』(nora) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『IMEをマクロで変更』(nora)
 お世話になってますm(_ _)m
 住所入力で郵便番号変換を使用してますがIMEの変換モードの変更(一般→人名/地名)
 をマクロやVBAを使って出来るのでしょうか?

 みーくんパパの仕事部屋
http://www.mitene.or.jp/~sugisita/family/papa/vb/
 のVBコードをそのまま引用しています。

 こういうのを見ると、API使えばいろいろできるんだろうな〜と
 思ったりしますけど、一般人には必要なさそうですね。

 そちらへはご迷惑をかけないようにお願いします。

 ちなみに私は Sub main を追加しただけです(汗)。

 使い方は日本語入力がオンのとき、mainを実行するだけです。
 いまは人名/地名になるように定数を設定しています。
 なぜが一度セルを移動しないと変更しないため、selectを使ってます。

 (ramrun)スレ上げ委員会 2連休


 Option Explicit

 '// 入力モード
 Public Const IME_CMODE_NATIVE = &H1
 Public Const IME_CMODE_CHINESE = IME_CMODE_NATIVE
 Public Const IME_CMODE_HANGEUL = IME_CMODE_NATIVE
 Public Const IME_CMODE_HANGUL = IME_CMODE_NATIVE

 Public Enum IME_CMODE_ENUM
    IME_CMODE_ALPHANUMERIC = &H0
    IME_CMODE_JAPANESE = IME_CMODE_NATIVE
    IME_CMODE_KATAKANA = &H2               '// カタカナ(IME_CMODE_NATIVEの指定時のみ有効)
    IME_CMODE_LANGUAGE = &H3
    IME_CMODE_FULLSHAPE = &H8              '// 全角
    IME_CMODE_ROMAN = &H10                 '// ローマ字入力
    IME_CMODE_CHARCODE = &H20
    IME_CMODE_HANJACONVERT = &H40
    IME_CMODE_SOFTKBD = &H80               '// ソフトキーボード
    IME_CMODE_NOCONVERSION = &H100
    IME_CMODE_EUDC = &H200
    IME_CMODE_SYMBOL = &H400
    IME_CMODE_FIXED = &H800
 End Enum

 '// 変換モード
 Public Enum IME_SMODE_ENUM
    IME_SMODE_NONE = &H0                   '// 無変換
    IME_SMODE_PLAURALCLAUSE = &H1          '// 人名/地名
    IME_SMODE_SINGLECONVERT = &H2          '// シングルキャラクタモード(?)
    IME_SMODE_AUTOMATIC = &H4              '// 自動
    IME_SMODE_PHRASEPREDICT = &H8          '// 次のフレーズを予測(?)
    IME_SMODE_CONVERSATION = &H10          '// 話し言葉優先
 End Enum

 '// IME クラスの既定のウィンドウハンドルを取得
 Public Declare Function ImmGetDefaultIMEWnd Lib "Imm32.dll" (ByVal hwnd As Long) As Long

 '// 指定されたウィンドウに関連付けられている入力コンテキストを取得
 Public Declare Function ImmGetContext Lib "Imm32.dll" (ByVal hwnd As Long) As Long

 '// 入力コンテキストを解放し、コンテキスト内の関連メモリのロックを解除 (ImmGetContextを実行後は必ず起動)
 Public Declare Function ImmReleaseContext Lib "Imm32.dll" (ByVal hwnd As Long, ByVal hIMC As Long) As Long

 '// IMEの入力・変換モードを設定
 Public Declare Function ImmSetConversionStatus Lib "Imm32.dll" (ByVal hIMC As Long, ByVal fdwConversion As IME_CMODE_ENUM, ByVal fdwSentence As IME_SMODE_ENUM) As Long

 '// IMEの入力・変換モードを取得
 Public Declare Function ImmGetConversionStatus Lib "Imm32.dll" (ByVal hIMC As Long, lpfdwConversion As IME_CMODE_ENUM, lpfdwSentence As IME_SMODE_ENUM) As Long

 '==============================================================================
 '   IMEの入力・変換モードをン定する
 '------------------------------------------------------------------------------
 '   引 数  hwnd            --  対象ウィンドウのハンドル
 '           lngConversion   --  入力モード
 '           lngSentence     --  変換モード
 '==============================================================================
 Public Function SetIMEConversionStatus(ByVal hwnd As Long, _
                                       ByVal enmConversion As IME_CMODE_ENUM, _
                                       ByVal enmSentence As IME_SMODE_ENUM) As Long

    Dim hwndIME         As Long
    Dim hIMC            As Long

    '-- IMEのデフォルトウィンドウのハンドルを取得
    hwndIME = ImmGetDefaultIMEWnd(hwnd)

    If hwndIME Then

        '-- 入力コンテキストの取得
        hIMC = ImmGetContext(hwndIME)

        If hIMC Then

            '-- 入力・変換モードの設定
            SetIMEConversionStatus = ImmSetConversionStatus(hIMC, enmConversion, enmSentence)

            '-- コンテキストの開放
            ImmReleaseContext hwndIME, hIMC

        End If

    End If

 End Function

 Sub main()
    SetIMEConversionStatus Application.hwnd, IME_CMODE_JAPANESE Or IME_CMODE_ALPHANUMERIC Or IME_CMODE_ROMAN, IME_SMODE_PLAURALCLAUSE
    ActiveCell.Select
 End Sub

 ramrunさん 御礼が大変おそくなりました 申し訳ありません
 別件で検索中 回答いただいている事に 気が付きました^^;;;;;

 早速 標準モジュールにコピペして実行したところ(環境WinME Excel2000)
 実行時エラー '783': オブジェクトはこのプロパティまたはメソットをサポートしていません
 となりました

 ご案内のHP(みーくんパパの仕事部屋)も拝見して エラーはVB6.0関係かな?
 と思ったりしてますが・・・ 再度のご指導おねがいいたします(nora)

 2000ではウィンドウハンドルが取得できないようです(汗)。
 Application.hwndがエラーでしたね。
 どうもウチの環境で動いていたのは偶然だったみたいです。

 FindWindowというAPIを使用しなければいけないようなので、組み込みました。
 こんどは大丈夫だと思います。多分...

 あとはSetIMEConversionStatusに渡す引数を適当に変更して、自分仕様にしてください。
 サンプルコードでは、Sheetの2列目(B列)で入力モードが ひらがな、
 変換モードが 人名/地名 になり、それ以外の列では 一般 に戻ります。

 ちなみにXPではうまく動作しませんでした。2000とはIMEの仕様が違うようです。
 (人名/地名 にはできるが、一般 に戻らなかった)
 では。
 (ramrun)差し替え〜

 '
 '↓は該当するSheetへ
 '

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Target.Column = 2 Then
        '日本語、全角、ローマ字、人名/地名
        SetIMEConversionStatus FindWindow("XLMAIN", Application.Caption), _
        IME_CMODE_JAPANESE Or IME_CMODE_FULLSHAPE Or IME_CMODE_ROMAN, _
        IME_SMODE_PLAURALCLAUSE
    Else
        '日本語、全角、ローマ字、一般
        SetIMEConversionStatus FindWindow("XLMAIN", Application.Caption), _
        IME_CMODE_JAPANESE Or IME_CMODE_FULLSHAPE Or IME_CMODE_ROMAN, _
        IME_SMODE_PHRASEPREDICT
    End If

 End Sub

 '
 '↓は標準モジュールへ
 '

 Option Explicit

 Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

 '// 入力モード
 Public Const IME_CMODE_NATIVE = &H1
 Public Const IME_CMODE_CHINESE = IME_CMODE_NATIVE
 Public Const IME_CMODE_HANGEUL = IME_CMODE_NATIVE
 Public Const IME_CMODE_HANGUL = IME_CMODE_NATIVE
 Public Enum IME_CMODE_ENUM
    IME_CMODE_ALPHANUMERIC = &H0
    IME_CMODE_JAPANESE = IME_CMODE_NATIVE
    IME_CMODE_KATAKANA = &H2               '// カタカナ(IME_CMODE_NATIVEの指定時のみ有効)
    IME_CMODE_LANGUAGE = &H3
    IME_CMODE_FULLSHAPE = &H8              '// 全角
    IME_CMODE_ROMAN = &H10                 '// ローマ字入力
    IME_CMODE_CHARCODE = &H20
    IME_CMODE_HANJACONVERT = &H40
    IME_CMODE_SOFTKBD = &H80               '// ソフトキーボード
    IME_CMODE_NOCONVERSION = &H100
    IME_CMODE_EUDC = &H200
    IME_CMODE_SYMBOL = &H400
    IME_CMODE_FIXED = &H800
 End Enum

 '// 変換モード
 Public Enum IME_SMODE_ENUM
    IME_SMODE_NONE = &H0                   '// 無変換
    IME_SMODE_PLAURALCLAUSE = &H1          '// 人名/地名
    IME_SMODE_SINGLECONVERT = &H2          '// シングルキャラクタモード(?)
    IME_SMODE_AUTOMATIC = &H4              '// 自動
    IME_SMODE_PHRASEPREDICT = &H8          '// 次のフレーズを予測(?)
    IME_SMODE_CONVERSATION = &H10          '// 話し言葉優先
 End Enum

 '// IME クラスの既定のウィンドウハンドルを取得
 Public Declare Function ImmGetDefaultIMEWnd Lib "Imm32.dll" (ByVal hwnd As Long) As Long

 '// 指定されたウィンドウに関連付けられている入力コンテキストを取得
  Public Declare Function ImmGetContext Lib "Imm32.dll" (ByVal hwnd As Long) As Long

 '// 入力コンテキストを解放し、コンテキスト内の関連メモリのロックを解除 (ImmGetContextを実行後は必ず起動)
 Public Declare Function ImmReleaseContext Lib "Imm32.dll" (ByVal hwnd As Long, ByVal hIMC As Long) As Long

 '// IMEの入力・変換モードを設定
 Public Declare Function ImmSetConversionStatus Lib "Imm32.dll" (ByVal hIMC As Long, ByVal fdwConversion As IME_CMODE_ENUM, ByVal fdwSentence As IME_SMODE_ENUM) As Long

 '// IMEの入力・変換モードを取得
 Public Declare Function ImmGetConversionStatus Lib "Imm32.dll" (ByVal hIMC As Long, lpfdwConversion As IME_CMODE_ENUM, lpfdwSentence As IME_SMODE_ENUM) As Long

 '==============================================================================
 '   IMEの入力・変換モードをン定する
 '------------------------------------------------------------------------------
 '   引 数  hwnd            --  対象ウィンドウのハンドル
 '           lngConversion   --  入力モード
 '           lngSentence     --  変換モード
 '==============================================================================
 Public Function SetIMEConversionStatus(ByVal hwnd As Long, _
                                       ByVal enmConversion As IME_CMODE_ENUM, _
                                       ByVal enmSentence As IME_SMODE_ENUM) As Long
    Dim hwndIME         As Long
    Dim hIMC            As Long

    '-- IMEのデフォルトウィンドウのハンドルを取得
    hwndIME = ImmGetDefaultIMEWnd(hwnd)
    If hwndIME Then

        '-- 入力コンテキストの取得
        hIMC = ImmGetContext(hwndIME)
        If hIMC Then

            '-- 入力・変換モードの設定
            SetIMEConversionStatus = ImmSetConversionStatus(hIMC, enmConversion, enmSentence)

            '-- コンテキストの開放
            ImmReleaseContext hwndIME, hIMC
        End If
    End If
 End Function

 あ゛〜 私の勘違いでしたね。
 XPでもきちんと使えます。
 Application.hwndは2000ではエラーですがXPなら問題ないようです。
 XPで新たに追加されたようで。

 私のテスト環境でどうしてうまくいかなかったかというと、
 WindowsXPの英語版をグローバルIMEで日本語にして使っていたから、
 仕様が変わってしまっていたようです。
 日本語版では問題なく動作します。

 関係ないですけどおもしろいの見つけたんでage。
 IEMの日本語入力ON/OFFとローマ字/かなの切り替え
 IME2000では{kana}の後ろの,10は不要。

 Sub test()
    SendKeys "%{kanji}"
    SendKeys "{kana}", 10
 End Sub

 (ramrun)お昼〜

 ramrunさん 出来ました!

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Target.Address = Range("C6").Address Then
        '日本語、全角、ローマ字、人名/地名
        SetIMEConversionStatus FindWindow("XLMAIN", Application.Caption), _
        IME_CMODE_JAPANESE Or IME_CMODE_FULLSHAPE Or IME_CMODE_ROMAN, _
        IME_SMODE_PLAURALCLAUSE
    Else
        '日本語、全角、ローマ字、一般
        SetIMEConversionStatus FindWindow("XLMAIN", Application.Caption), _
        IME_CMODE_JAPANESE Or IME_CMODE_FULLSHAPE Or IME_CMODE_ROMAN, _
        IME_SMODE_PHRASEPREDICT
    End If

 End Sub

 IEMの日本語入力ON/OFFとローマ字/かなの切り替え も便利に使えそうですね
 長期にわたりありがとうございました(nora)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.