• ベストアンサー

ワークシート上のチェックボックスのチェックをカウント

こんにちは EXCELのVBAに関する質問なのですが ワークシート上に配置したチェックボックス(コントロールツールボックス) で各シートのCheckbox1にチェックが入っている数を数えたいのですが 下記のように書いたところエラーが出ました。 何かよい改善案ご存知の方いらっしゃいませんか? よろしくお願いいたします。 Sub test() Dim myst As Worksheet Dim yes As Integer, myct As Integer myct = ThisWorkbook.Sheets.Count Worksheets.Add after:=Sheets(myct) Sheets(myct + 1).Name = "syuukei" For Each myst In Worksheets On Error GoTo elabel If ThisWorkbook.myst.CheckBox1.Value = True Then yes = yes + 1 End If elabel: Next with worksheets("syuukei") .range("a2")="YESの合計" .range("b2")=yes end with End Sub

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

エラー処理は、深く考えておりません。 流用しやすいように、大まかな必要そうな情報の収集方法も載せておきます。 Sub test()   Call 集計(ThisWorkbook) End Sub Sub 集計(p_xlsBook As Workbook)   Dim l_xls集計シート As Excel.Worksheet   Dim l_xlsSheet   As Excel.Worksheet   Dim l_lng数_ChkBox As Long   Dim l_lng数_ChkOn  As Long   Set l_xls集計シート = 集計シート取得(p_xlsBook)      For Each l_xlsSheet In p_xlsBook.Worksheets     If Not (l_xls集計シート Is l_xlsSheet) Then       Call 集計_チェックボックス(l_xlsSheet, l_lng数_ChkBox, l_lng数_ChkOn)     End If   Next      l_xls集計シート.Range("A2") = "YESの合計"   l_xls集計シート.Range("B2") = l_lng数_ChkOn   l_xls集計シート.Range("A3") = "CHEKBOXの合計"   l_xls集計シート.Range("B3") = l_lng数_ChkBox   l_xls集計シート.Select End Sub Private Function 集計_チェックボックス( _   ByVal p_xlsSheet As Excel.Worksheet, _   Optional ByRef p_lng数_ChkBox As Long, _   Optional ByRef p_lng数_ChkOn As Long _ ) As Long   Dim l_objOLE    As OLEObject   Dim l_objChkBox   As MSForms.CheckBox      'OLEオブジェクトでのループ   For Each l_objOLE In p_xlsSheet.OLEObjects     'チェックボックスの判断     If TypeOf l_objOLE.Object Is MSForms.CheckBox Then       'チェックボックス数をカウントアップ       p_lng数_ChkBox = p_lng数_ChkBox + 1              'MSForms.CheckBox型変数へのキャスト       Set l_objChkBox = l_objOLE.Object       'ON/OFF判定       If l_objChkBox.Value Then         'チェックボックスON数をカウントアップ         p_lng数_ChkOn = p_lng数_ChkOn + 1       End If     End If   Next End Function Private Function 集計シート取得(p_xlsBook As Excel.Workbook) As Excel.Worksheet   Const DEFSTR_集計  As String = "syuukei"   Dim l_xlsSheet   As Excel.Worksheet      If シート存在チェック(p_xlsBook, DEFSTR_集計) Then     Set l_xlsSheet = p_xlsBook.Worksheets(DEFSTR_集計)   Else     'シートを最後尾に追加     With p_xlsBook       Set l_xlsSheet = .Worksheets.Add(, .Worksheets(.Worksheets.Count))     End With     l_xlsSheet.Name = DEFSTR_集計   End If   Set 集計シート取得 = l_xlsSheet End Function Private Function シート存在チェック(p_xlsBook As Workbook, p_strシート名 As String) As Boolean   On Error Resume Next   Dim l_xlsSheet  As Excel.Worksheet   Set l_xlsSheet = p_xlsBook.Worksheets(p_strシート名)   シート存在チェック = Not l_xlsSheet Is Nothing   On Error GoTo 0 End Function

19746999
質問者

お礼

1050YENさんはじめまして ご回答ありがとうございます! ・・・というより感動してしまいました。 コメントを書いていただいたり インデントも整えていただいたり 非常にわかりやすいです。 本当は20P以上差し上げたいです。 以前はVBAよく使っていたのですが 最近はやっていなくて 久しぶりに使ってみたら 鈍っていました。 これから、VBAを再び使うことがあると思います。 もしまた質問することがあったら、 そのときは是非よろしくお願いいたします。 それからシート存在チェック関数というのも 便利ですね。 どこかで使わさせていただきます。(笑)

