checkboxの値の取得方法

このQ&Aのポイント
  • checkboxをセルRange("C1")から下方に10個作成しています。
  • [質問1]  10個のセルにcheckboxは作成されるのですが、この後、これらに設定したセルの値(Check on/off)を判定するには、どのようコーディングすればよいのでしょうか?
  • [質問2] 10個のセル作成時、当初 ".LinkedCell=" で指定したセルに「True/False」が表示されていましたが、現在以下の処理を行っても「True/False」が表示されません。確認事項や対処方法にお心あたりがあれば、ご教授願います。
回答を見る
  • ベストアンサー

checkboxの値の取得方法

教えてください (excel2010) checkboxをセルRange("C1")から下方に10個作成しています。(下方を参照) 質問は2点あります。 [質問1]  10個のセルにcheckboxは作成されるのですが、この後、これらに設定したセルの値(Check on/off)を判定するには、どのようコーディングすればよいのでしょうか? [質問2] 10個のセル作成時、当初 ".LinkedCell=" で指定したセルに「True/False」が表示されていましたが、現在以下の処理を行っても「True/False」が表示されません。 確認事項や対処方法にお心あたりがあれば、ご教授願います。  '------------------------------------------ checkbox 10個作成 Dim myChk As Object Dim i As Long Dim 個数 As Long Dim 開始セル As Range 個数 = 10               'チェックボックス作成数 Set 開始セル = Range("C1")   'チェックボックス作成の開始セル位置 For i = 0 To 個数 - 1 With StartCell.Offset(i) Set myChk = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, _ DisplayAsIcon:=False, _ Left:=.Left, Top:=.Top, _ Width:=.Width, Height:=.Height) End With With myChk .LinkedCell = 開始セル.Offset(i, 1).Address .Object.Caption = "" .Object.Value = False End With Next

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

  • ベストアンサー
  • eden3616
  • ベストアンサー率65% (267/405)
回答No.3

>教えていただいたスクリプトを実行すると、列1から列20にチェックボックスが作成されますが、 No2のコードでしたら、列ではなく行ですね。あと20個ではなく10個かと。 >特定のセル(たとえばセルA3)が「現在、checkされているか否か」を判断するのは A3の何をチェックしたいかによって処理が異なります。 以下の3パターンを考えてみました。 (1)セルA3に配置されているチェックボックスの状態を判定  セルA3のTopとLeftの値と、チェックボックスのTopとLeftの値との差分を全て調べ、  差分が一番小さい(A3付近にあるチェックボックス)を取得します (2)A3セルがリンクセルとしてリンクしているチェックボックスの状態を判定  LinkedCellを調べてA3であるかを判定して取得します (3)A3セリがリンクセルとしてリンクセルの状態を判定  A3セルに表示されている「TRUE」「FALSE」を判定して取得します >どのような処理を書けばよいのでしょうか? 以下のVBAコードで上記3パターンで取得しています ■VBAコード Sub Macro2() Dim i As Integer Dim sabun As Double Dim bk_sabun As Double Dim idx As Integer Dim flag As Integer '------------------------------------------------------- '(1)A3セルにあるチェックボックスの状態を取得 With ActiveSheet   'アクティブシート上のOLEObjectに対して処理   For i = 1 To .OLEObjects.Count     'チェックボックスであるか判定     If TypeName(.OLEObjects(i).Object) = "CheckBox" Then       'チェックボックスのLeft、Topとセル"A3"のLeft、Topとの差分を取得       sabun = Abs(.OLEObjects(i).Left - .Range("A3").Left) _         + Abs(sabun + .OLEObjects(i).Top - .Range("A3").Top)       '差分が控えの差分より小さければ、控えの差分を更新して要素を記憶       If i = 1 Then bk_sabun = sabun       If bk_sabun >= sabun Then bk_sabun = sabun: idx = i     End If   Next i   '要素idxのチェックボックスの状態を判定   If .OLEObjects(idx).Object.Value Then     MsgBox .OLEObjects(idx).Object.Caption & "はチェックされています", vbOKOnly, "パターン(1)"   Else     MsgBox .OLEObjects(idx).Object.Caption & "はチェックされていません", vbOKOnly, "パターン(1)"   End If End With '------------------------------------------------------- '(2)リンクセルがA3であるかを判定して状態を取得 With ActiveSheet   'アクティブシート上のOLEObjectに対して処理   For i = 1 To .OLEObjects.Count     'チェックボックスであるか判定     If TypeName(.OLEObjects(i).Object) = "CheckBox" Then       'リンクセルがA3のチェックボックスの状態       If .OLEObjects(i).LinkedCell = "A3" Then         'フラグを立てる         flag = 1         'ループを抜ける         Exit For       End If     End If   Next i   'チェックボックスが見つかったか見つかっていないかflagで判定   If flag Then     'チェックボックスの状態を判定     If .OLEObjects(i).Object.Value Then       MsgBox .OLEObjects(i).Object.Caption & "はチェックされています", vbOKOnly, "パターン(2)"     Else       MsgBox .OLEObjects(i).Object.Caption & "はチェックされていません", vbOKOnly, "パターン(2)"     End If   Else     MsgBox "対象のセルがリンクされているチェックボックスが見つかりません", vbOKOnly, "パターン(2)"   End If End With '------------------------------------------------------- '(3)セル"A3"の値("true" or "false")で判定 If Range("A3").Value Then   MsgBox Range("A3").Address(False, False) & "はチェックされています", vbOKOnly, "パターン(3)" Else   MsgBox Range("A3").Address(False, False) & "はチェックされていません", vbOKOnly, "パターン(3)" End If End Sub

