
エクセル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ビットに対応させるのはどうするのか、教えて頂けるとありがたいです。よろしくお願いします。
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 …
↓#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 の書き方が他のバージョンとは違うってだけの話
ですので、ご理解いただきたいです。
何度もありがとうございます。
私が
> Windows7には対応していないようなので
と書いたのは、
http://support.microsoft.com/kb/177674/ja
の詳細にWindows7が書かれていないのを見て、そう思ってしまいました。誤解させてしまったようで、大変申し訳ありません。
今回は 取りあえず注意喚起のMsgboxを使い、少しずつでも勉強しながら対応していこうと思います。
ありがとうございました。
No.6
- 回答日時:
さすがにOfficeの64bitバージョンをインストールして
検証する元気はありません。
MS社自身、32bit バージョンの使用を推奨しています。
開発目的ならともかく、実務に使うのなら周囲の環境が整っている32bit かと。
64 ビット版の Office 2010
http://technet.microsoft.com/ja-jp/library/ee681 …
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 ビット値を格納できるように修正する必要があります。
以上引用==============
それでは失礼します。
この回答への補足
すみません。書き忘れておりましたが、EXCEL(Office 2010)も64ビット版です。
あと、ユーザーフォームは作っていないので、すべて標準モジュールでの話です。
ありがとうございます。
とりあえず、対象セルを選んだ時にMsgBoxで注意を促すようにして時間稼ぎをすることにしました。
http://okwave.jp/qa/q5156553.html
上記を参考にして組んでみましたが、Windows7には対応していないようなので、7に対応させることを考えてみたいと思います。
しかし、よく分かっていないので、あきらめようかとも思っています。
もうしばらく粘ってみますが。。。。
No.3
- 回答日時:
質問者さんが見つけられたページのコードで問題なく動きましたけどね?
当方 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ビット版です。
あと、ユーザーフォームは作っていないので、すべて標準モジュールでの話です。
No.1
- 回答日時:
64ビットOSであることは、関係ありません。
EXCEが32ビットソフトなので、EXCEL内のマクロも32ビット互換モードで動いています。むしろ64ビットのAPI呼び出しなどを使うと動かなくなるはずです。どんなエラーが出ているのですか?
その内容によって、それ相応の対応が必要です。
API呼び出しは、Declare文が必要なのですが、書いてありますか?
フォームモジュールでなく、標準モジュールに書いてみるとどうなりますか?
(参考)
http://www.excellenceweb.net/vba/api/what_window …
この回答への補足
すみません、エラー内容です。
『このプロジェクトのコードは、64ビットシステムで使用するために更新する必要があります。Declareステートメントの確認および更新を行い、次にDeclareステートメントにPtrSafe属性を設定してください。』
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【VBA】 Alt+PrintScreenにてアクティブウィンドウのスクショを貼付する方法 4 2022/12/08 20:53
- Visual Basic(VBA) VBAコードを張り付け後のエクセルの進め方 2 2023/02/07 18:24
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) VBAでWEBサーバー上に保存されたPDFファイルのリンク有効チェックについて 1 2022/11/11 16:04
- マウス・キーボード キーボード Oキーを押すとプルダウンメニューが出る 4 2022/09/08 14:48
- Excel(エクセル) エクセルデータからの必要項目抽出方法を教えてください 6 2022/08/12 15:55
- Excel(エクセル) 【Excel】指定のセル内容を基に別シートのセルを検索して選択する【VBA】 1 2022/06/16 16:16
- Excel(エクセル) エクセル 多数のファイルから値を抜き出したい 4 2022/12/12 16:49
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- Visual Basic(VBA) 転記するVBAコードを教えて下さい。 1 2023/03/31 17:22
このQ&Aを見た人はこんなQ&Aも見ています
-
エクセル NUMLOCKキーの常時オンについて
その他(Microsoft Office)
-
CapsLockを特定の部分だけオンにする
Excel(エクセル)
-
ExcelVBAでスペースキー操作したい
Excel(エクセル)
-
-
4
vbscriptでNUMLOCK判定したい
その他(プログラミング・Web制作)
-
5
VBAでの SendKeysの変数指定方法
Excel(エクセル)
-
6
エクセルVBAでIME入力モードの制御
Excel(エクセル)
-
7
VBAで、なぜかSendkeyが効きません。
PowerPoint(パワーポイント)
-
8
vbaから他のアプリを終了
Visual Basic(VBA)
-
9
NumLockを常にONで固定したい
Windows Vista・XP
-
10
テキストボックス(VBA)でEnterを押したときに作動するマクロ
Access(アクセス)
-
11
VBAでメモ帳にコピペをしたいのですが…
PowerPoint(パワーポイント)
-
12
Excel VBAでマウスの左クリックのイベントを検知するには
Visual Basic(VBA)
-
13
【VB2008】 マウス操作の一時的無効化
Visual Basic(VBA)
-
14
エクセルのドロップダウンリストを自動で出すには?
その他(Microsoft Office)
-
15
ユーザーフォームのSetFocusが働かない?
その他(プログラミング・Web制作)
-
16
ドロップダウンリスト 自動表示したい
Excel(エクセル)
-
17
SendKeysについて
Visual Basic(VBA)
-
18
エクセルVBAで、MsgBox やInputBox は、画面の中央以外に表示させたい。
Excel(エクセル)
-
19
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
20
起動中のアプリ、ソフトの取得
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vbaでmsgboxの位置を指定
-
DVD書き込み中にエラーが出て書...
-
ExcelのVBでタイピングゲームも...
-
別シートのマクロを実行する方法
-
エクセルのマクロ、Modulu、プ...
-
マクロ実行後にマウスのポインタが
-
マクロを停止するマクロ
-
【追加】【マクロ】元データか...
-
ACCESSのマクロからVBAプログラ...
-
access2003 条件によって動作...
-
イベントプロシージャからマク...
-
矢印にならない
-
オートシェイプの黄色いハンド...
-
写真のマクロは、エクセルを開...
-
アクセスパッケージソリューシ...
-
ウィンドウサイズ・場所のレジ...
-
マクロについて知りたいです。
-
エクセルのマクロについて B列...
-
VBA のオプションボタンって・・・
-
エクセル:保存するときに、標...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaでmsgboxの位置を指定
-
エクセルVBA フォームShowでオ...
-
エクセルVBAでNumLockキーの状...
-
【Excel】BeforeCloseを毎回呼...
-
Excel:アドイン(ThisWorkbook)...
-
エクセルのダブルクリックで
-
VBAが得意な方 助けてください...
-
VBAでフォームにおけるコマンド...
-
Pic16f690でpwm信号を作る。c言...
-
ワークシートのコピーVBAでうま...
-
HULFT完了コードについて
-
フォームを作成すると同時にイ...
-
VBAに関して、プロシージャが大...
-
別シートのマクロを実行する方法
-
Application.Runエラー(1004)
-
エクセルのマクロボタンが編集...
-
Access終了時にマクロまたはVBA...
-
エクセルVBAで、ボタンの文字を...
-
シート保護を掛けたまま並べ替...
-
InputBox内の表示について
おすすめ情報