teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2020/09/17 17:40

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -32,4 +32,65 @@
32
32
  Next
33
33
  End With
34
34
  End Sub
35
- ```
35
+ ```
36
+
37
+ 追記
38
+ ---
39
+ 上記の修正だけではうまく動作しませんでした。
40
+ いろいろ試してみた結果、
41
+ チェックボックスの生成と、クラスの登録を別に実行するとうまくいくようです。
42
+
43
+ `Private Sub CommandButton2_Click()`
44
+ の最後の、
45
+ `Call clsLinked`
46
+ を削除して、
47
+ コマンドボタンをシート上に追加して(CommandButton3)、そのクリック時で、clsLinked を実行するとうまくいきました。
48
+
49
+ また、
50
+ `Public chBc As Long`のパブリック変数を参照する方法は不安定なので、clsLinked内で件数を取得する方法に変更しました。
51
+
52
+ ```vba
53
+ Private Sub CommandButton3_Click()
54
+ Call clsLinked
55
+ End Sub
56
+
57
+ Public Sub clsLinked()
58
+ Dim i As Long
59
+ Dim chk As clsLinkedCheckBoxes 'ここでクラス変数を宣言、生成はしない
60
+ Dim ChkCount As Long
61
+
62
+ Set myChbes = Nothing
63
+ Set myChbes = New Collection
64
+
65
+ ChkCount = (Range("A4").End(xlDown).Row - 4) * (Cells(1, Columns.Count).End(xlToLeft).Column \ 2)
66
+
67
+ With ActiveSheet
68
+ For i = 1 To ChkCount
69
+ Set chk = New clsLinkedCheckBoxes 'ここでクラスの実体を生成してクラス変数に格納
70
+ chk.SetCtrl .OLEObjects("CheckBox" & i + ChkCount).Object, _
71
+ .OLEObjects("CheckBox" & i).Object
72
+ myChbes.Add chk
73
+ Next
74
+ End With
75
+
76
+ MsgBox "終了"
77
+ End Sub
78
+ ```
79
+
80
+ もし、1回ボタンをクリックするだけで、生成から、クラスの登録までしたい場合は、
81
+ Application.OnTime で clsLinked をタイマー実行するとうまくいきました。
82
+
83
+ OnTime は標準モジュールのプロシージャしか呼び出せないので、
84
+ `clsLinked`プロシージャと `Dim myChbes As Collection`宣言を標準モジュールに移動させて、
85
+ `CommandButton2_Click()` の最後で、下記のように記述すればうまくいきます。
86
+
87
+ ```vba
88
+ '前略
89
+
90
+ ' Call clsLinked これは削除
91
+ Application.OnTime Now + TimeValue("00:00:01"), Procedure:="clsLinked"
92
+
93
+ End Sub
94
+ ```
95
+
96
+ ユーザーフォームではこんな苦労することはないのですが、シート上のコントロールは扱いが難しいようです。