hjr299
質問者

お礼

eden3616様 早々と回答いただき、ありがとうございました。 No2で再質問させていただいた"「現在、checkされているか否か」を判断するにはどのような処理を書けばよいのでしょうか?"に対する私の希望する回答は、お答えいただいた「(1)A3セルにあるチェックボックスの状態を取得」が該当します。 ありがとうございました。 また、回答のプロシジャーにはそれぞれのステートメントに親切な説明書きがあり、とてもわかりやすかったです。 また、「セル上のactiveXコントロールの状態判断」や「リンクセルの扱い方」の理解にもつながりました。 余談になりますが、 私が当初ActiveX checkboxを作成した折、.LinkedCellで指定されたセルにTrue/Falseが表示されており、これを元にCheck On/Offを判断していましたが、 いつかの時点からか、True/Falseが表示されなくなってしまいました。 これに対する質問が[質問2]となります。 また、この状態で、何とかCheck On/Offを判断したいがための質問が[質問1]となります。 「いつかの時点からか、True/Falseが表示されなくなってしまいました」の原因は、 sheet最上部の列表示を英字 「A B C D ---」から、数字「1 2 3 4 ---」に変更したためでした。 「Excelのオプション - 数式 - R1C1参照形式を使用する」のチェックを外し、「英字 「A B C D ---」に戻てからは True/False 正常に表示されています。 ------------------------------------------- [質問] 「checkboxの値の取得方法」の訂正 お気づきとは思いますが、 (誤) With StartCell.Offset(i) (正) With 開始セル.Offset(i) ------------------------------------------- ありがとうございました。  

その他の回答 (2)

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.2

アクティブシートに対してA1からA10までチェックボックスを作成し、 チェックボックスの状態を判定するコードです。 参考までに。 (VBAコード内に質問1、2の該当箇所を記述しています) ■VBAコード Option Explicit Sub Macro1() Dim i As Integer Dim myobj As Object 'チェックボックスを作成 For i = 1 To 10   'チェックボックスを作成   With ActiveSheet.Cells(i, "A")     Set myobj = ActiveSheet.OLEObjects.Add( _       ClassType:="Forms.CheckBox.1", _       Link:=False, _       DisplayAsIcon:=False, _       Left:=.Left, _       Top:=.Top, _       Width:=.Width, _       Height:=.Height)   End With   'チェックボックスを設定   With myobj     .Object.Caption = "CB" & i     .Object.Value = CBool(i Mod 2 = 0)     '【質問2】セルに値をセットしてから     ActiveSheet.Cells(i, "B") = .Object.Value     'セルとリンク     .LinkedCell = "B" & i   End With Next i '【質問1】チェックボックスの状態を取得 With ActiveSheet   'アクティブシート上のOLEObjectに対して処理   For i = 1 To .OLEObjects.Count     'チェックボックスであるか判定     If TypeName(.OLEObjects(i).Object) = "CheckBox" Then       'チェックボックスのオブジェクト名       .Cells(i, "C") = .OLEObjects(i).Name       'チェックボックスの名前       .Cells(i, "D") = .OLEObjects(i).Object.Caption       'チェックボックスの状態       .Cells(i, "E") = .OLEObjects(i).Object.Value     End If   Next i End With End Sub

