アプリ版:「スタンプのみでお礼する」機能のリリースについて

教えてください (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

A 回答 (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
    • good
    • 0
この回答へのお礼

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)
-------------------------------------------

ありがとうございました。
 

お礼日時:2014/08/08 21:56

アクティブシートに対して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
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/08/07 01:39

[質問1]


直接チェックボックスを指定する場合は、
CheckBox1.Value、CheckBox2.Value・・・を調べます。

番号(変数:Num)で指定する場合は、
ActiveSheet.OLEObjects("CheckBox" & Num ).Object.Value
ループで調べたり、数が多いとこのようにします。


[質問2]
見ただけです。コードの「StartCell」が?ですが、これが機能しているとすれば、D列に「True/False」が表示されるはずです。

>確認事項や対処方法にお心あたりがあれば 
動かした後、デザインモードでチェックボックスのLinkedCellプロパティを見たらどうでしょうか。もしかしたら、D列が非表示だったりしませんか。


あくまで机上デバッグです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています