为什么我的Excel VBA代码在第一次尝试时没有完全执行?

为什么我的Excel VBA代码在第一次尝试时没有完全执行?,excel,vba,Excel,Vba,首先,我在Windows 10上使用Excel 2016 我在Excel中有一个电子表格,它利用两个宏来插入基于用户表单的数据,或者在有人想要清除电子表格时删除电子表格中的所有数据。这个问题的焦点是清除数据的程序(见下文),尽管我也将讨论另一个 Sub ClearData() ToDelete = MsgBox("Are you sure you want to delete all data?", vbYesNo, "Are you sure?") if ToDelete = vbYes

首先,我在Windows 10上使用Excel 2016

我在Excel中有一个电子表格,它利用两个宏来插入基于用户表单的数据,或者在有人想要清除电子表格时删除电子表格中的所有数据。这个问题的焦点是清除数据的程序(见下文),尽管我也将讨论另一个

Sub ClearData()

ToDelete = MsgBox("Are you sure you want to delete all data?", vbYesNo, "Are you sure?")

if ToDelete = vbYes Then
   ActiveSheet.Unprotect "Password"
   Do While Range("A2").Value <> ""
      Range("A2:J2").Delete Shift:=xlUp
   Loop

   ActiveSheet.Protect "Password"
End If

End Sub
Sub-ClearData()
ToDelete=MsgBox(“您确定要删除所有数据吗?”,vbYesNo,“您确定吗?”)
如果ToDelete=vbYes,则
ActiveSheet.Unprotect“Password”
Do While范围(“A2”)。值“”
范围(“A2:J2”)。删除移位:=xlUp
环
ActiveSheet.保护“密码”
如果结束
端接头
代码非常简单。它要求用户确认要删除所有数据,如果要删除,它将解锁工作表,连续删除第二行,直到没有更多行,然后将工作表锁定回原位

问题:假设我的电子表格中有10行数据,点击指向ClearData()子项的按钮。在这种情况下,第一行删除,然后宏完全停止,留下9行数据。现在,如果我再次点击ClearData()按钮,宏将完美地执行并删除剩余的9行

我想问题可能在于锁定和解锁代码的电子表格部分。因此,我手动解锁工作表并单击按钮,同样的错误也发生了

“insert data”宏偶尔会出现的另一个类似问题是,它只会将数据添加到一个单元格(甚至不是整行,只是第一个单元格)。然后,如果我再次运行该程序并在userform中输入相同的确切信息,则所有信息都会正确填写。在这两种情况下,宏都会运行几行代码,直到执行实际更新电子表格的第一行代码,然后完全退出代码而不执行任何其他行。还请注意,也不会出现错误消息


需要注意的一点是,此问题似乎是间歇性的。我又试了一次,数据填写和清除正确。有一件事我可以做,这将导致“插入数据”宏出现问题。如果我更改代码并再次保存,即使更改的代码不相关(例如,在注释中添加空格),下一次执行时也会发生插入数据错误

不是你问题的实际答案,而是一个帮助调试的建议

添加一个陷阱来检测错误情况,并进入调试模式,这样您就可以检查事情的状态

Sub ClearData()
    Dim ToDelete As VbMsgBoxResult
    Dim RowCount As Long

    ToDelete = MsgBox("Are you sure you want to delete all data?", vbYesNo, "Are you sure?")

    If ToDelete = vbYes Then
       ActiveSheet.Unprotect "Password"
       Do While Range("A2").Value <> ""
          Range("A2:J2").Delete Shift:=xlUp
          RowCount = RowCount + 1
       Loop
       If RowCount = 1 Then Stop
       ActiveSheet.Protect "Password"
    End If

End Sub

我有点搞不懂你为什么要用循环。删除应该在一条语句中完成。更准确地说:ActiveSheet.UsedRange.Delete,或者如果需要在ActiveSheet.Range(“A2:J”&ActiveSheet.UsedRange.rows.Count)中保留一些行。删除有用提示:您可以删除
ActiveSheet.Protect“Password”
,并替换
ActiveSheet.Unprotect“Password”
带有
ActiveSheet.Protect“Password”,UserInterfaceOnly:=True
。这将允许VBA编辑图纸,但不允许用户编辑。虽然我会重写部分代码以使执行更加顺畅,但您可以尝试调用该“错误”,但不要运行它,而是逐步检查代码并逐步检查VBA所做的工作。
Sub ClearData()
    Dim rng As Range
    If MsgBox("Are you sure you want to delete all data?", vbYesNo, "Are you sure?") <> vbYes Then Exit Sub

    With ActiveSheet
        Set rng = .Range(.Cells(.Rows.Count, 1).End(xlUp), .Cells(2, 1))

        ' account for possibility there are no data rows
        If rng.Row = 1 Then Exit Sub

       .Unprotect "Password"
       rng.EntireRow.Delete
       .Protect "Password"
    End With
End Sub