hjr299
質問者

お礼

初めて「教えてgoo」を利用しました。悩んだあげくの質問に早々と回答いただき、とても感謝です。 お答えいただいた回答は私が欲していた完璧なものでした。ありがとうございました。 この際、もう一つ質問させてください。 教えていただいたスクリプトを実行すると、列1から列20にチェックボックスが作成されますが、特定のセル(たとえばセルA3)が「現在、checkされているか否か」を判断するのはどのような処理を書けばよいのでしょうか? よろしくお願いいたします。

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.1

[質問1] 直接チェックボックスを指定する場合は、 CheckBox1.Value、CheckBox2.Value・・・を調べます。 番号(変数:Num)で指定する場合は、 ActiveSheet.OLEObjects("CheckBox" & Num ).Object.Value ループで調べたり、数が多いとこのようにします。 [質問2] 見ただけです。コードの「StartCell」が?ですが、これが機能しているとすれば、D列に「True/False」が表示されるはずです。 >確認事項や対処方法にお心あたりがあれば  動かした後、デザインモードでチェックボックスのLinkedCellプロパティを見たらどうでしょうか。もしかしたら、D列が非表示だったりしませんか。 あくまで机上デバッグです。

関連するQ&A

  • (VBA)スピンボタンの大量コピー(相対参照)

    お世話になります。質問させていただきます。 表題件ですが、EXCELにて 「A列にコントロールツールの"スピンボタン"をリンクセルを相対参照にして縦に大量にコピー(さらに増減値をデフォルトの1から10に変更)」したいと考えています。 以下に記載したVBAコードは、こちらと同様のQ&Aサイトにて見つけてきた「A列にコントロールツールの"チェックボックス"をリンクセルを相対参照にして縦に大量にコピー」するコードです。 先ずは参考までにご確認ください。 ----------------------------------------------------------------- Sub Checkbox連続作成() Dim myChk As Object Dim i As Long Dim Sakuseisuu As Long Dim StartCell As Range '--------↓ここを変更--------- Sakuseisuu = 20 'チェックボックスの作成数 Set StartCell = Range("A1") 'スタートする位置 '--------↑ここを変更--------- For i = 0 To Sakuseisuu - 1 With StartCell.Offset(i) Set myChk = ActiveSheet _ .OLEObjects.Add(classtype:="Forms.CheckBox.1", _ Link:=False, DisplayAsIcon:=False, _ Left:=.Left, Top:=.Top, _ Width:=.Width, Height:=.Height) End With With myChk .LinkedCell = StartCell.Offset(i, 1).Address .Object.Caption = "" .Object.Value = False End With Next End Sub ------------------------------------------------------------------ 上記コードを参考に、「A列にコントロールツールの"スピンボタン"をリンクセルを相対参照にして縦に大量にコピー」すべく、コードを以下のように短絡的に書き換えてみましたが、エラーとなってしまいます。 ------------------------------------------------------------------ Sub SpinButton連続作成() Dim myspin As Object Dim i As Long Dim Sakuseisuu As Long Dim StartCell As Range '--------↓ここを変更--------- Sakuseisuu = 20 'チェックボックスの作成数 Set StartCell = Range("A1") 'スタートする位置 '--------↑ここを変更--------- For i = 0 To Sakuseisuu - 1 With StartCell.Offset(i) Set myspin = ActiveSheet _ .OLEObjects.Add(classtype:="Forms.SpinButton1.", _ Link:=False, DisplayAsIcon:=False, _ Left:=.Left, Top:=.Top, _ Width:=.Width, Height:=.Height) End With With myspin .LinkedCell = StartCell.Offset(i).Address .Object.Caption = "" .Object.Value = False End With Next End Sub ------------------------------------------------------------------ お詳しいかたがおられましたら、是非ともアドバイスを頂戴したく存じます。 さらにわがままを述べると、増減値をデフォルトの1から10に変更したく考えております。 何卒よろしくお願い申し上げます。

  • Excel VBA チェックボックスの判断

    下記のようなマクロでチェックボックスを作成したのですが、その作成したチェックボックスをクリックしたときに、ある処理を実行させるようにするにはどうすればいいのでしょうか? よろしくお願いします。 Dim Max as Long Dim Cell as Range Dim Check as CheckBox ・ ・ ・ For i = 0 To Max   With Cell.Offset(i)   Set Check = ActiveSheet.CheckBoxes.Add_     (Left:=.Left,Top:=.Top, Width:=.Width, Height:=.Height)   End With   With Check   .LinkedCell = Cell.Address   .Caption = ""   .Value = False   End With Next

  • CheckBoxとTextBoxの値を貼付る方法

    よろしくお願いします。 Dim n As Long Dim r As Range Dim C, buf As String n = Cells(Rows.Count, "A").End(xlUp).Row + 1 Range("A" & n).Select For Each C In Controls If TypeName(C) = "CheckBox" Then If C.Value Then buf = buf & C.Caption & vbCrLf End If Next C ActiveCell.Offset(-1, 16).Value = buf & TextBox9.Value ’buf=チェックされている複数のCheckBoxのCaption ’この時のActiveCell.Offset(-1, 16).ValueにはbufとTextBox9の値も表示されています。 End If で、セルに入力して ActiveCell.Offset(0, 7).Value = ActiveCell.Offset(-1, 16).Value で、セルに貼り付けようとすると、bufの値のみ表示されてTextBox9の値が表示されません。 bufの値とTextBox9の値と両方をコピー表示する方法をお教えください。

  • VBAのプログラムでCheckboxの使い方

    すみません。教えてください。 チェックボタンオブジェクト名を配列に格納したいのですが、可能でしょうか。 <内容> 例えば、チェックボタンオブジェクト名がcheckbox1~checkbox4まで在ったとき、"checkbox & 変数" にしたいのです。 <Sample> Sub CHECKBOX() Dim i As long For i = 1 To 4 With Worksheets(Sheet_No) On_Off(i) = .Controls("CheckBox" & i).Value End With Next i MsgBox (On_Off(2)) End Sub

  • 行方向の同じ値のセルを結合するマクロ

    ネットで色々調べながら、A列方向の同じ値のセルを結合させるマクロ を作ってみたのですが、もっと簡単にできるようでしたら教えていただきたいです。 どうぞよろしくお願いいたします。 Sub セル結合() Dim r As Integer '行数 Dim i As Integer 'カウンタ r = Sheets(1).Range("a1").CurrentRegion.Rows.Count - 1 Application.DisplayAlerts = False For i = 1 To r Cells(i, 1).Activate '項目の一つ下のセルをアクティブに If ActiveCell.Value = ActiveCell.Offset(1).Value Then Range(ActiveCell, ActiveCell.Offset(1)).Merge End If Next Application.DisplayAlerts = True End Sub

  • B列の値を参照して、A列に連番を振る方法

    A・B・C列があり、A列には連番を、B列にはVLOOKUP関数が入っており、 C列には、B列の検索値が入っております。 B列は下記のVBAコードで同じ値をセル結合させています。 Sub 結合() Dim rngU As Range Dim i As Range Dim rngB As Range Dim Key As String Set rngB = Range("B2") Set rngU = Range(Range("B3") _ , Range("B6000").End(xlUp).Offset(1)) Application.DisplayAlerts = False For Each i In rngU If Not i.Text = Key Then If (Not i.Offset(-1) Is rngB) And _ (Not i Is rngB) Then Range(rngB, i.Offset(-1)).MergeCells = True End If Set rngB = i End If Key = i.Text Next i Application.DisplayAlerts = True End Sub そこで、A:3から連番を振りたいのですが、B列の決まった特定の結合セルの 隣のA列のセルもB列の決まった特定の結合セルと同数にセル結合させ、 連番を1つとしてカウントしたいのです。 また、A列にはB列同様にVLOOKUP関数が入っており、連番を振りたくないセルには 印が付くようにしています。 行数やB列の決まった特定の結合セル番地はランダムに変わるため、B列の結合セルで参照させるしか ないのかなっと思っております。 B列の特定の結合セルの値は決まっております。 上記のような処理を自動にさせるためのVBAが分かる方がいらっしゃいましたら、 是非ご教授お願いいたします。

  • セルの値が欲しい

    セルに入力されている値を取得する方法といいますか理解が今だ出来ません エクセルの上記に入っている値*画像添付とセルに入力されている値が違う場合 セルに入力している値を取得したいのです、説明がわかりにくいかもしれませんので、情報が足らない際はおしゃってください、よろしくお願いします。 下記のコードでは画像に入っている値を取り出します。 Sub test() Dim ret As Range Dim piyo As Variant Application.ScreenUpdating = False Set ret = Range("M:M").Find(Application.Max(Range("M:M"))) piyo = ret.Offset(0, -1).Value MsgBox piyo END Sub

  • セルの値でなくセルの関数を参照したい

    次のコードでセルI13の値を入力できましたが、 '---------------------- 'Dim i As Integer 'For i = 2 To Worksheets.Count - 6 'With Worksheets(i) '.Range("I13") = Worksheets(1).Range("I13").Value 'End With 'Next セルの値でなく関数を入力しようとして次のコードに修正したらエラーになりました。どこがいけないのでしょうか。 Dim i As Integer For i = 2 To Worksheets.Count - 6 With Worksheets(i) .Range("I13").Formula = "=" & Worksheets(1).Name & "!I13" End With Next

  • VBAで複数の行のナンバーを取得し、その行の列の値を参照して値を入れる

    下記のことをしたいのですが、調べてもわかりません。 どなたか教えてください。 よろしくお願いします。 内容: エクセルシートのA列の値が11である行ナンバーを取得(複数ある可能性があります)する。 その行のE列(5列目)の値と他のテーブルの値を参照して所定の値をA列の値が11である行のE列(5列目)に返す。 以下のVBAを書いてみましたがうまくいきません。 ----------------------------------------------------------------- Dim ROWCOUNT As Integer Dim row_array() As Variant Dim i As Integer '全行数を取得 ROWCOUNT=Worksheets("sheet1").Range("A1",Range("A65536").End(xlUp)).Count For i = 1 To ROWCOUNT If Cells(i, 1).Value = 11 Then Cells(i,1).Offset(0,5).Value=WorksheetFunction.VLookup(Cells(i, 1).Offset(0, 5).Value, Worksheets("sheet2").Range("A1:H1786"), 3, False) End If Next I

  • セルの値を変数にする方法

    こんばんわ。 http://oshiete1.goo.ne.jp/qa4545875.html で、質問したことですが、新しく質問させていただきます。 ネット上のリンク先URLを取得することはできて 取得したURLをシート1のA1~A102に貼り付けてあります。 そのあとWebクエリを使って、シート2に A1のURLから結果データが取込んだら、次は A2のURLから結果データを取り込む~最終行まで結果データを シート2に取り込みしたいのですが、とうしたらよいでしょうか? Webクエリを使って、ひとつのURLから結果データを取り込むコードは 次のとおりです。 この処理を繰り返ししたいのですが、どなたか教えてください。 ---------------------------------------- Sub データ読込み() Dim i As Range Set i = Range("a" & Range("a" & Rows.Count).End(xlUp).Row).Offset(1) Range("a" & Range("a" & Rows.Count).End(xlUp).Row).Offset(1).Select With ActiveSheet.QueryTables.Add(Connection:= _ "URL;http://www.jra.go.jp/datafile/seiseki/replay/2008/001.html", Destination _ :=i) .Name = "001_3" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .WebSelectionType = xlSpecifiedTables .WebFormatting = xlWebFormattingNone .WebTables = "20" .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .WebSingleBlockTextImport = False .WebDisableDateRecognition = False .WebDisableRedirections = False .Refresh BackgroundQuery:=False End With End Sub

専門家に質問してみよう