回答編集履歴

3

説明追記

2020/09/09 04:53

投稿

hatena19
hatena19

スコア33759

test CHANGED
@@ -145,3 +145,205 @@
145
145
 
146
146
 
147
147
  いったん保存して閉じると、次回から開くとチェックボックスにクラスが関連付けられて、機能するようになります。
148
+
149
+
150
+
151
+ クラスでイベントが共通化できる仕組み
152
+
153
+ ---
154
+
155
+
156
+
157
+ 変数はデータを格納することができる器と考えることができます。
158
+
159
+ クラスは、データだけでなく処理(メソッド)も持つことができるもの(オブジェクト)です。
160
+
161
+ さらにクラスは、オブジェクトなので同じものを複数生成できるという特徴があります。
162
+
163
+ 例えばエクセルのワークシートもオブジェクトの一種なので、好きなだけ追加することができますね。
164
+
165
+ クラスモジュールとはそのクラスオブジェクトの設計図と考えことができます。
166
+
167
+
168
+
169
+ たぶん、なんのことか理解できないと思いますので、実際のコードで解説します。
170
+
171
+ クラスモジュール clsLinkedCheckBoxes はすでに作成済みですね。
172
+
173
+ 設計図はできています。
174
+
175
+ 標準モジュールを追加して、下記のコードを記述してください。
176
+
177
+
178
+
179
+ ```VBA
180
+
181
+ Option Explicit
182
+
183
+ Private Chk As clsLinkedCheckBoxes
184
+
185
+
186
+
187
+ Private Sub ClassTest()
188
+
189
+ With Worksheets("Sheet1") 'チェックボックスのあるシート
190
+
191
+ Set Chk = New clsLinkedCheckBoxes 'クラスの実体を生成
192
+
193
+ Chk.SetCtrl .CheckBox45, .CheckBox1
194
+
195
+ End With
196
+
197
+ End Sub
198
+
199
+ ```
200
+
201
+ これを実行すると、CheckBox45 と CheckBox1 が連動するようになります。
202
+
203
+ 標準モジュールの先頭でクラス変数を宣言します。
204
+
205
+ プロシージャ内に記述してはダメです。プロシージャ内の変数はプロシージャの処理か終了すると消えてしまうからです。標準モジュールの先頭だとエクセルが開いてい間は存在します。
206
+
207
+
208
+
209
+ 5行目の New clsLinkedCheckBoxes というのはclsLinkedCheckBoxesの設計図をもとに実体(インスタンスといいます)を生成するという処理になります。この実体が変数Chkに格納されます。
210
+
211
+ Chk.SetCtrl はクラスに実際のコントロール(チェックボックス)を登録する処理(メソッド)です。
212
+
213
+ クラスモジュールでSetCtrlをみると、
214
+
215
+ Set Chk1 = newChk1
216
+
217
+ Set Chk2 = newChk2
218
+
219
+ というようにクラス内変数に格納してます。
220
+
221
+ これで、クラスとコントロールが紐づけられ、コントロールにイベントが発生するとクラス内に記述してあるイベントプロシージャが実行されます。
222
+
223
+
224
+
225
+ 前のコードは下記のように書くこともできます。
226
+
227
+ ```VBA
228
+
229
+ Option Explicit
230
+
231
+ Private Chk As New clsLinkedCheckBoxes
232
+
233
+
234
+
235
+ Private Sub ClassTest()
236
+
237
+ With Worksheets("Sheet1") 'チェックボックスのあるシート
238
+
239
+ Chk.SetCtrl .CheckBox45, .CheckBox1
240
+
241
+ End With
242
+
243
+ End Sub
244
+
245
+ ```
246
+
247
+
248
+
249
+ Private Chk As New clsLinkedCheckBoxes はインスタンスの生成と変数の代入を同時にしています。
250
+
251
+
252
+
253
+ クラスは複数生成することができますので、
254
+
255
+ ```vba
256
+
257
+ Option Explicit
258
+
259
+ Private Chk1 As New clsLinkedCheckBoxes
260
+
261
+ Private Chk2 As New clsLinkedCheckBoxes
262
+
263
+ Private Chk3 As New clsLinkedCheckBoxes
264
+
265
+
266
+
267
+ Private Sub ClassTest()
268
+
269
+ With Worksheets("Sheet1") 'チェックボックスのあるシート
270
+
271
+ Chk1.SetCtrl .CheckBox45, .CheckBox1
272
+
273
+ Chk2.SetCtrl .CheckBox46, .CheckBox2
274
+
275
+ Chk3.SetCtrl .CheckBox47, .CheckBox3
276
+
277
+ End With
278
+
279
+ End Sub
280
+
281
+ ```
282
+
283
+ と書けば一つの設計図をもとに複数のコントロールに同じ機能を持たせることができます。
284
+
285
+
286
+
287
+ 3つぐらいのコントロールなら上記のように必要なだけ変数を書いて、紐づけるコードも繰り返し記述すればいいのですが、複数あるときは面倒ですよね。イベントプロシージャのコントロールの数だけ書くのと大差ないのでクラスにした意味がないです。
288
+
289
+
290
+
291
+ そこで配列変数を使います。
292
+
293
+ `Private Chkes(1 to 44) As New clsLinkedCheckBoxes`
294
+
295
+ と書くとChkes(1)からChkes(44)までの44個のクラスの実体が生成されて変数に格納されます。
296
+
297
+ クラスにコントロールを登録するのはFor Nextのループでできます。
298
+
299
+
300
+
301
+ ```vba
302
+
303
+ Option Explicit
304
+
305
+ Private Chkes(1 To 44) As New clsLinkedCheckBoxes
306
+
307
+
308
+
309
+ Private Sub 複数コントロールの登録()
310
+
311
+ Dim i As Long
312
+
313
+ With Worksheets("Sheet1") 'チェックボックスのあるシート
314
+
315
+ For i = 1 To 44
316
+
317
+ Chkes(i).SetCtrl .OLEObjects("CheckBox" & i + 44).Object, _
318
+
319
+ .OLEObjects("CheckBox" & i).Object
320
+
321
+ Next
322
+
323
+ End With
324
+
325
+ End Sub
326
+
327
+ ```
328
+
329
+ これを実行すると、
330
+
331
+ CheckBox45 → CheckBox1
332
+
333
+ CheckBox46 → CheckBox2
334
+
335
+ CheckBox47 → CheckBox3
336
+
337
+ ・・・・
338
+
339
+ ・・・・
340
+
341
+ CheckBox88 → CheckBox44
342
+
343
+ というようにチェックボックスが連動するようになります。
344
+
345
+
346
+
347
+ ブックを閉じるとこの関連付けは解除されますので、つぎ開いたときに適当なタイミングでまた上記の処理を実行する必要があります。
348
+
349
+ ThisWorkbookモジュールの Workbook_Openイベントはブックを開いたときに自動で実行されますので、ここに上記のコードを記述しておけば、ブックを開くと同時にチェックボックスは連動するようになります。

