エクセルVBAでNumLockキーの状態を確認する

このQ&Aのポイント
  • エクセルVBAでNumLockキーの状態を確認できる方法
  • 64ビットのWindowsでのエクセルVBAでNumLockキーの状態を確認する際の問題点と解決策について
  • エクセルVBAでNumLockキーの状態を確認し、必要に応じてオン・オフを切り替える方法
回答を見る
  • ベストアンサー

エクセルVBAでNumLockキーの状態を確認する

エクセルVBAでNumLockキーの状態を確認することはできますでしょうか? 検索の結果 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1352157463 のページを見つけましたが、 Private Declare Sub GetKeyboardState Lib "user32" (pbKeyState As Byte) でエラーになってしまいます。 なぜかと検索してみると、どうやら私のWindows が64ビットだからのようです。 64ビットに対応し、EXCEL、 エクセルVBAでNumLockキーの状態を確認し、offだったらonにするということが出来るでしょうか。 勿論、VBAでSendKeysを連発するとNamLockキーがOffになってしまう時があるということや、APIのSendInput 、keybd_eventイベントもあると思いますが、何が適当なのか、64ビットに対応させるのはどうするのか、教えて頂けるとありがたいです。よろしくお願いします。

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.5

こんにちは、#2#4です。 迷ったのですけれど、 このスレ読んで誤解する人いると悲しいので 指摘しておきますね。  > Windows7には対応していないようなので これは間違いです。 #3さんは、【64ビット版 Windows7 & 32ビット版 Office】環境で"問題なく動く"と仰っています。 #1さんも同様のことを仰っているのだと思います。 #2#4で私は【64ビット版 Windows7 & 64ビット版 Office】環境で Win32APIを使えるようにするにはどうしたらいいか書いています。 今回3つのサンプルコードが紹介されていますが (順に) ↓最初のご質問 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1352157463 ↓#3さんご紹介のもの http://www.accessclub.jp/samplefile/samplefile_214.htm ↓#4へのレスでkichi4182さんがあらたにご提示なさったもの http://okwave.jp/qa/q5156553.html (#3と#4は、Functionで書くかSubで書くかの違いだけで まったく同じものですから、実際には2種類なのですけれど) 今回のこのスレッド全体としては  【64ビット版 Windows7 & 32ビット版 Office】環境  【64ビット版 Windows7 & 64ビット版 Office】環境 どのサンプルコードも、  "問題なく機能することを確認した" という話になっているのです。  【Windows7】 はこの際関係なくて(問題ではなくて)、  【64ビット版 Office】 では、    そのままの記述ではAPIが通らないから     実際に動く様にするために    どうしたらいいか、という話を書いているのです。 今回紹介された3つのサンプルコード、のいすれも、ちゃんと動きます。   Excel でも   Access でも   ユーザーフォームモジュール でも  勿論   標準モジュールでも 何度やっても動きます。 いくつかのイベントトリガーで NUMLOCK がかかることを実際に試してもいます。 今回紹介された3つのサンプルコードの場合、 【64ビット版 Office】 で動くようにするには 単純に 1■ リンク先のサンプルコードを丸ごとそのままコピペして(コンパイルエラーは[OK]で無視して) 2■ Ctrl + H で置換ダイアログを表示して    "Declare" を "Declare PtrSafe" に    モジュールごと、すべて置換する これだけで、最低限(*)の動作確認はできます。 (例えば、プロシージャにカーソルを当てて F5 キーを押すだけ) 今回紹介された3つのサンプルコード、のいすれも、ちゃんと動きます。 動作を確認出来ないということのようなので、あらためて単純化して書いてみました。 (*)推奨された手順としては、続いて、Long型の置換が必要だということは#4で触れています。 要は 【Office 2010 64ビット版】だけは、API の書き方が他のバージョンとは違うってだけの話 ですので、ご理解いただきたいです。

kichi4182
質問者

お礼

何度もありがとうございます。 私が  > Windows7には対応していないようなので と書いたのは、 http://support.microsoft.com/kb/177674/ja の詳細にWindows7が書かれていないのを見て、そう思ってしまいました。誤解させてしまったようで、大変申し訳ありません。 今回は 取りあえず注意喚起のMsgboxを使い、少しずつでも勉強しながら対応していこうと思います。 ありがとうございました。

