回答編集履歴

1

コード例追加

2019/05/23 13:37

投稿

hatena19
hatena19

スコア33715

test CHANGED
@@ -40,7 +40,7 @@
40
40
 
41
41
  MsgBox sh.Name & "シートの" & rng.Address(False, False) & "セルをダブルクリックしました。"
42
42
 
43
-
43
+ '実際には sh と rng を使った処理を記述
44
44
 
45
45
  End Sub
46
46
 
@@ -48,7 +48,7 @@
48
48
 
49
49
 
50
50
 
51
- シートのモジュール
51
+ ダブルクリックで処理を実行したいシートのモジュール
52
52
 
53
53
 
54
54
 
@@ -61,3 +61,125 @@
61
61
  End Sub
62
62
 
63
63
  ```
64
+
65
+
66
+
67
+ ---
68
+
69
+ クラスモジュールを使う場合
70
+
71
+
72
+
73
+ シートが動的に追加されたり、削除されたりする場合で、追加されたシートにもダブルクリックでイベント処理したい場合は、クラスモジュールにするメリットもでてきます。
74
+
75
+
76
+
77
+ その場合は、Collection にクラスを格納するようすると、自由に追加、削除できます。
78
+
79
+
80
+
81
+ クラスモジュール clsWs
82
+
83
+ ```vba
84
+
85
+ Option Explicit
86
+
87
+
88
+
89
+ Private WithEvents ws As Excel.Worksheet
90
+
91
+
92
+
93
+ Public Property Let MySheet(ByVal c As Excel.Worksheet)
94
+
95
+ Set ws = c
96
+
97
+ End Property
98
+
99
+
100
+
101
+ 'シートのダブルクリックイベント
102
+
103
+ Private Sub ws_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
104
+
105
+ Dim Sh As Worksheet
106
+
107
+ Dim rng As Range
108
+
109
+
110
+
111
+ Set Sh = ActiveSheet
112
+
113
+ Set rng = ActiveCell 'Target でもOK
114
+
115
+
116
+
117
+ MsgBox Sh.Name & "シートの" & rng.Address(False, False) & "セルをダブルクリックしました。"
118
+
119
+ '実際には sh と rng を使った処理を記述
120
+
121
+ End Sub
122
+
123
+ ```
124
+
125
+
126
+
127
+ ThisWorkbook モジュール
128
+
129
+ ```vba
130
+
131
+ Option Explicit
132
+
133
+ Public MySheets As Collection
134
+
135
+ 'ブックを開く時
136
+
137
+ Private Sub Workbook_Open()
138
+
139
+ Dim cWs As clsWs
140
+
141
+ Dim i As Long
142
+
143
+
144
+
145
+ Set MySheets = New Collection
146
+
147
+ For i = 1 To ThisWorkbook.Worksheets.Count
148
+
149
+ Set cWs = New clsWs
150
+
151
+ cWs.MySheet = ThisWorkbook.Worksheets(i)
152
+
153
+ MySheets.Add cWs, ThisWorkbook.Worksheets(i).CodeName
154
+
155
+ Next
156
+
157
+
158
+
159
+ End Sub
160
+
161
+ 'シートの追加時
162
+
163
+ Private Sub Workbook_NewSheet(ByVal Sh As Object)
164
+
165
+ Dim cWs As clsWs
166
+
167
+ Set cWs = New clsWs
168
+
169
+ cWs.MySheet = Sh
170
+
171
+ MySheets.Add cWs, Sh.CodeName
172
+
173
+ End Sub
174
+
175
+ 'シートの削除前
176
+
177
+ Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object)
178
+
179
+ MySheets(Sh.CodeName).MySheet = Nothing
180
+
181
+ MySheets.Remove Sh.CodeName
182
+
183
+ End Sub
184
+
185
+ ```