その他の回答 (3)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.3

#2です。 ちょっと勘違いしてました。 CheckBox1だけを数えたいなら、#2の If TypeName(ch.Object) = "CheckBox" Then を If ch.Name = "CheckBox1" Then にすれば良いかと思います。

19746999
質問者

お礼

papayukaさん、はじめまして おかげさまで、成功しました。 なぜエラーが出ないのか、さらに自分で考えてみたいと思います。 ありがとうございました。 これからもよろしくお願いいたします。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

こんな感じでしょうか? Sub Test1() Dim ws As Worksheet, ch As OLEObject, cnt As Integer  cnt = 0  For Each ws In Worksheets   For Each ch In ws.OLEObjects    If TypeName(ch.Object) = "CheckBox" Then      If ch.Object.Value Then cnt = cnt + 1    End If   Next ch  Next ws  Set ws = Worksheets.Add(before:=Worksheets(1))  On Error Resume Next  ws.Name = "syuukei"  ws.Range("A2").Value = "YESの合計"  ws.Range("B2").Value = cnt End Sub

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

>For Each myst In Worksheets For Each myst In Activeworkbook.Worksheets でどうでしょうか。

19746999
質問者

お礼

>imogasiさんはじめまして 失礼しました。 前にもお世話になりましたね。 気をつけます。

19746999
質問者

補足

imogasiさんはじめまして ごめんなさい、同じエラーが出ました。