その他の回答 (5)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.6

さすがにOfficeの64bitバージョンをインストールして 検証する元気はありません。 MS社自身、32bit バージョンの使用を推奨しています。 開発目的ならともかく、実務に使うのなら周囲の環境が整っている32bit かと。 64 ビット版の Office 2010 http://technet.microsoft.com/ja-jp/library/ee681792.aspx

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.4

#2です。 Office 2010 バージョン:14.0.6123.5001 (64ビット) (Win7・64ビット) ↑この環境では、 PtrSafe 抜きで正しいDeclare文をタイプし終えてキャレットを動か(Enter)した瞬間にコンパイルエラーでした。 回答No.3 nicotinism さんご紹介の「強制的にNumLockキーをオンにするプロシージャ」 も、Declaration 宣言部に修正(というより対策?)を加えた上で、動作を確認しましたので、 せっかくなので、対策後の記述を載せておきます。 ' ' =========================以下、筆者加筆によるもの   'API declarations:   Private Declare PtrSafe Function GetVersionEx Lib "kernel32" _     Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As LongPtr   Private Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, _     ByVal dwFlags As LongPtr, ByVal dwExtraInfo As LongPtr)   Private Declare PtrSafe Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As LongPtr   Private Declare PtrSafe Function SetKeyboardState Lib "user32" (lppbKeyState As Byte) As LongPtr ' ' 以上============================================= (1)  Declare → Declare PtrSafe 4カ所置換 (2)  Long → LongPtr 5か所置換 手元の環境では(1)は必須のようですが、(2)はそのままでも動くようです。一応ヘルプに従ったつもりです。 ヘルプを読んだ私の解釈では、2010/VBA7 環境では 32ビット/64ビット 共通で動く記述のようですが 32ビット環境での動作はこちらで確認していません。 大事な話が後になりましたが、 > どうやら私のWindows が64ビットだからのようです。 というのを勝手に拡大解釈して、Office も2010、64ビット、、、 だとすると、話が理解しやすい、、、という憶測を前提にレスをしています。 違っていたら(他勘違いなどあれば)ただのお騒がせ、その時はすみません。 でも、なんかの役に立つかも知れませんので、ヘルプの引用も、最後に載せておきます。 ==============以下引用 LongPtr - VBA に可変の型エイリアス LongPtr が追加されました。LongPtr が解決された後の実際のデータ型は、コードが実行される Office のバージョンによって異なります。LongPtr は 32 ビット版 Office の場合は Long、64 ビット版 Office の場合は LongLong に解決されます。ポインターおよびハンドルには LongPtr 型を使用してください。 LongLong - LongLong データ型は 64 ビットの符号付き整数型で、64 ビット版の Office でのみ使用できます。64 ビットの整数には LongLong 型を使用してください。LongLong (64 ビット プラットフォーム上の LongPtr も含む) をより小さいサイズの整数型に明示的に割り当てるには、変換関数を使用する必要があります。LongLong をより小さいサイズの整数型に暗黙的に変換することはできません。 PtrSafe - PtrSafe は、Declare ステートメントを 64 ビット版の Office で実行しても安全であることを示すキーワードです。 コードを 64 ビット版 Office で実行する場合は、すべての Declare ステートメントに PtrSafe キーワードを含めることが必須となりました。PtrSafe キーワードを単に Declare ステートメントに追加しただけでは、その Declare ステートメントの実行対象が 64 ビット環境であると指定したにすぎません。そのうえで、ステートメント内のデータ型 (戻り値やパラメーターなど) のうち 64 ビット値を格納する必要があるものをすべて、64 ビット値を格納できるように修正する必要があります。 以上引用============== それでは失礼します。

kichi4182
質問者

お礼

ありがとうございます。 とりあえず、対象セルを選んだ時にMsgBoxで注意を促すようにして時間稼ぎをすることにしました。 http://okwave.jp/qa/q5156553.html 上記を参考にして組んでみましたが、Windows7には対応していないようなので、7に対応させることを考えてみたいと思います。 しかし、よく分かっていないので、あきらめようかとも思っています。 もうしばらく粘ってみますが。。。。