2

コード追記

2020/09/09 04:52

投稿

hatena19
hatena19

スコア33759

test CHANGED
@@ -85,3 +85,63 @@
85
85
  ```
86
86
 
87
87
  あとはチェックボックスオブジェクトの宣言と、クラスのチェックボックスとシート上のチェックボックスを関連付けるメソッド SetCtrl を記述するだけです。
88
+
89
+
90
+
91
+ クラスとチェックボックスを関連付ける
92
+
93
+ ---
94
+
95
+ > これを画像の場合だと45から88までのプロシージャをクラスモジュールで作れればいいようなのですが、どうすればいいかわかりません。
96
+
97
+
98
+
99
+ CheckBox45 → CheckBox1
100
+
101
+ CheckBox46 → CheckBox2
102
+
103
+ CheckBox47 → CheckBox3
104
+
105
+ CheckBox48 → CheckBox4
106
+
107
+ ・・・・
108
+
109
+ ・・・・
110
+
111
+ CheckBox88 → CheckBox44
112
+
113
+ というようなペアになっているということですね。
114
+
115
+ ThisWorkbookのモジュールに下記のように記述してください。
116
+
117
+
118
+
119
+ ```vba
120
+
121
+ Private Chkes(1 To 44) As New clsLinkedCheckBoxes
122
+
123
+
124
+
125
+ Private Sub Workbook_Open()
126
+
127
+ Dim i As Long
128
+
129
+ With Worksheets("Sheet1") 'チェックボックスのあるシート
130
+
131
+ For i = 1 To 44
132
+
133
+ Chkes(i).SetCtrl .OLEObjects("CheckBox" & i + 44).Object, _
134
+
135
+ .OLEObjects("CheckBox" & i).Object
136
+
137
+ Next
138
+
139
+ End With
140
+
141
+ End Sub
142
+
143
+ ```
144
+
145
+
146
+
147
+ いったん保存して閉じると、次回から開くとチェックボックスにクラスが関連付けられて、機能するようになります。

1

コード追記

2020/09/07 21:01

投稿

hatena19
hatena19

スコア33759

test CHANGED
@@ -11,3 +11,77 @@
11
11
 
12
12
 
13
13
  上記は、ラベルとコマンドボタンがワンセットになってます。
14
+
15
+
16
+
17
+ クラスモジュールの書き方
18
+
19
+ ---
20
+
21
+ メニューの[挿入]-[クラスモジュール]をクリックしてクラスモジュールを追加します。
22
+
23
+ オブジェクト名を「clsLinkedCheckBoxes」とします。(機能の分かり安い名前にするといいでしょう。)
24
+
25
+ 下記のように記述します。
26
+
27
+
28
+
29
+ ```vba
30
+
31
+ Private WithEvents Chk1 As MSForms.CheckBox
32
+
33
+ Private Chk2 As MSForms.CheckBox
34
+
35
+
36
+
37
+ Public Sub SetCtrl(newChk1 As MSForms.CheckBox, newChk2 As MSForms.CheckBox )
38
+
39
+ Set Chk1 = newChk1
40
+
41
+ Set Chk2 = newChk2
42
+
43
+ End Sub
44
+
45
+
46
+
47
+ Private Sub Chk1_Click()
48
+
49
+ If Chk1.Value = False Then
50
+
51
+ Chk2.Value = False
52
+
53
+ Chk2.Enabled = False
54
+
55
+ Else
56
+
57
+ Chk2.Enabled = True
58
+
59
+ End If
60
+
61
+ End Sub
62
+
63
+ ```
64
+
65
+ 現状のチェックボックスのイベントプロシージャと比べると Chk1_Click の部分はほぼ同じということが分かると思います。
66
+
67
+ ```vba
68
+
69
+ Private Sub CheckBox45_Click()'45が画像左上のチェックボックス、1がその右 連番で下に行って1列飛ばしで生成される
70
+
71
+ If CheckBox45.Value = False Then
72
+
73
+ CheckBox1.Value = False
74
+
75
+ CheckBox1.Enabled = False
76
+
77
+ Else
78
+
79
+ CheckBox1.Enabled = True
80
+
81
+ End If
82
+
83
+ End Sub
84
+
85
+ ```
86
+
87
+ あとはチェックボックスオブジェクトの宣言と、クラスのチェックボックスとシート上のチェックボックスを関連付けるメソッド SetCtrl を記述するだけです。