清除Excel中的单元格和6个checkbox

Excel中有一个button,附带一个VBA脚本来清除表单上的某些单元格。

有一个更清洁的代码来实现相同的结果吗? 由于某种原因,对于我的checkbox,1个代码清除所有6个盒子,是吗?

checkbox是我通过开发人员视图添加的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 

那么有一件事你可以有一系列的范围,并一次做到这一切。

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

至于你的checkbox,如果通过“清除”你的意思是“删除”或“删除”,那么是有道理的,如果另一方面,如果你想要清除一个checkbox,那么我认为这是你需要循环:

  OleObj.Object.Value = False 

回答你的第一个问题:

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

当你多次执行同一组命令时,将步骤封装到它们自己的sub中通常也是更好的做法:a)有一个更简洁的“main”过程,b)容易地让你调整过程希望它。

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

最后,如果想要清除的范围组或者可以改变的范围,定义一组范围并枚举集合(也称为“循环”),而不是为每个范围指定相同的命令本身。 大多数对象将通过一个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个checkbox,因为您循环遍历代码最后一部分表单上的所有activex对象,并将它们的Value属性设置为False,对于checkbox,取消选中它。