kichi4182
質問者

補足

すみません。書き忘れておりましたが、EXCEL(Office 2010)も64ビット版です。 あと、ユーザーフォームは作っていないので、すべて標準モジュールでの話です。

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.3

質問者さんが見つけられたページのコードで問題なく動きましたけどね? 当方 Windows7 64bit & Office 2010 32bit です。 NumLock をOn にするのは少し面倒です。 下記サイトのコードは標準モジュール上で 丸コピペで機能するのをExcel上で確認しています。 http://www.accessclub.jp/samplefile/samplefile_214.htm ※ Option Compare Database はAccessでの話なので削除 Option Explicit は重複して宣言しないように

kichi4182
質問者

補足

すみません。書き忘れておりましたが、EXCEL(Office 2010)も64ビット版です。 あと、ユーザーフォームは作っていないので、すべて標準モジュールでの話です。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

Private Declare PtrSafe Sub GetKeyboardState Lib "user32" (pbKeyState As Byte) ですね。 PtrSafe をVBAのヘルプで検索して、64Bit版での32APIの扱い方、一度調べておいた方がよいかと。

kichi4182
質問者

お礼

ありがとうございます。勉強します。

  • foomufoomu
  • ベストアンサー率36% (1018/2761)
回答No.1

64ビットOSであることは、関係ありません。EXCEが32ビットソフトなので、EXCEL内のマクロも32ビット互換モードで動いています。むしろ64ビットのAPI呼び出しなどを使うと動かなくなるはずです。 どんなエラーが出ているのですか? その内容によって、それ相応の対応が必要です。 API呼び出しは、Declare文が必要なのですが、書いてありますか? フォームモジュールでなく、標準モジュールに書いてみるとどうなりますか? (参考) http://www.excellenceweb.net/vba/api/what_windows_api.html

kichi4182
質問者

補足

すみません、エラー内容です。 『このプロジェクトのコードは、64ビットシステムで使用するために更新する必要があります。Declareステートメントの確認および更新を行い、次にDeclareステートメントにPtrSafe属性を設定してください。』 よろしくお願いします。

