1

Excel のワークシートのすべてのチェック ボックスをオフにし、チェック ボックスの左側のセルからデータを削除する VBA コードをプログラムしようとしています (チェック ボックスがオンのときに別のマクロから入力される日付です)。 .

私のチェックボックスはフォームツールバーのものです。ボックスのチェックを外すことはできますが、コードを挿入して日付を削除するとすぐに

実行時エラー「1004」「ワークシート クラスのチェックボックス プロパティを取得できません」。

これが私が作業しようとしているコードです:

Sub ClearAllCheckboxes()
Dim Answer As String
Dim MyNote As String
Dim CB As Object
Dim LRange As String
Dim cBox As CheckBox

LName = Application.Caller
Set cBox = ActiveSheet.CheckBoxes(LName)
MyNote = "This will Clear all CheckBoxes Proceed? "
Answer = MsgBox(MyNote, vbQuestion + vbYesNo, "???")
LRange = "F" & CStr(LRow)

If Answer = vbNo Then
    Exit Sub
Else
    For Each CB In ActiveSheet.CheckBoxes
        CB.Value = xlOff
        If cBox.Value = 0 Then
            ActiveSheet.Range(LRange).Value = Null
        End If
    Next CB
End If

End Sub

日付を追加し、別のワークシートに情報を記録するためにチェックボックスで使用されるコードは次のとおりです。

Sub Process_CheckBox()

Dim cBox As CheckBox
Dim LRow As Integer
Dim LColumn As Integer
Dim RRow As Integer
Dim LRange As String
Dim RRange As String
Dim ERange As String
Dim FRange As String



LName = Application.Caller
Set cBox = ActiveSheet.CheckBoxes(LName)

'Find row that checkbox resides in
LRow = cBox.TopLeftCell.Row
LRange = "F" & CStr(LRow)
RRow = cBox.TopLeftCell.Row
RRange = "B" & CStr(RRow)
ERange = "E" & CStr(RRow)
FRange = "F" & CStr(RRow)


'Change date in column B, if checkbox is checked
If cBox.Value > 0 Then
ActiveSheet.Range(LRange).Value = Date
ActiveSheet.Range(RRange).Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Log").Select
Range("A" & ActiveSheet.Rows.Count). _
End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
    xlNone, SkipBlanks:=False, Transpose:=False
Columns("A:A").EntireColumn.AutoFit

Sheets("Daily").Select
ActiveSheet.Range(ERange).Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Log").Select
Range("D" & ActiveSheet.Rows.Count). _
End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
    xlNone, SkipBlanks:=False, Transpose:=False

Sheets("Daily").Select
ActiveSheet.Range(FRange).Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Log").Select
Range("C" & ActiveSheet.Rows.Count). _
End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
    xlNone, SkipBlanks:=False, Transpose:=False

'Clear date in column B, if checkbox is unchecked
Else
  ActiveSheet.Range(LRange).Value = Null
End If

End Sub
4

2 に答える 2

1

あなたの説明に基づいて、これは仕事をするはずです。
いくつかのポイント:

  • 可能であれば、ActiveSheet の使用は避けてください。問題のシートを直接参照するMe.か、コードがシートにある場合は使用します。例えばFor Each cBox In Me.CheckBoxes
  • ClearAllCheckBoxes 関数に LRow を追加しなかったため、欠落していました。cBox.TopLeftCell.Rowとの.Column値を直接参照する場合は必要ありません。
  • すべての関数呼び出しを変数に保存する必要はありません。
    • それ以外の:LName = Application.Caller, Set cBox = ActiveSheet.CheckBoxes(LName)
    • 行う:Set cBox = ActiveSheet.CheckBoxes(Application.Caller)
  • 同様に、後で回答を使用しない場合はMsgbox、ステートメントで直接使用できます。If
  • Valueオブジェクトの値を設定および取得しようとするときは、通常、オブジェクトのプロパティを参照する必要はなく、オブジェクトだけを参照する必要があります。
  • ライン上で複数の変数をディメンション化できます。as <type>各変数名の隣に必ず を付けてください。そうしないと、バリアントとしてディメンション化されます。
  • Nextステートメントの後にループしている変数を配置する必要はありません(一列にたくさんの変数があり、混乱しているように見えない限り)。
  • 以下の colOffset 変数は、整数に置き換えることができます。あなたの日付のセルがどれくらい離れているのかわからないので、入れました。私のテスト シートでは、ボックスの右側の 1 つのセルでした。


Sub ClearAllCheckboxes()
    Dim cBox As CheckBox, colOffset as Integer

    colOffset= 1 'You need to set this to however far away the date cell is from your checkbox
    If MsgBox("This will Clear all CheckBoxes Proceed? ", vbQuestion + vbYesNo, "???") = vbYes Then
        For Each cBox In ActiveSheet.CheckBoxes
           cBox = xlOff

           ActiveSheet.Cells(cBox.TopLeftCell.Row,cBox.TopLeftCell.Column + colOffset) = Null
        Next
    End If
End Sub
于 2013-11-07T13:12:47.010 に答える