アプリ版:「スタンプのみでお礼する」機能のリリースについて

表題の質問をさせていただきます。

仕事場に入っているシステムがキーボード上部のボタンに様々な機能を割り当てていまして、システム独自の機能を有するように設計されています。
 割り当てられているのは↓です。
  デスクトップ用キーボードで、ファンクションキーやテンキー上部のキー(Num / * -)

このシステムを利用しながらエクセルも同じPCで稼動させています。
ファンクションキーはさほど困らないのですが、NumLockキーをシステムで利用するので頻繁にONになったりOFFになったりします。

システムからエクセルに変更をした際にNumLockがオフになっていることが確率的に半数あり、その際はテンキー入力をすると あらぬ位置に入力セルが飛んでいってしまい困っています。

あらぬ位置に飛んでいってしまったときはマクロ登録してあるボタンで所定の位置に戻ってくるように設定しています。
 ウインドウ枠の固定で画面を上下に分割していて 上部にマクロボタンを設置してあります。

いろいろと調べてWorkbookやWorksheetのActivateイベントに↓を記述しました。
Set WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys "{NUMLOCK}"

しかし、システムから切り替わった場合には動作しませんでしたし、エクセル内での動きとしてもシートチェンジ毎にONとOFFになってしまい、いい動きにはなりませんでした。

システムから切り替わったタイミングをと思い、SelectionChangeにも記述しましたが、当然ながらクリックするたびにON・OFFになってしまい…。

どうにか、エクセルがアクティブになっている時は NumLockを常時ONにする方法はないでしょうか。
お知恵を拝借したく投稿しました。

エクセル2003です。よろしくお願いいたします。

A 回答 (2件)

#1の回答者です。


#どうやら、キーボードが壊れているようですね。

>上部のボタンに様々な機能を割り当てていまして

を読み落としていました。#1の仮想キーボードで、その都度、直すしかないかもしれません。イベント・ドリブン型は、キーの変わるタイミングを良く観察して選ぶと良いかと思います。シートに数式などがあれば、例えば、Calculate イベントでもよいと思います。
    • good
    • 0
この回答へのお礼

お返事が遅れ申し訳ありません。
ご回答いただきありがとうございます。

さて、やはり難しそうですね。
参考サイトやお教えいただいた方法でじっくり検討してみます。
ありがとうございました。

お礼日時:2009/07/28 20:36

こんにちは。



どうやら、キーボードが壊れているようですね。
ソフトでやっても付け焼き刃かもしれません。キーボードをメーカーに見てもらったほうがよいのでは?

>Set WshShell = CreateObject("WScript.Shell")
>WshShell.SendKeys "{NUMLOCK}"
これですと、トグルになっていますから、いずれにしても、KeyboardState を取らないといけないはずです。
もしかしたら、以下のものでも上手く行かないかもしれません。


'-------------------------------------------
'標準モジュール/NumLock On のみ
'-------------------------------------------

'Option Explicit

Private Type OSVERSIONINFO
  dwOSVersionInfoSize As Long
  dwMajorVersion As Long
  dwMinorVersion As Long
  dwBuildNumber As Long
  dwPlatformId As Long
  szCSDVersion As String * 128
 End Type
  

  Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
  Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
  Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
  Private Declare Function SetKeyboardState Lib "user32" (lppbKeyState As Byte) As Long
  
  
  Const VK_NUMLOCK = &H90
  Const KEYEVENTF_EXTENDEDKEY = &H1
  Const KEYEVENTF_KEYUP = &H2
  Const VER_PLATFORM_WIN32_NT = 2
  Const VER_PLATFORM_WIN32_WINDOWS = 1
Public Sub NumLock_ON_Prc()
  Dim OSVersion As OSVERSIONINFO
  Dim NumLockState As Boolean
  OSVersion.dwOSVersionInfoSize = Len(OSVersion)
  GetVersionEx OSVersion
  Dim keys(0 To 255) As Byte
  GetKeyboardState keys(0)
  NumLockState = keys(VK_NUMLOCK)
  'NumLock: Off to On
  If NumLockState <> True Then
    'Win95/98
    If OSVersion.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then
      keys(VK_NUMLOCK) = 1
      SetKeyboardState keys(0)
    'WinNT/2K/XP
    ElseIf OSVersion.dwPlatformId = VER_PLATFORM_WIN32_NT Then
      'Simulate Key Press
      keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
      'Simulate Key Release
      keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
    End If
  End If
End Sub
  

参考URL:http://support.microsoft.com/kb/177674/ja
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています