【问题标题】:Clearing cells in excel and 6 checkboxes清除excel中的单元格和6个复选框
【发布时间】:2015-08-06 22:31:04
【问题描述】:

我在 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

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    首先,您可以拥有一串范围并一次完成所有操作。

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

    至于您的复选框,如果“清除”是指“删除”或“删除”,那么这是有道理的,另一方面,如果您只想清除一个复选框,那么我认为这就是你需要在循环中:

            OleObj.Object.Value = False
    

    【讨论】:

    • 我想我会使用你的代码来清除单元格,并保留我的复选框代码。现在似乎一切正常。
    【解决方案2】:

    回答你的第一个问题:

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

    当您多次执行同一组命令时,通常最好将这些步骤封装到自己的子程序中,以便 a) 拥有更整洁的“主”过程 b) 轻松地使您能够适应该过程,如果你以后希望它。

    但是,如果这是次要的并且不太可能更改代码的一部分,则第二点绝对是可选的,因为实际的“步骤”只是对 Range.ClearContents 的一次调用。事实上,如果它的字面意思是只清除 5 个单元格,我可能会像你在潜艇中那样保留它。我在下面展示了替代方案,仅供将来更复杂的位参考。

    最后,如果您希望清除或执行操作的范围组可能会更改,那么定义一组范围并枚举该集合(也称为“循环”)而不是指定相同的命令也是一种很好的做法对于每个范围本身。大多数对象将通过集合或数组进行处理。但是对于范围,一个范围可以包含许多连续和非连续单元格的范围。使用 range 对象的 .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,对于复选框,这将取消选中它。

    【讨论】:

    • 我在上面尝试了你的代码,我得到一个错误,说“无法更改合并单元格的一部分” 大多数单元格都被合并了,我需要一行“rng.ClearContents”
    猜你喜欢
    • 2014-06-12
    • 2019-02-19
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 2020-09-30
    • 1970-01-01
    相关资源
    最近更新 更多