我在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
答案 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,这对于复选框取消选中它。