エクセル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)
-
vbscriptでNUMLOCK判定したい
その他(プログラミング・Web制作)
-
CapsLockを特定の部分だけオンにする
Excel(エクセル)
-
-
4
VBAで既に開いている別アプリケーションのオブジェクトを得る
Visual Basic(VBA)
-
5
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
6
VBAで、なぜかSendkeyが効きません。
PowerPoint(パワーポイント)
-
7
ドロップダウンリスト 自動表示したい
Excel(エクセル)
-
8
ExcelVBAでセルを編集状態にする方法
Excel(エクセル)
-
9
VBAでユーザーフォームを再表示させたい。
Excel(エクセル)
-
10
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
11
別のシートから値を取得するとき
Visual Basic(VBA)
-
12
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
13
vbaから他のアプリを終了
Visual Basic(VBA)
-
14
Excel VBAでのWorksheet_Changeが動作しない原因
Excel(エクセル)
-
15
フォントの大きさ
Visual Basic(VBA)
-
16
ユーザーフォームをホイールでスクロールする方法(Excel2000VBA)
Excel(エクセル)
-
17
Access VBAで行ラベルが定義されていないというエラーが出ます
Access(アクセス)
-
18
エクセルVBAでIME入力モードの制御
Excel(エクセル)
-
19
excelのInputBoxで日本語入力OFFにしたい
Excel(エクセル)
-
20
Excel VBA:フォーム←→セルのアクティブ切り替え
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
smartvisionで録画失敗が頻発
-
Excel:アドイン(ThisWorkbook)...
-
エクセルVBAでNumLockキーの状...
-
ワークシートのコピーVBAでうま...
-
別シートのマクロを実行する方法
-
Application.Runエラー(1004)
-
エクセルVBAで、ボタンの文字を...
-
ExcelのVBAでDisplayalertsで警...
-
エクセルのマクロボタンが編集...
-
access2010 コマンドまたはアク...
-
プロシージャが大きすぎます!
-
Access終了時にマクロまたはVBA...
-
シート保護を掛けたまま並べ替...
-
別シートのトグルボタンを指定...
-
アクセスでauto_openは使えない?
-
Workbook_Openを起動時以外に呼...
-
マクロとモジュールの違いを教...
-
オートシェイプの黄色いハンド...
-
アクセス:検索フォームボタンに...
-
ExcelVBAで右クリックメニュー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA フォームShowでオ...
-
エクセルVBAでNumLockキーの状...
-
vbaでmsgboxの位置を指定
-
【Excel】BeforeCloseを毎回呼...
-
VBAが得意な方 助けてください...
-
エクセルのダブルクリックで
-
Pic16f690でpwm信号を作る。c言...
-
smartvisionで録画失敗が頻発
-
HULFT完了コードについて
-
PHPかCGIか迷っています
-
フォームを作成すると同時にイ...
-
ExcelのVBでタイピングゲームも...
-
ラウザ経由でエクセルVBAを実行...
-
Excel:アドイン(ThisWorkbook)...
-
エクセル2003のマクロでコマン...
-
エクセルVBAでワークシートのコ...
-
別シートのマクロを実行する方法
-
エクセルのマクロボタンが編集...
-
Application.Runエラー(1004)
-
Access終了時にマクロまたはVBA...
おすすめ情報