アプリ版:「スタンプのみでお礼する」機能のリリースについて

Excel2000のVBAをしています。
既に作成しているマクロを「右クリックメニュー」に登録しようと思ってます。その上で二つ質問があります。

処理したい内容(1)
「shift」ボタンが押しっぱなしの時に「右クリックメニュー」に自作コマンドが表示されている様にし、「shift」ボタンが押されてない時は、Excelの通常の「右クリックメニュー」を表示する方法を教えて頂きたいです。

処理したい内容(2)
現在把握している「右クリックメニュー」に登録するソースは、
With Application.CommandBars("CELL").Controls.Add(Before:=1)
.Caption = "mymenu(A)"
.OnAction = "syori"
なんですが、Excelを「改ページプレビュー」にした場合、登録したコマンドが表示されなくなってしまいます。通常でもプレビューでも使用出来るようにしたいので教えて頂きたいと思っています。

複数の質問ですが、よろしくお願いします。

A 回答 (2件)

http://www.officetanaka.net/excel/vba/tips/tips6 …
が参考になりませんか。
ーー
下記は、ここで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の記述が、どう確認したら良いか判りませんでしたのでやった結果を報告します。
以上で、私もわからない点は残ってますが、質問の答えに役立ちますでしょうか。
    • good
    • 0
この回答へのお礼

早い回答ありがとうございます。
この、知識は別の事に生かせそうな気がします。
親切な回答ありがとうございました。

お礼日時:2007/01/07 18:20

こんにちは。



>処理したい内容(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

新しいシートで↑のようなコードを実行して調べてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。
「処理したい内容(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)」についても親切な解説ありがとうございました。

お礼日時:2007/01/07 18:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!