コマンドボタンが、Shiftキーを押しながらクリックされたかどうかの判別は、標準の「CommandButton_Click」ではできません。左ボタンと右ボタンを判別したように、MouseDownイベントかMouseUpイベントを使います。ここでは、MouseUpイベントでやりましょう。
Private Sub CommandButton1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, _ ByVal X As Single, ByVal Y As Single) End Sub
コマンドボタンがクリックされたとき、Sfhitキー・Ctrlキー・Altキーのいずれかが押されていたかどうかは、引数Shiftに数値が格納されます。
値 | 内容 |
---|---|
1 | Shiftキーが押されました |
2 | Ctrlキーが押されました |
3 | Shiftキーと同時にCtrlキーが押されました |
4 | Altキーが押されました |
5 | Altキーと同時にShiftキーが押されました |
6 | Altキーと同時にCtrlキーが押されました |
7 | Altキー、Shiftキー、Ctrlキーの3つが同時に押されました |
なので、これを区別すれば、どのキーが押されていたかを判別できます。
Private Sub CommandButton1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, _ ByVal X As Single, ByVal Y As Single) If Shift = 7 Then MsgBox "隠し機能" Else MsgBox "通常機能" End If End Sub
Shift+Ctrl+Altを押しながら右クリックされたときだけ、管理者用の機能を実行するなどに便利です。
隠し機能的な話をしたので、ついでにもう少し。利用者には使って欲しくないけど、管理者がデバッグなどの目的で実行したいような機能は、上のように特別な方法で起動させるといいです。Shift+Ctrl+Alt+右クリックあたりは、まず普通のユーザーが普通に使うときは、誤って操作することもないでしょう。しかし、ものすごく好奇心の旺盛なユーザーだったり、信じられない"ウッカリ者"のユーザーだったら、つい間違えて実行してしまうかもしれません。そんなときは、次のようにする手もあります。
次のコードは、コマンドボタンを普通に左クリックしたときには"通常機能"と表示しますが、Shift+Ctrl+Altを押しながら、右ボタンで5回続けてクリックしたときだけ、パスワードの入力画面を表示します。
Private Sub CommandButton1_Click() MsgBox "通常機能" End Sub Private Sub CommandButton1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, _ ByVal X As Single, ByVal Y As Single) Static cnt As Long If Shift = 7 And Button = 2 Then cnt = cnt + 1 If cnt = 5 Then If InputBox("Password?") = "1234" Then MsgBox "管理者機能" End If End If End Sub
Staticステートメントによる静的変数は、プロシージャが終了してもクリアされません。