質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

1652閲覧

複数のコレクションオブジェクトを作って参照したい

halmichi

総合スコア12

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/11/08 12:08

編集2020/11/09 08:52

前提・実現したいこと

クラスモジュールで関連付けたチェックボックスを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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

halmichi

2020/11/09 00:04

ありがとうございます。 段落は意図したとおりにできていると思うのですがどこか間違っているでしょうか? スペース一個では見にくいということかもと思って少し増やしてみました。 リンク先読んでみました。 Collectionオブジェクトはこの後も参照したいのでFORループの中での宣言は望ましくないと思いましたが、それだと連番での作成は難しいでしょうか?というか、Collectionオブジェクトとは複数作れるものでしょうか? よろしくお願いいたします。
YT0014

2020/11/09 03:17 編集

ご提示いただいたソースは、最初の行以外は関数内なので、1インデント下げるべきですし、ifブロック内にインデントされていない箇所があります。 また、End Subがありません。 望ましくないなら、望ましいやり方を模索してください。 Collectionに関しては、こちらもご確認ください。 https://qiita.com/pregum/items/071f72969d72d90cf826
halmichi

2020/11/09 08:55

うまく動いたコードを追加しました。 ReDim を使わないといけなかったんですね。 コレクションオブジェクトは変数ではないのでやっぱりForループの中で宣言で良かったようでした。 ありがとうございました。
guest

回答1

0

自己解決

解決しました。

コードを質問の一番下に入れました。

投稿2020/11/09 11:30

halmichi

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問