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

エクセルのダブルクリックで 同じシートにダブルクリックのVBA 二種類作ったとき
名前が適切ではありません と出てくるが こんな時 どうすればいいのか?
一個しかできないようになってゐるのでしょうか、それとも どこか名前を変更すればいいのでしょうか。

A 回答 (4件)

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)




End Sub
を同じシートモジュールに複数書くことは出来ません。
コード内で条件分岐を行って、実行部分を書きます。

ここまでが回答

時間があれば読んでください。
例:
Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim Tr As Long, Tc As Long, Mycolm As Long
   Tr = Target.Row
   Tc = Target.Column
   '制御系コード(画面の作画中止、アラート表示を抑止、チェンジなどのイベントを中止)
   With ThisWorkbook.Application
       .ScreenUpdating = False
       .DisplayAlerts = False
       .EnableEvents = False
       .Calculation = xlCalculationManual
   End With
   '---制御系コード

   '条件1のコード(以前示した処理)
   If If Tc Mod 5 = 1 Then '条件分岐 ダブルクリックが A列、F列、、、5列とび なら、、
       If Target.Row = 1 Then Exit Sub '1行目なら、、実行しない(プロシージャを抜ける)
       '条件に合った 処理プログラム
       Mycolm = 4
       Range(Cells(Tr, Tc), Cells(Tr, Tc + Mycolm)).Value _
             = Range(Cells(Tr - 1, Tc), Cells(Tr - 1, Tc + Mycolm)).Value
      Cancel = True
   End If

   '条件2のコード
   If Target.Column = 2 Then '条件分岐 ダブルクリックが B列なら、、
       If Target.Row = 1 Then Exit Sub '1行目なら、、実行しない(プロシージャを抜ける)
       '条件に合った 処理プログラム
       MsgBox ("ダブルクリックで選択、変更できません")
       Cancel = True     'ダブルクリックを無効にする
   End If

   '制御系コード(抑止などを戻す)
   With ThisWorkbook.Application
       .ScreenUpdating = True
       .DisplayAlerts = True
       .EnableEvents = True
       .Calculation = xlCalculationAutomatic
   End With
End Sub

なお、エラーなどでプログラムを途中で終了すると
制御系コードで中止、抑止した状態が続きます。なので
デバッグなどテスト中の場合は、制御系を戻すプロシージャを作成しておきましょう。
途中で止めた場合は、それを単独で実行します。
戻すプログラム
Private Sub ON_ScreenUpdat()
   With ThisWorkbook.Application
       .ScreenUpdating = True
       .DisplayAlerts = True
       .EnableEvents = True
       .Calculation = xlCalculationAutomatic
   End With
End Sub

研究するとの事なので、
複数のシートに同様の処理を複数の条件で書く場合などは、
実行部分を別に書き、呼び出す方法が良いでしょう。混乱するかもしれませんが
なんとなく覚えておく程度で、、、時間がある時に確認してください、例を挙げます。

シートモジュールに
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
   Call Module1.OFF_Events   'Call で呼び出しています。
  
   If Target.Column Mod 5 = 1 Then
       If Target.Row = 1 Then Exit Sub
       Call Module1.Cells_inValue(Target, 4)
'Call で呼び出しています。(モジュール名Module1のプロシージャ名Cells_inValueに Target(ダブルクリックしたRange情報を与て、4この場合範囲定数)
   End If
       If Target.Column = 2 Then
       If Target.Row = 1 Then Exit Sub
       Call Module1.Cells_Msg(Target) 'Call で呼び出しています。
       Cancel = True
   End If
  
   Call Module1.ON_Events
End Sub


標準モジュールに(Module1)
Option Explicit
Sub Cells_inValue(Target As Range, Mycolm As Long)
'呼び出し元シートイベントから、Target情報、Mycolm情報を得ています)
Dim Tr As Long, Tc As Long
     Tr = Target.Row
     Tc = Target.Column
           Range(Cells(Tr, Tc), Cells(Tr, Tc + Mycolm)).Value _
                   = Range(Cells(Tr - 1, Tc), Cells(Tr - 1, Tc + Mycolm)).Value
End Sub
Sub Cells_Msg(Target As Range)
           MsgBox ("ダブルクリックで選択、変更できません")
End Sub
Sub OFF_Events()
     With ThisWorkbook.Application
           .ScreenUpdating = False
           .DisplayAlerts = False
           .EnableEvents = False
           .Calculation = xlCalculationManual
     End With
End Sub
Sub ON_Events()
     With ThisWorkbook.Application
           .ScreenUpdating = True
           .DisplayAlerts = True
           .EnableEvents = True
           .Calculation = xlCalculationAutomatic
     End With
End Sub


各処理が分かれており、構成が違うだけで、実行される内容は同じです。
こうすると、実行する処理が長いコードの場合などすべてをシートモジュールに
書く必要がなくなり、処理部分を使いまわす事が出来ます。当然、ファイルサイズを節約できますね。

VBAは、プログラムなので、ルールや制約など多々あります。初心者に応用的なものを伝えるのは
どうかと思いますが、やり方、使い方は、色々あるという事は覚えておいてください。
初歩的な事は、QAなどより検索して先輩方のコードを参考にしたり、
初心者向けの基礎知識記事でスキルを上げて行くのが良いと思います。
情報検索は、伝え方の勉強にもなります。
プログラムは、言葉と同じで、やりたい事を順序良く説明できれば、その言葉をコードにするだけです。
文法、単語があいまいでも、会話優先に覚えた方が早く理解できるようになるのは、外国語と同じです。

初めは、分からないと思いますが、、其のうち理解できるようになります。
参考までに
    • good
    • 0

DoubleClickイベントを複数設けたければ、Worksheetイベント、ThisWorkbookイベント、クラスのWorksheetイベントと大まかには、全部で3つ設定できますが、そんなバカな設定をする人はいないはずです。

コードとしてみっともないものになってしまいます。

内容が、他の方と重複するかもしれませんが、お許しください。

ダブルクリックで内容にもよりますが、Target のセル位置によって分岐する方法が一般的です。シフトキーやコントロールキーを押して、ダブルクリック・イベントの仕様を換えるのはレアーな設定です。

条件文でよって分岐します。

例:あくまでも一例です。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
’---------------------
Cancel =True 'ダブルクリックした後の取り消し(マクロなどの待機モードになってしまう)
'----------------------
'除外設定をここに置く
If Target.Row <20 Then Exit Sub
If Target.Value ="" Then Exit Sub
'------------------------------------------
'必要に応じて、イベントなどの制御を以下に行います。
'しかし、DoubleClickイベントには、イベント制御は不要です。
'------------------------------------------
If Target.Column =1 Then 'ここは条件によって選択するマクロを換える
'イベント1

ElseIf Target.Column =6 Then
'イベント2

End If
End Sub

わかりにくいとは思いますが、DoubleClickイベントは、イベントが再帰することはありません。しかし、ダブルクリックすることによって、そのままの状態ですと、マクロが待機モードになるという欠点があるので、マクロが終了するまでに、Cancel=Trueが必要になります。
    • good
    • 0

名前はユニークで無いと駄目って、当たり前でしょ。

    • good
    • 1

エラーが発生したときの操作方法が不明ですが、「名前が適切ではありません」と警告されているのですよね?


であれば、名前を変更したらいいだけだと思います。
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています