我已经选择了工作表中所有使用过的范围UsedRange.Select
,但只想取消选择上面两个范围。有什么办法吗?
答案1
假设选择是手动进行的。如果选择是通过编程进行的,请不要这样做。相反,首先不要选择您不想选择的范围。
没有办法“取消选择”某个范围。某物需要选择,因此执行此操作的方法是选择您想要的最终范围。
如果选择了多个单元格,则Selection
对象将保存Range
包含多个的引用Areas
;您可以迭代Areas
并确定某个区域是否是您不想保留的“上两个范围”中的两个区域之一;如果不是,则Range
使用将它们添加到新对象中Union
,并且Select
在迭代所有区域后合并的范围 - 在相对较高的抽象级别,可能看起来像这样:
Public Sub DeselectUpperAreas()
Dim initialSelection As Range
Set initialSelection = Application.Selection
Dim finalSelection As Range
Dim currentArea As Range
For Each currentArea In initialSelection.Areas
If Not IsUnwantedRange(currentArea) Then
Set finalSelection = AppendRange(currentArea, finalSelection)
End If
Next
If Not finalSelection Is Nothing Then finalSelection.Select
End Sub
Private Function IsUnwantedRange(ByVal target As Range) As Boolean
'TODO evaluate whether target is wanted or not;
'return True if target is unwanted in the final selection
'IsUnwantedRange = (boolean expression)
End Function
Private Function AppendRange(ByVal target As Range, ByVal merged As Range) As Range
If merged Is Nothing Then
Set AppendRange = target
Else
Set AppendRange = Union(target, merged)
End If
End Function
IsUnwantedRange
从问题来看,如何实现该功能尚不清楚,但一种方法可能是使用您知道位于您不想选择的范围内的单元格来Intersect
指定,如果交集为,则返回。target
False
Nothing
另一种方法是传递整个initialSelection
,连同currentArea
,确定哪两个区域是“上两个范围”(Row
我猜是通过比较它们的属性),并返回True
是否target
是您不想包括的两个范围之一。
另一种方法是用Row
每个区域的值填充一个数组,使用WorksheetFunction.Small
(一次用k=1
,一次用k=2
)来定位您不想要的两个行号(它们是两个较小的值),然后返回True
是否target.Row
是这两个值之一。
请注意,在 Excel 的 VBA 中合法使用的情况Selection
非常少见;这取决于你打算用该选择做什么,这个帖子Select
可能有助于完全避免处理Activate
。