No.3ベストアンサー
- 回答日時:
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などより検索して先輩方のコードを参考にしたり、
初心者向けの基礎知識記事でスキルを上げて行くのが良いと思います。
情報検索は、伝え方の勉強にもなります。
プログラムは、言葉と同じで、やりたい事を順序良く説明できれば、その言葉をコードにするだけです。
文法、単語があいまいでも、会話優先に覚えた方が早く理解できるようになるのは、外国語と同じです。
初めは、分からないと思いますが、、其のうち理解できるようになります。
参考までに
No.4
- 回答日時:
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が必要になります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelの文字列を転記したいのですが。 2 2022/09/30 12:09
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
- Visual Basic(VBA) エクセルVBA ダブルクリックしたら色反転を指定したセルのみにしたい 2 2022/04/06 12:52
- Excel(エクセル) ExcelVBAで自動調整できますか? 3 2023/08/25 22:59
- Excel(エクセル) XLSファイルがオペラのマークになっている 4 2022/06/12 19:37
- Excel(エクセル) Excel ハイパーリンク設定について 教えてください 例なんですが、 VBAにてファイル1の列Gに 2 2022/11/04 17:52
- Visual Basic(VBA) VBAについて教えてください。 Excelで セルのB6~BG24でダブルクリックすると ダブルクリ 1 2022/06/02 17:07
- Excel(エクセル) 高校一年生です。今日学校でエクセル4級を受けました。合計を出す時にオートSUMの合計のボタンを押しま 2 2022/12/09 16:32
- Excel(エクセル) エクセルマクロ セルをクリックするたびに記号を入力 1 2022/10/13 19:47
- マウス・キーボード 関数の予測をキーボードで決定する方法 1 2022/07/27 16:26
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
smartvisionで録画失敗が頻発
-
VBAが得意な方 助けてください...
-
vbaでmsgboxの位置を指定
-
エクセルVBA フォームShowでオ...
-
Application.Runエラー(1004)
-
別シートのマクロを実行する方法
-
マクロ 戻るボタンを押したらシ...
-
エクセルのマクロボタンが編集...
-
エクセルVBAで、ボタンの文字を...
-
シート保護を掛けたまま並べ替...
-
access2010 コマンドまたはアク...
-
InputBox内の表示について
-
特定マクロが実行されたか確認...
-
Access終了時にマクロまたはVBA...
-
エクセル 当月分のデータを抽出...
-
Accessからエクセルマクロを起...
-
Workbook_Openを起動時以外に呼...
-
マクロとモジュールの違いを教...
-
「Access」のフォームを...
-
エクセルのマクロ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA フォームShowでオ...
-
エクセルVBAでNumLockキーの状...
-
vbaでmsgboxの位置を指定
-
【Excel】BeforeCloseを毎回呼...
-
VBAが得意な方 助けてください...
-
Pic16f690でpwm信号を作る。c言...
-
エクセルのダブルクリックで
-
smartvisionで録画失敗が頻発
-
HULFT完了コードについて
-
PHPかCGIか迷っています
-
フォームを作成すると同時にイ...
-
ExcelのVBでタイピングゲームも...
-
ラウザ経由でエクセルVBAを実行...
-
Excel:アドイン(ThisWorkbook)...
-
エクセル2003のマクロでコマン...
-
エクセルVBAでワークシートのコ...
-
別シートのマクロを実行する方法
-
エクセルのマクロボタンが編集...
-
Application.Runエラー(1004)
-
Access終了時にマクロまたはVBA...
おすすめ情報