本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[XL]日本語入力システムのオン / オフを制御する方法

文書番号: 402484

最終更新日: 1998/03/23


この資料は以下の製品について記述したものです。


この記事は、以前は次の ID で公開されていました: JP402484

概要

本文書は、Microsoft(R) Visual Basic(R) Programming System Applications Edition (以下 VBA) を使って日本語入力システム (以下 IME) を制御する方法をサンプル
モジュールと共に解説しています。

詳細

VBA では IME に対して直接制御する機能が用意されていませんので、Windows が標準 で提供している API (Application Programming Interface) の関数 IMEControl を
使用します。
Windows API についての詳細は Windows API のヘルプ (Microsoft(R) Windows(R)
Software Development Kit、Microsoft(R) Visual C++(TM) for Windows(R) などに
添付) を参照してください。

1. サンプル モジュール

ボタン コントロールを配置し、それぞれのボタンにマクロを登録します。ボタンを
クリックすると IME がオンまたはオフになります。
[GRAPHIC: ]

ボタン 1 に登録するマクロ

  Sub Button_ON_OFF()
      Select Case IMEStatus
      Case 2
          IMEControl 1
      Case Else
          IMEControl 2
      End Select
  End Sub

マクロ IMEControl

  Option Explicit
  Private Declare Function lstrcpynS2M Lib "KERNEL" Alias "lstrcpyn" _
      (ByVal lpszString1 As Long, ByVal lpszString2 As String, _
      ByVal cChars As Integer) As Long
  Private Declare Function lstrcpynM2S Lib "KERNEL" Alias "lstrcpyn" _
      (ByVal lpszString1 As String, ByVal lpszString2 As Long, _
      ByVal cChars As Integer) As Long
  Private Declare Function GlobalAlloc Lib "KERNEL" _
      (ByVal wFlags As Integer, ByVal dwBytes As Long) As Integer
  Private Declare Function GlobalFree Lib "KERNEL" (ByVal hMem As _
      Integer) As Integer
  Private Declare Function GlobalLock Lib "KERNEL" (ByVal hMem As _
      Integer) As Long
  Private Declare Function GlobalUnLock Lib "KERNEL" (ByVal hMem As _
      Integer) As Integer
  Private Declare Function SendIMEMessage Lib "WINNLS" (ByVal wnd As _
      Integer, ByVal wParam As Long) As Integer
  ' IMEControl Sub
  '
  ' 書式: IMEControl(nMode As Integer)
  ' 解説: IME を制御します。
  '
  ' nMode
  '   1 オン
  '   2 オフ
  Public Sub IMEControl(ByVal nMode As Integer)
      Dim nRet As Integer
      Dim nMode1 As Integer
      Dim nMode2 As Integer
      Dim hMem As Integer
      Dim szDat As String
      Select Case nMode
      Case 1
          nRet = IMEControlSub(1)
      Case 2
          nRet = IMEControlSub(0)
          nMode2 = 1
      Case Else
          nMode1 = 0
          nMode2 = 1
      End Select
      If nMode2 = 0 Then
          nRet = IMEControlSub(1)
          nRet = DoEvents()
          szDat = Chr$(&h10) & Chr$(0) & Chr$(nMode1) & Chr$(nMode2)
          hMem = GlobalAlloc(&h3002, 64)
          MemCopy szDat, hMem, 4
          nRet = SendIMEMessage(0, hMem)
          MemCopy hMem, szDat, 4
          nRet = GlobalFree(hMem)
      End If
  End Sub
  Function IMEControlSub(ByVal nFunc As Integer) As Integer
      Dim nRet As Integer
      Dim hMem As Integer
      Dim szDat As String
      nRet = DoEvents()
      If nFunc = -1 Then
          szDat = Chr$(5) & Chr$(0) & Chr$(0) & Chr$(0)
      ElseIf nFunc <> 0 Then
          szDat = Chr$(4) & Chr$(0) & Chr$(nFunc) & Chr$(0)
      Else
          szDat = Chr$(4) & Chr$(0) & Chr$(nFunc) & Chr$(0)
      End If
      hMem = GlobalAlloc(&h3002, 64)
      MemCopy szDat, hMem, 4
      nRet = SendIMEMessage(0, hMem)
      MemCopy hMem, szDat, 4
      nRet = GlobalFree(hMem)
      IMEControlSub = Asc(MidB(szDat, 3, 1))
  End Function
  Private Sub MemCopy(vSrc As Variant, vDst As Variant, wBytes As _
      Integer)
      Dim i As Integer
      Dim lAddG As Long
      Dim lRet As Long
      Dim szTmp As String
      If VarType(vSrc) = 8 And VarType(vDst) = 2 Then
          lAddG = GlobalLock(vDst)
          For i = 0 To wBytes - 1
              szTmp = MidB(vSrc, i + 1, 1) & Chr$(0)
            lRet = lstrcpynS2M(i + lAddG, szTmp, 2)
          Next
          lRet = GlobalUnLock(vDst)
      ElseIf VarType(vSrc) = 2 And VarType(vDst) = 8 Then
          lAddG = GlobalLock(vSrc)
          vDst = ""
          szTmp = Chr$(0) & Chr$(0)
          For i = 0 To wBytes - 1
              lRet = lstrcpynM2S(szTmp, lAddG + CLng(i), 2)
              vDst = vDst & LeftB(szTmp, 1)
          Next
          lRet = GlobalUnLock(vSrc)
      Else
          Stop
      End If
  End Sub

2. 関連情報


文書番号: 402586
タイトル: Microsoft Excel デベロッパーズ キット」のご紹介
文書番号: 402466
タイトル: VBA や Excel 4.0 マクロから Windows API を使用する際の注意点

3. テクニカル サポート窓口からのお願い

基本的にはプログラミング テクニックやマクロ作成のアドバイス、コンサルティング はサポート窓口で行う内容ではありません。一つの機能を実現させるための手法、
アルゴリズムおよびコーディング テクニックは一つとは限りませんし、サポート
スタッフが提供する情報が必ずしも最適であるという保証はありません。
このようなお客様固有の問題は弊社のサポート範囲外とさせていただきます。
なお、普遍性の高い情報に関してはサポート情報で提供しています。

Windows API に関連した Excel 5.0 のマクロのサポート

テクニカル サポートでは、プログラム中から Windows API を呼び出すため
の一般的な Declare 宣言の記述方法はサポートします。しかし、個々の Windows API における宣言方法や Windows API を用いたプログラミング テクニックおよびデバッ グといったお客様固有の問題は、誠に申し訳ございませんが弊社のサポート範囲外
とさせていただきます。

Keywords: KBHOWTO KB402484
Technology: kbExcel500 kbExcelSearch kbExcelWinSearch

inserted by FC2 system