関連するQ&A

  • エクセル NUMLOCKキーの常時オンについて

    表題の質問をさせていただきます。 仕事場に入っているシステムがキーボード上部のボタンに様々な機能を割り当てていまして、システム独自の機能を有するように設計されています。  割り当てられているのは↓です。   デスクトップ用キーボードで、ファンクションキーやテンキー上部のキー(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です。よろしくお願いいたします。

  • 日本語入力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にしたいのですが、記述の何が足らないかお教えいただけませんか。 よろしく、お願いします。

  • NumLockの制御について

    VB5.0(SP3)で次のプログラムを作成しました。 キーボードからNumLockキーを押して状態をOFFにすると、プログラム側(タイマー関数内)でその状態をチェックし、状態をONに戻します。 しかし、次の動作をした時に問題が発生しました。 但し、この問題は、OSがWindowsNT4.0(SP6)の端末で発生するのですが、Windows2000/XP では発生しませんでした。 起動したフォーム画面にフォーカスがある間は問題ないのですが、フォーカスを外した状態でNumLockキーを押して状態をOFFにすると、ON/OFFが繰り返されてしまいます。 この時に、マウスをフォーム画面の上に持ってくるとその繰返し処理が止まります。 もちろん再度 NumLockキーを押しても止まります。 OSの問題なのでしょうか?それともプログラムが悪いのでしょうか? 下記にそのプログラムを表記します。 <プログラム> フォーム(Form1)にタイマー(Timer1)を貼りつけただけです。 (Module1.bas) Option Explicit Public Const VK_NUMLOCK = &H90 Public Const KEYEVENTF_KEYUP = &H2 Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, _                        ByVal bScan As Byte, _                        ByVal dwFlags As Long, _                        ByVal dwExtraInfo As Long) (Form1.frm) Option Explicit Private Sub Form_Load()   Timer1.Interval = 100 End Sub Private Sub Timer1_Timer()   On Error Resume Next   If GetKeyState(VK_NUMLOCK) = 0 Then     keybd_event VK_NUMLOCK, 0, 0, 0     keybd_event VK_NUMLOCK, 0, KEYEVENTF_KEYUP, 0   End If End Sub

  • Excel VBA で CTRLキーを送る方法

    EXCEL VBA で他のアプリケーションにキーをコードを送り制御したく、Sendkeys を使ってみましたが、CTRLキー(単一キー)の送信が出来ません。Sendkeys "^", 1 では無反応。 制御されるアプリは右のCTRLキーと左のCTLキーではことなった動作をします。出来れば右のCTRLキー、左のCTLキーの送信方を教えてください。 VBAで負荷でしたら、Shell関数で呼び出せるようなものはありませんでしょうか。

  • (vba)他のアプリケーションの右ctrlキーを押すには?

    excelのvbaを使って、他のアプリケーション(3270エミュレータ)上で、実行キーに割り当てられている「右ctrlキー」または「テンキーのenterキー」を押すようにしたくて、sendkeys "^"やsendkeys "{enter}"を使ってみましたが、うまくいきません。どうしたら良いでしょうか?

  • いろんなキーでNUMLOCKがONになってしまう

    右shiftやEnter、Pauseその他いくつかのキーを押すとNumlockがONになってしまいます。ONになるキーを再度押すとOFFになります。NECのLaVie(NotePC)でXPです。どうやらユーザ補助オプションの切り替えキーの設定らしいのですが確認しても何も設定されていません。何が原因でどこを設定すればよろしいですか?

  • Excel VBA Escキー押下をコードで表わすと…

    Excel VBA Escキー押下をコードで表わすと… Excel2003を使用しています。 ある列をダブルクリックすると、指定した範囲のセルを塗りつぶすイベントマクロを作成しました。 ダブルクリックで塗りつぶされた後は、セルが編集状態になっているので、Escキーを押して編集状態を解除していましたが、Escキーを押して編集状態を解除するところまでをコードに書いたらどうかと思い、塗りつぶしを指定しているコードの後に、『SendKeys "{ESC}"』と追加してみたのですが、追加する前と同じ状況で、編集状態のままでした。 Enterや↓キーを押した場合を試しに書いてみると、塗りつぶされた後、1つ下のセルに移動しました。 コードを追加した場所がいけないのか、それとも、使い方が間違っているのか…?? どなたかわかる方がいらっしゃいましたら、教えていただけないでしょうか。 よろしくお願いします。

  • ACCESS+VBA SendKeysの代わり

    お世話になります。 Access2010で、Sendkeysを使わずに、F2をキー送信できませんでしょうか? 簡単ですが以下の様にしています。 --------------------------------------------------------- Private Sub テキストボックス_GotFocus() 'SendKeys "{F2}" --------------------------------------------------------- 有名な話しの様ですが、SendKeysを使うとNumLockがon/offされてしまい困っています。 何か、代替案または、元に戻す方法がございましたら、ご教示ください。 (調べて試したのですが、上手くいきませんでした。) お手数ですが、宜しくお願い致します。

  • テンキー用キー(ノートPC)の矢印モード

    ノートPC(let's note)を使用していますが、Ctrl+NumLock で NumLock ON 時、テンキーに割り当てられるキーが方向キー等になります。 例えば:U:左、K:下、O:右、8:上。 この状態を認識する方法と解除できる方法ごご存知ないでしょうか? 単純に Numlock ON/OFF だけならGetKeyState() とSendInput() で出来るのですが...。 メーカに問い合わしても?と言う回答でしたので、お願いします。

  • ウインドウズ7 NumLockを固定させるには どういう設定をすればい

    ウインドウズ7 NumLockを固定させるには どういう設定をすればいいのでしょうか? OSはウインドウズ7 32ビット正規版です 前はXPのPCを使っていましたが NumLockキーは電源を落として 立ち上げても キーがONのまま固定されていたので 大変便利でしたが 今回の新しいPCは電源を落として 立ち上げると NumLockが毎回OFFになってしまうので 大変不便です NumLockキーをONにしたまま固定するには どういう設定方法をすればいいのでしょうか? わかる方 設定方法を教えて下さい よろしくお願い致します。

専門家に質問してみよう