関連するQ&A

  • エクセル チェックボックスの解除について(VBA)

    YES/NOを入力させる為の下記のVBAにおいて、チェックボックス1をチェックすると、アの部分でチェックボックス2の解除を行う関係で?、シート上でチェックボックス2を操作していないのにもかかわらず、勝手にCheckBox2_Click()に入り、命令文イを実行してしまいます。 ただ単にSub CheckBox1_Click()のルーチンの最後までの処理で終わりたいのですが、どうしたらよいのでしょうか。 Private Sub CheckBox1_Click() If CheckBox1 = True Then Sheets("sheet1").Range("A1") = 1 Sheets("sheet1").Range("A2") = 0 CheckBox2 = False・・・ア Else Sheets("sheet1").Range("A1") = "" End If End Sub Private Sub CheckBox2_Click() If CheckBox2 = True Then Sheets("sheet1").Range("A1") = 0 Sheets("sheet1").Range("A2") = 1 CheckBox1 = False Else Sheets("sheet1").Range("A2") = ""・・・イ End If End Sub

  • エクセル マクロ チェックボックス

    sheet1にチェックボックスが3つあり、マクロを実行するコマンドボタンが1つあります。 チェックボックスにレ点を入れることにより、sheet4のデータからsheet2にグラフを作成しようと考えてますが、エラーが出てしまい解決できません。 どのように訂正したらいいのか教えて頂けないでしょうか。 Private Sub CommandButton1_Click() Dim GraphRange As String Dim Graph As ChartObject Dim lastRow As Long Set Graph = Sheets("sheet2").ChartObjects.Add(150, 27, 350, 200) lastRow = Sheets("sheet4").Range("A" & Rows.Count).End(xlUp).Row GraphRange = Sheets("sheet4").Range(Cells(1, 1), Cells(lastRow, 1)).Value If Sheets("sheet1").CheckBox1.Value = True Then 'CheckBox1にチェックがあれば GraphRange = Sheets("sheet4").Range(Cells(1, 2), Cells(lastRow, 2)).Value End If If Sheets("sheet1").CheckBox2.Value = True Then 'CheckBox2にチェックがあれば GraphRange = Sheets("sheet4").Range(Cells(1, 3), Cells(lastRow, 3)).Value End If If CheckBox3.Value = True Then 'CheckBox3にチェックがあれば GraphRange = Sheets("sheet4").Range(Cells(1, 4), Cells(lastRow, 4)).Value End If Graph.Chart.ChartWizard Source:=Sheets("sheet4").Range(GraphRange).Value, _ Gallery:=xlLine, Format:=1, PlotBy:=xlColumns, _ CategoryLabels:=1, SeriesLabels:=1, HasLegend:=True End Sub

  • エクセル マクロ:チェックボックス コピー

    教えてください。 sheet1にデータがあり sheet2にチェックボックスとコマンドボタンがあります。 チェックボックスにレ点を入れ、コマンドボタンを押すと sheet1の該当する列をコピーして、sheet3に貼り付ける マクロを作ろうと思ってますがうまくいきません。 下記のマクロを使えるように手直ししていただけないでしょうか。 よろしくお願い致します。 Private Sub CommandButton1_Click() Dim myrange As String Dim rmax As Long rmax = Sheets("sheet1").Range("A2").End(xlDown).Row With Sheets("sheet2") If .CheckBox1 Then myrange = myrange & ",$B$1:$B$" & rmax If .CheckBox2 Then myrange = myrange & ",$C$1:$C$" & rmax If .CheckBox3 Then myrange = myrange & ",$D$1:$D$" & rmax End With If myrange = "" Then MsgBox "チェックしてください" Exit Sub End If myrange = "$A$2:$A$" & rmax & myrange Sheets("sheet1").Range(myrange).Copy Sheets("sheet3").Range("A1").PasteSpecial xlPasteValues Application.CutCopyMode = False Sheets("sheet3").Select End Sub

  • Excelのワークシートでのコンボボックスについて

    Excelのワークシートでコンボボックスを設定する方法を教えてください。 「フォームコントロール」と「ActiveXコントロール」の違いがわかりません。 添付の画像の通りコンボボックスに西暦を入力(別シートに入力済みの値を表示するように設定)してあるのですが、ファイルを保存しているにも関わらず、再度ファイルを開くとコンボボックスの中のリストは空欄になってしまいます。 今は「ActiveXコントロール」のコンボボックスで設定しています。 コードは以下のように設定してみたのですが、設定内容や設定箇所が違うのでしょうか? ////////////////////////////////////////////////////// Private Sub ComboBox1_DropButtonClick() Dim sh As Worksheet Set sh = Worksheets("マクロ") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// コンボボックスのリストの内容が消えてしまうので、 コードの内容は同じで以下のところにもコードを書いてみました。 ////////////////////////////////////////////////////// Private Sub Worksheet_Activate() Dim sh As Worksheet Set sh = Worksheets("マクロ") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// なんだかもう、訳がわからずぐちゃぐちゃです。 コンボボックスの中に値が入っていると、実行ボタンをクリックしたときは正常にやりたい結果を出すことが実現できます。 ファイルを閉じた後に再度開いてもコンボボックスの中に値があるようにするにはどうしたらよいのか、ド素人の私にご教授いただきたくお願いいたします。

  • EXCELのシート上に埋め込んだチェックボックスの一括処理方法について

    EXCEL VBAのコード記載方法について教えていただきたいことがあります。 Sheets("Test")上にコントロールツールボックスのチェックボックスを 100個とコマンドボタンを1個配置する。 コマンドボタンをクリックすると、CheckBox1~100を全てTrueにする。 これを、 Private Sub CommandButton1_Click() Sheets("Test").CheckBox1 = True Sheets("Test").CheckBox2 = True ・ ・ ・ End Sub と100回書くのではなく、配列化して記載することは可能なのでしょうか。 ユーザーフォームのチェックボックスであれば Dim i As Integer For i = 1 To 100 UserForm1.Controls("CheckBox" & i) = True Next i で出来ると思うのですが、シート上に埋め込むチェックボックスですと、どうにも上手く動いてくれません。 丁寧に全部書いていけばいいのですが、行が沢山増えてしまい見にくいのと、数字の書き間違いが出たりして作業が煩瑣なので、 可能であればまとめて処理してしまいたいと考えています。 どうぞよろしくお願いいたします。

  • チェックボックスの左隣の値をLOOPで取得貼付

    SheetAにあるチェックボックス(名前はBox1~15)で Trueのものの、右側セルの値だけを sheets("KEY")のA列最終行に順番に張り付けていきたいのですが、 下記のコードですと、TrueのチェックボックスのBox番号が一番大きいもの(たとえばBox1~6までtureだとした場合Box6だけ)しか反映されない Loop処理がかかっているのか微妙です。 何が問題なのかわかりません。 どなたか教えてください。。。。 ------------------------------------ Sub チェックボックスの左隣の値取得(1)() Dim lastRow1 As Long Dim i As Long lastRow1 = Worksheets("KEY").Range("A" & Rows.Count).End(xlUp).Row For i = 1 To 15 'CheckBoxの数 If Worksheets("SheetA").OLEObjects("Box" & i).Object.Value Then Worksheets("KEY").Range("A" & lastRow1 + 1) = Worksheets("SheetA").OLEObjects("Box" & i).TopLeftCell.Offset(0, 1).Value ' Else End If Next i End Sub

  • エクセル、ワークシートが保護されているかどうかを判断するVBAは?

    以下のように書いてもダメでした。 どう直せばよいでしょうか? Sub TEST2() Dim n As Integer n = ThisWorkbook.Worksheets.Count For i = 1 To n If Worksheets(i).Protect = False Then MsgBox Worksheets(i).Name End If Next End Sub

  • シートの増減あっても特定セルに連番したい

    Excel2007でマクロ作成の初心者です。 すべてのシートのR15セルに、シートの順番どおり 1から連番で番号をつけるマクロを教えていただきました。 Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim i As Integer For i = 1 To ThisWorkbook.Worksheets.Count Worksheets(i).Range("R15").Value = i Next i End Sub これを以下のように改良したのですが、新しく追加したシートにはなぜか 番号が表示されません。どうしたら、うまく連番が入るようになるでしょうか。 Sub シートに連番() Dim i As Integer For i = 1 To ThisWorkbook.Worksheets.Count Worksheets(i).Range("R15").Value = i Next i End Sub

  • Excel マクロ 別ブックの情報をコピーする方法

    他のブックの情報をコピーして貼り付けるマクロを作成しています。 2種類のブックから情報をコピーして貼り付けます。 Sub MailTemp() Dim myCellall As Range Dim myCellyoso As Range Dim myCellfor As Range Set myCellall = Sheets("すべて").Range("A3") With Workbooks.Open("\") With .Worksheets("すべて") .Range(.Range("A3"), .Cells.SpecialCells(xlCellTypeLastCell)).Copy myCellall End With .Close False End With Set myCellyoso = ThisWorkbook.Worksheets("予測").Range("A3") Set myCellfor = ThisWorkbook.Worksheets("結果").Range("A3") With Workbooks.Open("\別ブック") With .Worksheets("予測") .Range(.Range("A3"), .Cells.SpecialCells(xlCellTypeLastCell)).Copy myCellyoso End With With .Worksheets("結果") .Range(.Range("A3"), .Cells.SpecialCells(xlCellTypeLastCell)).Copy myCellfor End With .Close False End With End Sub 下記の箇所でエラーが発生して、先に進みません。 原因を調べていましたが、わかりません。 Set myCellfor = ThisWorkbook.Worksheets("結果").Range("A3") エラーメッセージ 実行時エラー'9' インデックスが有効範囲にありません。 アドバイスを頂けますでしょうか。 よろしくお願いいたします。

  • エクセル マクロ:チェックボックス コピー3

    前回、質問した件で、追加で質問させていただきます。 前回の質問は、sheet2のチェックボックスによって、sheet1の列をコピーして、sheet3にペーストするという内容でした。 keithin様からご回答いただき問題は解決しましたが、修正を加えなくてはならなくなりました。 sheet2のチェックボックスによってsheet1の列とsheet4の列をコピーして、sheet3にペーストしようと頑張りましたが、解決できそうにありません。 尚、sheet1とsheet4の行数は同じで、sheet1とsheet4のA列は同じ内容なので必要ありません。 下記が前回のベストアンサーです。 private sub CommandButton1_Click()  dim res as range  dim rmax as long  dim i as integer  dim flg as boolean  rmax = worksheets("Sheet1").range("B1").end(xldown).row  set res = worksheets("Sheet1").range("A1:A" & rmax)  for i = 1 to 20   if worksheets("Sheet2").oleobjects("CheckBox" & i).object.value then    set res = union(res, worksheets("Sheet1").range("A1:A" & rmax).offset(0, i))    flg = true   end if  next i  if not flg then  msgbox "NO CHECK"  exit sub  end if  res.copy  worksheets("Sheet3").range("A1").pastespecial paste:=xlpastevalues  worksheets("Sheet3").select end sub keithin様 無断で借用させていただきました。申し訳ございません。

専門家に質問してみよう