[[20190317162537]] 『(マクロ) 右クリックメニューとリスト表示につい』(マイン) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『(マクロ) 右クリックメニューとリスト表示について』(マイン)

お世話になっております。

シートのセルに右クリックメニューにリストを表示させ選択値をセルに転記させるコードを作成しております。

(質問)

・質問は

「任意のSheet名に対してのみ」動作するようにしたいと考えております。

・任意のシート名は

 数値の「1〜31」となります。

(右クリックメニューを表示させるコード)

Private Sub myExl2_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

    If Intersect(Target, Range("h20:h24,o20:o24,v20:v24,p27:p32,v27:v32")) Is Nothing Then Exit Sub
    Dim myBar2 As CommandBar
    Dim myList2 As Variant
    Dim V2 As Variant
    '本来の右クリックを表示しない
    Cancel = True
    '設定するリストのデータ
    myList2 = Array("(男)", "(女)")
    '一時的にポップアップを作成
    Set myBar2 = Application.CommandBars.Add _
                 (Name:="Temp", Position:=msoBarPopup, Temporary:=True)
    'リストの設定
    For Each V2 In myList2
        With myBar2.Controls.Add(Type:=msoControlButton, Temporary:=True)
            .Caption = V2
            .OnAction = "選択"    'myProjectName & ".ThisWorkbook.選択"
        End With
    Next
    'リスト表示
    myBar2.ShowPopup
    '後始末
    myBar2.Delete
    Set myBar2 = Nothing
End Sub

何卒アドバイスの程よろしくおねがいします。

< 使用 Excel:Excel2010、使用 OS:Windows10 >


Sh.Nameが、「1〜31」でないなら、Exit Subするとよいのでは?

(マナ) 2019/03/17(日) 16:57


マナさん アドバイスありがとうございます。

下記のようにしてみました。

・アクティブシート名がまず、数値かどうかを判定します。
・数値であれば更に「1〜31」であるかを判定します。
・一致したら右クリクメニューを表示するようにしてみました。

おかしいところがありましたら、アドバイスの程よろしくおねがいします。

Private Sub myExl2_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

    Dim shName As String    'シート名取得
    Dim shCode As Long    'シート名を数値として格納

  'シート名格納

    shName = ActiveSheet.Name

    '★シート名が数値、数値以外を判定
    If IsNumeric(shName) Then
        '数値の場合:シート名を Sh に格納
        shCode = shName

        '★更に、数値が指定Sheetかを判定
        If shCode < 1 Or shCode > 31 Then
            Exit Sub'シート名が[1〜31]以外は終了
        End If

    '★指定Sheetの場合は以下の処理

  '-(右クリックメニュ表示)---------------------------------------------------------
  If Intersect(Target, Range("h20:h24,o20:o24,v20:v24,p27:p32,v27:v32")) Is Nothing Then Exit Sub

    Dim myBar2 As CommandBar
    Dim myList2 As Variant
    Dim V2 As Variant
    '本来の右クリックを表示しない
    Cancel = True
    '設定するリストのデータ
    myList2 = Array("(男)", "(女)")
    '一時的にポップアップを作成
    Set myBar2 = Application.CommandBars.Add _
                 (Name:="Temp", Position:=msoBarPopup, Temporary:=True)
    'リストの設定
    For Each V2 In myList2
        With myBar2.Controls.Add(Type:=msoControlButton, Temporary:=True)
            .Caption = V2
            .OnAction = "選択"    'myProjectName & ".ThisWorkbook.選択"
        End With
    Next
    'リスト表示
    myBar2.ShowPopup
    '後始末
    myBar2.Delete
    Set myBar2 = Nothing
  '-----------------------------------------------------------

    Else'数値以外の場合:終了
        'MsgBox "数値でもなければ、指定Sheetでもない"
    End If

End Sub
(マイン) 2019/03/17(日) 20:04


>ByVal Sh As Object,

せっかくなら、Shを使えばどうですか。

>Else'数値以外の場合:終了

最後にもってくる必要性ありますか?
わかりにくくないですか。

あと、シート名は、必ず整数ですか。

あくまで、わたしならですが…
Likeを使うと簡単です。こんな感じ。

 If Not Sh.Name Like "[1-3][0-1]" Then
    If Not Sh.Name Like "[1-9]" Then
        Exit Sub
    End If
 End If

(マナ) 2019/03/17(日) 20:31


マナさん

シートは、指定シートのみ整数で、他のシートは全て文字列のみとしています。

アドバイスのCodeですが試しました。

・シンプルでわかりやすく管理が楽です。

・挙動も分岐が少ないのでサクッと動いている印象です。

バッチリ動いています。

しばらくいじってみます。

(マイン) 2019/03/17(日) 21:01


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.