清除Excel中的单元格和6个复选框

时间:2014-03-19 20:58:10

标签: excel vba excel-vba

我在Excel中有一个按钮,其上附有VBA脚本以清除工作表上的某些单元格。

是否有更清晰的代码来实现相同的结果? 另外对于我的复选框由于某种原因,1段代码清除所有6个框,这是对的吗?

复选框是我通过开发人员视图添加的activeX框。

   Sub ClearForm()
   Range("I9:I10").Select
   Selection.ClearContents

   Range("I13:I17").Select
   Selection.ClearContents

   Range("H20").Select
   Selection.ClearContents

   Range("C5").Select
   Selection.ClearContents

   Range("C9:C10").Select
   Selection.ClearContents

   Range("C13:C18").Select
   Selection.ClearContents

    Dim OleObj As OLEObject

    For Each OleObj In ActiveSheet.OLEObjects
        If OleObj.progID = "Forms.CheckBox.1" Then
            OleObj.Object = False
       End If
    Next OleObj
End Sub

2 个答案:

答案 0 :(得分:3)

一方面,你可以拥有一系列范围并一次完成所有工作。

Range("I9:I10, I13:I17, H20, C5, C9:C10, C13:C18").Select
Selection.ClearContents

至于你的复选框,如果通过"清除"你是说"删除"或"删除"然后是的,这是有道理的,如果另一方面,你想要做的就是清除一个复选框,那么我认为这就是你在循环中所需要的:

        OleObj.Object.Value = False

答案 1 :(得分:3)

回答你的第一个问题:

Range.Select是不必要的,实际上会减慢执行速度。您可以直接在范围对象本身上调用.ClearContents。我想你是因为宏录音机而做了Range.Select位。虽然它是了解Excel对象模型的有用工具,但也要记住它确实会产生一些丑陋的部分; - )

当你多次执行相同的命令集时,通常更好的做法是将步骤封装到它们自己的子程序中a)有一个更整洁的“主”程序和b)轻松地使你适应这个过程,如果你以后希望它。

然而,如果这是次要的并且不太可能改变代码的一部分,那么第二点肯定是可选的,因为实际的“步骤”只是对Range.ClearContents的单个调用。实际上,如果它的确只是为了清除5个细胞,我可能会像你在sub中那样保持它。我在下面展示了替代方案,仅供将来更复杂的位参考。

最后,如果要清除或执行操作的范围组可能会发生变化,那么定义一组范围并枚举该组(也称为“循环”)而不是指定相同的命令也是一种好习惯。对于每个范围本身。大多数对象将通过Collection或数组处理。但是对于范围,范围可以包含许多范围的连续和非连续单元格。通过使用范围对象的.Areas属性来引用每组连续单元格,该属性返回该区域的范围。我也在下面演示了这一点。

请注意,正如另一个回答者所示,Range.ClearContents可以同时对多个区域进行操作,因此在这种情况下不需要循环遍历区域(它适用于许多其他操作)。

例如:

Sub ClearForm()

   Dim rng As Range

   For Each rng in Range("I9:I10,I13:I17,...etc...").Areas
       clearRange rng
   Next rng

   ...Rest of code...

End Sub
Private Sub clearRange(rng As Range)
    rng.ClearContents
End Sub

关于你的第二个问题:6个复选框被清除,因为你在代码的最后部分循环遍历工作表上的所有activex对象,并将其Value属性设置为False,这对于复选框取消选中它。