教えてください (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
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
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)
-------------------------------------------
ありがとうございました。
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
初めて「教えてgoo」を利用しました。悩んだあげくの質問に早々と回答いただき、とても感謝です。
お答えいただいた回答は私が欲していた完璧なものでした。ありがとうございました。
この際、もう一つ質問させてください。
教えていただいたスクリプトを実行すると、列1から列20にチェックボックスが作成されますが、特定のセル(たとえばセルA3)が「現在、checkされているか否か」を判断するのはどのような処理を書けばよいのでしょうか?
よろしくお願いいたします。
No.1
- 回答日時:
[質問1]
直接チェックボックスを指定する場合は、
CheckBox1.Value、CheckBox2.Value・・・を調べます。
番号(変数:Num)で指定する場合は、
ActiveSheet.OLEObjects("CheckBox" & Num ).Object.Value
ループで調べたり、数が多いとこのようにします。
[質問2]
見ただけです。コードの「StartCell」が?ですが、これが機能しているとすれば、D列に「True/False」が表示されるはずです。
>確認事項や対処方法にお心あたりがあれば
動かした後、デザインモードでチェックボックスのLinkedCellプロパティを見たらどうでしょうか。もしかしたら、D列が非表示だったりしませんか。
あくまで机上デバッグです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- Visual Basic(VBA) QRコード作成マクロについて 3 2022/11/26 16:55
- PowerPoint(パワーポイント) ExcelのVBAコードについて教えてください。 3 2022/05/25 14:32
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
Excel VBAでCheckboxの名前を変数にとって値を調べたい
Visual Basic(VBA)
-
エクセルでObjectがあるセル番地を取得するマクロは?
Excel(エクセル)
-
エクセル・VBA CheckBoxのオブジェクト名に変数を使うことは可能でしょうか?
Excel(エクセル)
-
-
4
フォームのCheck boxとOLEObjectのCheckboxのマクロの違い?
PowerPoint(パワーポイント)
-
5
Excel2007 でのチェックボックスの名称
Visual Basic(VBA)
-
6
【VBA】シート上の複数のチェックボックスのうちどれか一つでも変更した場合のイベント
Visual Basic(VBA)
-
7
EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セルをクリック⇒そのセルに入力...
-
【エクセル】IF関数 Aまたは...
-
エクセルで指定したセルのどれ...
-
Excelで数式内の文字色を一部だ...
-
Excelでセルの値が同じか...
-
EXCEL VBA セルに既に入...
-
エクセルのセルの枠を超えて文...
-
エクセル 足して割る
-
Excelでのコメント表示位置
-
貼り付けで複数セルに貼り付けたい
-
エクセルの一つのセルに複数の...
-
エクセル オートフィルタで絞...
-
Excel2003 の『コメント』の編...
-
Excelで住所を2つ(町名迄と番...
-
対象セル内(複数)が埋まった...
-
エクセルでオブジェクトを常に...
-
エクセルで以下の条件の時、関...
-
エクセルvba (ByVal Targ...
-
(Excel)数字記入セルの数値の後...
-
枠に収まらない文字を非表示に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで指定したセルのどれ...
-
【エクセル】IF関数 Aまたは...
-
貼り付けで複数セルに貼り付けたい
-
対象セル内(複数)が埋まった...
-
Excelで数式内の文字色を一部だ...
-
セルをクリック⇒そのセルに入力...
-
Excelでのコメント表示位置
-
エクセル 足して割る
-
excelのCOUNTIF関数で、『範囲=...
-
EXCEL VBA セルに既に入...
-
エクセル オートフィルタで絞...
-
エクセルのセルの枠を超えて文...
-
(Excel)数字記入セルの数値の後...
-
エクセルの一つのセルに複数の...
-
【Excel】 セルの色での判断は...
-
Excel2003 の『コメント』の編...
-
エクセル “13ヶ月”を“1年1ヶ月...
-
複数のセルのいずれかに数字が...
-
枠に収まらない文字を非表示に...
-
excelの特定のセルの隣のセル指...
おすすめ情報