教えてください (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
>教えていただいたスクリプトを実行すると、列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
質問者
お礼
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)
-------------------------------------------
ありがとうございました。
アクティブシートに対して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
お礼
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) ------------------------------------------- ありがとうございました。