dポイントプレゼントキャンペーン実施中!

エクセルVBAでNumLockキーの状態を確認することはできますでしょうか?

検索の結果
http://detail.chiebukuro.yahoo.co.jp/qa/question …
のページを見つけましたが、

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ビットに対応させるのはどうするのか、教えて頂けるとありがたいです。よろしくお願いします。

A 回答 (6件)

こんにちは、#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 …
↓#3さんご紹介のもの
http://www.accessclub.jp/samplefile/samplefile_2 …
↓#4へのレスでkichi4182さんがあらたにご提示なさったもの
http://oshiete.goo.ne.jp/qa/5156553.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 の書き方が他のバージョンとは違うってだけの話
ですので、ご理解いただきたいです。
    • good
    • 0
この回答へのお礼

何度もありがとうございます。

私が

 > Windows7には対応していないようなので

と書いたのは、
http://support.microsoft.com/kb/177674/ja
の詳細にWindows7が書かれていないのを見て、そう思ってしまいました。誤解させてしまったようで、大変申し訳ありません。

今回は 取りあえず注意喚起のMsgboxを使い、少しずつでも勉強しながら対応していこうと思います。

ありがとうございました。

お礼日時:2012/10/01 14:34

さすがにOfficeの64bitバージョンをインストールして


検証する元気はありません。

MS社自身、32bit バージョンの使用を推奨しています。
開発目的ならともかく、実務に使うのなら周囲の環境が整っている32bit かと。

64 ビット版の Office 2010
http://technet.microsoft.com/ja-jp/library/ee681 …
    • good
    • 0

#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 ビット値を格納できるように修正する必要があります。

以上引用==============

それでは失礼します。

この回答への補足

すみません。書き忘れておりましたが、EXCEL(Office 2010)も64ビット版です。

あと、ユーザーフォームは作っていないので、すべて標準モジュールでの話です。

補足日時:2012/09/28 13:16
    • good
    • 0
この回答へのお礼

ありがとうございます。

とりあえず、対象セルを選んだ時にMsgBoxで注意を促すようにして時間稼ぎをすることにしました。

http://okwave.jp/qa/q5156553.html

上記を参考にして組んでみましたが、Windows7には対応していないようなので、7に対応させることを考えてみたいと思います。

しかし、よく分かっていないので、あきらめようかとも思っています。

もうしばらく粘ってみますが。。。。

お礼日時:2012/09/28 16:06

質問者さんが見つけられたページのコードで問題なく動きましたけどね?


当方 Windows7 64bit & Office 2010 32bit です。
NumLock をOn にするのは少し面倒です。
下記サイトのコードは標準モジュール上で
丸コピペで機能するのをExcel上で確認しています。
http://www.accessclub.jp/samplefile/samplefile_2 …


Option Compare Database はAccessでの話なので削除
Option Explicit は重複して宣言しないように

この回答への補足

すみません。書き忘れておりましたが、EXCEL(Office 2010)も64ビット版です。

あと、ユーザーフォームは作っていないので、すべて標準モジュールでの話です。

補足日時:2012/09/28 13:13
    • good
    • 0

Private Declare PtrSafe Sub GetKeyboardState Lib "user32" (pbKeyState As Byte)



ですね。

PtrSafe をVBAのヘルプで検索して、64Bit版での32APIの扱い方、一度調べておいた方がよいかと。
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/09/28 13:05

64ビットOSであることは、関係ありません。

EXCEが32ビットソフトなので、EXCEL内のマクロも32ビット互換モードで動いています。むしろ64ビットのAPI呼び出しなどを使うと動かなくなるはずです。

どんなエラーが出ているのですか?
その内容によって、それ相応の対応が必要です。

API呼び出しは、Declare文が必要なのですが、書いてありますか?
フォームモジュールでなく、標準モジュールに書いてみるとどうなりますか?
(参考)
http://www.excellenceweb.net/vba/api/what_window …

この回答への補足

すみません、エラー内容です。

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

よろしくお願いします。

補足日時:2012/09/28 13:04
    • good
    • 0

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

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


このQ&Aを見た人がよく見るQ&A