前提・実現したいこと
クラスモジュールで関連付けたチェックボックスをCollectionオブジェクトに格納したい
OLEオブジェクトのチェックボックスをコレクションオブジェクトに入れて評価したい
の続きです。
OLEオブジェクトのチェックボックスがセルに置かれています。
チェックボックスは横並び2つで連動しています。
チェックボックスの番号は3行目の一番上が、1 その後下に向かって番号が振られています。その後、5列目の一番上からまた下に向かって番号が振られていくという具合です。
その後、2行目のチェックボックスが同じように下方向で右方向に番号が振られています。
チェックボックスをセル指定で評価できないので
評価したいチェックボックスを複数のコレクションオブジェクトに格納しようとしたのですがうまくいきません。
偶数列のチェックボックスを列ごとにまとめてカウント
奇数列のチェックボックスは行ごとにまとめてカウントしたいです。
例えば、Col_c1,2・・というように生成できないでしょうか?
行も列も、変わりうるので一般化できるとよいです。
よろしくお願いいたします。
発生している問題・エラーメッセージ
同じコレクションにチェックボックスがはいってしまいます
VBA
1For i = 1 To columnCount 2 Dim Col_c(i) As New Collection
としてみても、定数が~と怒られてしまいます。
該当のソースコード
VBA
1Private Sub CommandButton4_Click() 2Dim columnCount As Integer 3columnCount = Cells(1, Columns.Count).End(xlToLeft).Column \ 2 4 5Dim rowCount As Integer 6rowCount = Range("A4").Value 7 8Dim chBCount As Integer 'リハの番号 9chBCount = rowCount * columnCount 10 11 12'列チェックボックスをまとめてカウント 13Dim i As Integer 14For i = 1 To columnCount 15 Dim Col_c As New Collection '列をまとめるコレクションオブジェクトを作って当該チェックボックスを格納*列数 16 17 Dim j As Integer '格納するチェックボックス番号 18 For j = chBCount + 1 + (i - 1) * rowCount To chBCount + rowCount + (i - 1) * rowCount 19 With Col_c 20 .Add OleObjects("CheckBox" & j).Object 21 End With 22 Next 23 24 Dim v As Variant 25 Dim dayCount As Integer 26 dayCount = 0 27 For Each v In Col_c 28 29 If v.Value = True Then 30 dayCount = dayCount + 1 31 End If 32 Next 33 34 If dayCount = 1 Then 35 With Cells(rowCount + 5, i * 2) 36 .Interior.Color = RGB(255, 0, 0) 37 .Font.Color = RGB(255, 255, 255) 38 .Value = dayCount 39 End With 40 ElseIf dayCount > 9 Then 41 With Cells(rowCount + 5, i * 2) 42 .Interior.Color = RGB(0, 255, 255) 43 .Value = dayCount 44 End With 45 Else 46 Cells(rowCount + 5, i * 2).Value = dayCount 47 End If 48 49Next 50
VBA
1Private Sub CommandButton4_Click() 2 Dim columnCount As Integer 3 columnCount = Cells(1, Columns.Count).End(xlToLeft).Column \ 2 4 5 Dim rowCount As Integer 6 rowCount = Range("A4").Value 7 8 Dim chBCount As Integer 'リハの番号 9 chBCount = rowCount * columnCount 10 11 12 '列チェックボックスをまとめてカウント 13 Dim i As Integer 14 For i = 1 To columnCount 15 ReDim Col_c(i) As collection '列をまとめるコレクションオブジェクトを作って当該チェックボックスを格納*列数 16 Set Col_c(i) = New collection 17 18 Dim j As Integer '格納するチェックボックス番号 19 For j = chBCount + 1 + (i - 1) * rowCount To chBCount + rowCount + (i - 1) * rowCount 20 With Col_c(i) 21 .Add OLEObjects("CheckBox" & j).Object 22 End With 23 Next 24 25 Dim v As Variant 26 Dim dayCount As Integer 27 dayCount = 0 28 For Each v In Col_c(i) 29 If v.Value = True Then 30 dayCount = dayCount + 1 31 End If 32 Next 33 34 If dayCount = 1 Then 35 With Cells(rowCount + 5, i * 2) 36 .Interior.Color = RGB(255, 0, 0) 37 .Font.Color = RGB(255, 255, 255) 38 .Value = dayCount 39 End With 40 ElseIf dayCount > 9 Then 41 With Cells(rowCount + 5, i * 2) 42 .Interior.Color = RGB(0, 255, 255) 43 .Value = dayCount 44 End With 45 Else 46 Cells(rowCount + 5, i * 2).Value = dayCount 47 End If 48 49 Next 50 51 52End Sub 53
インデントをきちんと行うようにしましょう。
変数のスコープを理解しましょう。
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/language-features/declared-elements/scope
ブロックスコープの欄をご確認ください
ありがとうございます。
段落は意図したとおりにできていると思うのですがどこか間違っているでしょうか?
スペース一個では見にくいということかもと思って少し増やしてみました。
リンク先読んでみました。
Collectionオブジェクトはこの後も参照したいのでFORループの中での宣言は望ましくないと思いましたが、それだと連番での作成は難しいでしょうか?というか、Collectionオブジェクトとは複数作れるものでしょうか?
よろしくお願いいたします。
ご提示いただいたソースは、最初の行以外は関数内なので、1インデント下げるべきですし、ifブロック内にインデントされていない箇所があります。
また、End Subがありません。
望ましくないなら、望ましいやり方を模索してください。
Collectionに関しては、こちらもご確認ください。
https://qiita.com/pregum/items/071f72969d72d90cf826
うまく動いたコードを追加しました。
ReDim を使わないといけなかったんですね。
コレクションオブジェクトは変数ではないのでやっぱりForループの中で宣言で良かったようでした。
ありがとうございました。
回答1件
あなたの回答
tips
プレビュー