0

私はVBAを初めて使用します(そして、Excel内でのみ知っています)。

いくつかの(すべてではない)チェックボックスを循環しようとしています。現在、CheckBox1 から CheckBox15 までの名前が付けられています。たとえば、CheckBox5からCheckBox10までを循環させるにはどうすればよいですか?

名前を確認できるコントロールの「CheckType」に似た「メソッド」があることを望んでいると思いますか?

これが私が試したことです。コンパイル エラーが発生します - Sub または Function が定義されておらず、ワークシートが強調表示されます。

Private Sub BoxCheck()
atLeastOneChecked = False
    For i = 2 To 4
        If Worksheets("ActiveX").Controls("Checkbox" & i).Value = True Then
            atLeastOneChecked = True
        End If
    Next i
End Sub

上記は機能しませんが、以下は機能します。

Private Sub BoxCheck()
    atLeastOneChecked = False

    For i = 1 To 2
       If Sheet2.CheckBox2.Value = True Then
                atLeastOneChecked = True
       End If
    Next i

End Sub

もちろん、ループは結果に影響しませんが、コンパイルされ、Checkbox2 が True の場合、atLeastOneChecked が False から True に変わります。Sheet2 の名前が ActiveX になっていることに注意してください。ワークシートとコントロールがどのように機能するかがはっきりとわかりません。誰か助けてくれませんか?

以下で説明するエラーを修正した後でも、これは機能しません。私は次のように簡略化しました:

Private Sub BoxCheck()
    Dim ole As OLEObject

    atLeastOneChecked = False
    Set ole = Sheets("ActiveX").OLEObjects("Checkbox2")
    If ole.Value = True Then
        atLeastOneChecked = True
    End If
 End Sub

これはうまくいきません。次の時点で失敗します。

If ole.Value = True Then

エラー状態: オブジェクトはこのプロパティまたはメソッドをサポートしていません

これは OLEObject には当てはまりますが、チェックボックスには当てはまりません。ole のプロパティを見ると、その Object プロパティが Object/Checkbox に設定されており、この Object に値があることがわかります。それがifステートメントで参照する必要があると思いますが、方法がわかりません。

4

3 に答える 3

1

私は問題を解決したと思います。

チェックボックスの値にアクセスするには、設定したOLEObject内のObjectプロパティを参照します...次のようになります。

If ole.Object.Value = True Then

ご協力ありがとうございます。誰かがもっとエレガントな解決策を持っているなら、私はまだそれを見たいです。

于 2012-11-17T20:51:32.463 に答える
0

使用するCheckBox.Name

例:

For Each cb In ActiveSheet.CheckBoxes 
    If cb.Name = "CheckBox5"
        ' Do stuff
    End If
Next cb 
于 2012-11-15T18:21:56.490 に答える
0

@Parkerの回答を拡張するには:

Private Sub BoxCheck()
    atleastonechecked = False
    Dim oles As OLEObject
    For i = 2 To 4
        'If you're using Shapes Controls:
        If ThisWorkbook.Worksheets("ActiveX").Shapes("Check Box " & i).Value = True Then
            atleastonechecked = True
        End If
        ' If you're using ActiveX Controls
        Set oles = ThisWorkbook.Worksheets("ActiveX").OLEObjects("CheckBox" & i)
        If oles.Value = True Then
            atleastonechecked = True
        End If
    Next i
End Sub

申し訳ありませんが、テストせずに前の回答をまとめてください。これは常に失敗します。使用してIfいるコントロールのタイプに基づいてループを使用してください。

于 2012-11-15T18:27:42.953 に答える