シート上のボタンでShift+クリックを判別する


昔の資料を探していたら見つけたネタです。かなり上級テクニックですので、そのつもりでお使いください(^^;

ワークシート上にボタンを配置するには、[フォーム]ツールバーの[ボタン]を使います。次に、配置したボタンを右クリックして[マクロの登録]を実行し、クリックされたときに実行するマクロを登録します。こうして配置したボタンをクリックすると、登録したマクロを実行できます。このとき、普通のクリックと、Shiftキーを押しながらのクリックを判別して異なるマクロを実行するテクニックをご紹介します。

ボタンには次のマクロ「ボタン1_Click」を登録します。

Sub ボタン1_Click()
    Application.OnKey "a", "'BranchProc ""NORMAL""'"
    Application.OnKey "+a", "'BranchProc ""SHIFT""'"
    Application.OnKey "%a", "'BranchProc ""ALT""'"
    SendKeys "a"
End Sub
Sub BranchProc(TmpKey As String)
    Select Case TmpKey
    Case "NORMAL"
        MsgBox "NORMAL Clickの処理"
    Case "SHIFT"
        MsgBox "Shift + Clickの処理"
    Case "ALT"
        MsgBox "Alt + Clickの処理"
    End Select
    Application.OnKey "a"
    Application.OnKey "+a"
    Application.OnKey "%a"
End Sub

ボタンがクリックされて実行される「ボタン1_Click」では、まずOnKeyメソッドで任意のキーが押されたときに実行するマクロを定義します。上記のコードでは次のように定義しました。

  • 「a」が押されたとき→マクロ「BranchProc」に引数"NORMAL"を渡します
  • 「Shift+a」が押されたとき→マクロ「BranchProc」に引数"SHIFT"を渡します
  • 「Alt+a」が押されたとき→マクロ「BranchProc」に引数"ALT"を渡します

Ctrlキーを定義していないのは、Ctrlキーを押しながらボタンをクリックすると、ボタンを選択したことになるからです。さて、OnKeyメソッドの定義が終わったら、マクロ「ボタン1_Click」は自ら「aキー」を発行します。最後のSendKeysステートメントがそれです。SendKeysステートメントは指定したキーが押された!とWindowsに通知しますが、このときShiftキーやAltキーなど特殊キーの状況も通知に含めます。つまり、Shiftキーを押しながら実行された「SendKeys "a"」では「Shift+a」が通知されることになります。先のOnKeyメソッドで「Shift+a」が押されたらマクロ「BranchProc」に引数"SHIFT"を渡して実行すると定義していますので、マクロ「BranchProc」の引数TmpKeyには"SHIFT"が格納されます。あとは、マクロ「BranchProc」側で受け取った引数TmpKeyに応じて処理を分岐すればいいんです。そして、忘れてならないのは、OnKeyメソッドで定義した「Shift+a」などをクリアする処理です。これを忘れると、ワークシート上で「aキー」を押すたびにマクロ「BranchProc」が実行されてしまいます。

試してみたら正常に動作しました。また、ワークシート上に配置したオートシェイプでも同様の分岐が可能です。ただし、オートシェイプでは「Alt+クリック」でオートシェイプの選択になりますので、使用できるのは普通のクリックと「Shift+クリック」だけになります。

ちなみにこのテクニックは、1996/12/23にみさご氏がNIFTY SERVEのExcel会議室で公開してくれました。