作成日 2006/5/1
最終更新日 2006/5/3

Excel X for MacのエクセルVBAだとKeyDownイベントのShift引数が常に0となる?

 ユーザーフォーム上にテキストボックスがあったとする。
 このテキストボックスのKeyDownイベントで取得できるShift引数が、常に0となる、、、みたい(※1)。
 これの回避策を考えたので紹介します。

※1:Excel X for Macのみ確認。他はならないと思います。
いや、待てよ。
もしかしたら、だるまのPCに入っているエクセルが壊れているだけなのかもしれない。


1.詳細
2.CarbonLibのGetKeys関数について
3.ダウンロードして確認してみる
4.参考文献

1.詳細

 とりあえず、図1を見て。
KeyDownイベントにおいて、Shift引数が0となっている。KeyUpイベントが発生していない。
図1 テキストボックスのKeyDownイベントとKeyUpイベントの引数を調べた

 結果(図1)を見ると「Shift」キーを押しながら「D」キーを押した(※)のにKeyDownイベントの
Shift引数が0となっている事がわかる。
 そしてさらに、KeyUpイベントが発生していない事がわかる。
※:「Shift」キーを押していなければ、小文字("d")で表示されます。

 自分で動作を確認してみたい人へ:テスト用のマクロ(ファイル名:KeyDownEvent_CheckShift.xls
このページのトップへ

2.CarbonLibのGetKeys関数について

 Excel X for Macの場合、KeyDownイベントのShift引数が使えないので、CarbonLibのGetKeys関数を使用して、
「shift」、「command」、「option」キーが押されているかを調べます。

 GetKeys関数については表1を見てください。

表1 GetKeys関数について
GetKeys関数の定義
void GetKeys(KeyMap thekeys);
※KeyMap構造体は
typedef UInt32                          KeyMap[4];
という事でthekeysはUInt32の配列です。(大きさは4。バイト数は16。)
VBAからGetKeys関数を使用する際は、大きさが16バイトの配列を用意し、
ByRefで渡してください。
(詳しい事はサンプルをダウンロードして、ソースを見てください。)

定義されている場所
Events.h
関数の概要 現在押されているキーを取得する事ができる

GetKeys関数を使うと、thekeysの128ビットのうち、押されていたキーに対応するビットが立ちます。
キー押したら、どのビットが立つかについてですが、それはサンプルをダウンロードしてソースを見てください。

このページのトップへ

3.ダウンロードして確認してみる

 サンプル(ファイル名:getPressedKey.xls

表2 作成した関数について
作成した
関数の定義
Public Function getPressedKeyNameList_forMac() As String
関数の説明
押されているキーをカンマ区切りで返す。
返り値の例
「A」キーと「control」キーを押した場合:"A,control"
「S」キーと「shift」キーと「control」キーを押した場合:"A,control,shift"
テンキーの「+」キーを押した場合:"tenkey+"
注意
この関数はMacでのみ動作します。
Windowsの場合は常に""(空文字)を返します。
利点
VBA標準のKeyDownイベントのでは、
Macの「Control」キーが押されたかどうか判断できない(と思う)。
ですが、この関数を使うと判断できます。

 確認方法:
  1. [test_keyDown]マクロを実行してください。
  2. ユーザーフォームが表示されるので、2つあるテキストボックスのうち、上にある方にカーソルをあわせて、
    何かキーを押してください。
  3. 下にあるテキストボックスに、押したキーの名前がカンマ区切りで表示されます。(図2)
    押したキー名をカンマ区切りで表示する
    図2 押したキー名をカンマ区切りで表示

このページのトップへ

4.参考文献

 1、新居雅行 著 『Macintoshアプリケーションプログラミング〈上巻〉』 株式会社ディー・アート (1995) P265〜267

 2、『FutureBASIC3 GameProgramming』内のページ『FB^3コラム:Getkeysについて』(アクセス日:2006/4/30)
  (リンクが切れていたら、メールをお願いします。)
Prev Up Next  Top
このページのトップへ


このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方はメールをお願いします。

Microsoft 、Windows 、Visual Basic および Excel は米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。
ここではExcel® をエクセル、Visual Basic® for Applications をVBAと表記する場合があります。
Mac 、Mac OS 、Mac OS X は米国Apple Computer,Inc.の登録商標または商標です。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。

このホームページの作成者はこれらの会社とはいっさい関係がありません。