Excel2000のVBAをしています。
既に作成しているマクロを「右クリックメニュー」に登録しようと思ってます。その上で二つ質問があります。
処理したい内容(1)
「shift」ボタンが押しっぱなしの時に「右クリックメニュー」に自作コマンドが表示されている様にし、「shift」ボタンが押されてない時は、Excelの通常の「右クリックメニュー」を表示する方法を教えて頂きたいです。
処理したい内容(2)
現在把握している「右クリックメニュー」に登録するソースは、
With Application.CommandBars("CELL").Controls.Add(Before:=1)
.Caption = "mymenu(A)"
.OnAction = "syori"
なんですが、Excelを「改ページプレビュー」にした場合、登録したコマンドが表示されなくなってしまいます。通常でもプレビューでも使用出来るようにしたいので教えて頂きたいと思っています。
複数の質問ですが、よろしくお願いします。
No.1
- 回答日時:
が参考になりませんか。
ーー
下記は、ここでTANAKA先生がおっしゃっていることの理解手助け。
(1)シートSheet1の上にコマンドボタンを貼り付け。
そのボタンクリックのイベントモジュールに
Sub BranchProc(TmpKey As String)
Private Sub CommandButton1_Click()
MsgBox "コマンドボタンクリック・ルーチン通過"
Application.OnKey "a", "'BranchProc ""NORMAL""'"
Application.OnKey "+a", "'BranchProc ""SHIFT""'"
Application.OnKey "%a", "'BranchProc ""ALT""'"
SendKeys "a"
End Sub
(A)aキーを押すと
(B)Shiftキー押しながら、aキーを押すと
(C)Altキーを押しながらaキーを押すと
それぞれの引数NORMAL,SHIFT,ALTを持って、BranchProc に飛ぶ。
ーーーーー
下記を必ず、Module1に(ここが肝心)貼り付ける。
Sub BranchProc(TmpKey As String)
MsgBox "処理実行振り分けルーチン通過"
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
これで処理が、引数であるNORMAL,SHIFT,ALTによって振り分けられる。
ワークシートのどこかセルをアクチブにして(これが必要のよう)
aを押す(他のキーではダメ)
=>"NORMAL Clickの処理"と
Shiftキーを押しながらaを押すと=>"Shift + Clickの処理"と
Altキーを押しながらaを押すと=>"Alt + Clickの処理"と
表示されます。
もちろん、本当の処理は、Msgboxと置き換えることになります。
ボタン1回押しに、,
a,
SHIFT+a
ALT+a
は1回限り有効のようです。
ーー
初め私には、上記WEBの記述が、どう確認したら良いか判りませんでしたのでやった結果を報告します。
以上で、私もわからない点は残ってますが、質問の答えに役立ちますでしょうか。
No.2ベストアンサー
- 回答日時:
こんにちは。
>処理したい内容(1)
APIのGetAsyncKeyStateあたりを使えばできそうですね。
GetAsyncKeyState(vbKeyShift)とすれば、
Shiftが押されているときは0以外を返します。
簡単なサンプルです。
標準モジュールに
Option Explicit
Declare Function GetAsyncKeyState Lib "user32" (ByVal nVirtKey As Long) As Long
シートモジュールに
Option Explicit
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Dim CB As CommandBar
Dim CT As CommandBarControl
Dim i As Integer
If GetAsyncKeyState(vbKeyShift) <> 0 Then
Cancel = True
On Error Resume Next
Application.CommandBars("MyMenu").Delete
On Error Resume Next
Set CB = Application.CommandBars.Add("MyMenu", msoBarPopup, , True)
For i = 1 To 3
Set CT = CB.Controls.Add(msoControlButton)
CT.Caption = "ボタン" & i
Next i
CB.ShowPopup
Set CT = Nothing
Set CB = Nothing
End If
End Sub
>処理したい内容(2)
標準の時も改ページプレビューの時も
右クリックした時に出てくるショートカットメニューの
名前はどちらも"CELL"ですが、INDEX番号が違います。
私の環境(ヴァージョン:Excel2002)では
標準の時の、右クリックメニューのINDEXは33
改ページプレビューの時は36でした。
ですから、
With Application.CommandBars(36).Controls.Add(Before:=1)
.Caption = "mymenu(A)"
.OnAction = "syori"
のように、コマンドバーを名前ではなく
インデックス番号で指定してやれば
うまくいくと思います。
注意:インデックス番号は環境によって
違う可能性がありますので、自分の環境で、確認すること。
Sub Macro1()
Dim c, i
i = 1
For Each c In Application.CommandBars
Cells(i, 1).Value = c.Index
Cells(i, 2).Value = c.Name
Cells(i, 3).Value = c.NameLocal
i = i + 1
Next
End Sub
新しいシートで↑のようなコードを実行して調べてください。
ありがとうございます。
「処理したい内容(1)」のサンプルソースにおける
>For i = 1 To 3
>Set CT = CB.Controls.Add(msoControlButton)
>CT.Caption = "ボタン" & i
>Next i
の部分を、
Set CT = CB.Controls.Add(msoControlButton)
With CT
.Caption = "mymenu(A)"
.OnAction = "syori"
End With
に変更する事によって動作しました。(とても感動!!!!)
「処理したい内容(2)」についても親切な解説ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Word(ワード) Word のマクロについての質問です。 ボタンを押すと登録したブックマーク先にジャンプする機能(リン 3 2023/08/16 12:17
- Excel(エクセル) 【Excel】指定のセル内容を基に別シートのセルを検索して選択する【VBA】 1 2022/06/16 16:16
- InternetExplorer(IE) お気に入りの「一覧」の表示 2 2022/11/21 13:59
- Visual Basic(VBA) Excel VBA 同じ名前のフォルダがあれば作成したブックを格納するマクロをつくりたい 2 2023/01/16 16:19
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- SQL Server DBのテーブルの設計ができず困っています。 2 2023/06/29 16:43
- Visual Basic(VBA) VBA 登録ボタンを省略してエンターキーで作業 4 2022/07/09 22:29
- Windows 10 Windows10パソコン右クリックメニューで「切り取り」と「コピー」を選択し間違わないようにしたい 3 2022/04/16 10:35
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メッセージボックスのボタン名変更
-
VBSの処理中一旦処理を止めて再...
-
VBA kernel32 の意味
-
ACCESS側からEXCELの書式を設定...
-
【C#】 あるイベントから別イ...
-
エクセルVBAでクリップボード内...
-
Excel VBA で処理中断(DoEvents...
-
ASP VBScriptでスクリプト実行...
-
VBA メッセージボックスを自動...
-
ボタンが押された事を検知する...
-
シャットダウン時のExcel強制終...
-
【MFC】イベントの無効化について
-
vb.net イベントが完全に終了...
-
SendMessage中のメッセージ・ル...
-
起動後直に実行するコードはど...
-
Application.ScreenUpdating=Fa...
-
【KeyDown】キーコードについて
-
ダイアログ作成での質問
-
VB6 コマンドボタン クリック...
-
キーボード入力、マウス操作を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
メッセージボックスのボタン名変更
-
VBSの処理中一旦処理を止めて再...
-
VBA kernel32 の意味
-
VBSで応答不要のメッセージボッ...
-
VBA メッセージボックスを自動...
-
ACCESS側からEXCELの書式を設定...
-
Application.ScreenUpdating=Fa...
-
エクセルVBAでクリップボード内...
-
Excel VBA で処理中断(DoEvents...
-
【C#】 あるイベントから別イ...
-
Excel VBA 自動的に閉じるMsgBox
-
VBA、UserFormを前面に出力して...
-
マウスのクリックを無視したい
-
ASP.NETでのメッセージ画面を出...
-
EXCEL VBA「Application.Displa...
-
B列に特定の文字列が入っている...
-
MFCのワーカースレッドとUIスレ...
-
DoEvents
-
VCでウエイトをミリ秒でかけ...
-
「キャンセル」ボタン付きの処...
おすすめ情報