• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:checkboxの値の取得方法)

checkboxの値の取得方法

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

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

  • ベストアンサー
  • 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