如何在 Excel VBA 中取消选择特定数据?

如何在 Excel VBA 中取消选择特定数据?

我已经选择了工作表中所有使用过的范围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指定,如果交集为,则返回。targetFalseNothing

另一种方法是传递整个initialSelection,连同currentArea,确定哪两个区域是“上两个范围”(Row我猜是通过比较它们的属性),并返回True是否target是您不想包括的两个范围之一。

另一种方法是用Row每个区域的值填充一个数组,使用WorksheetFunction.Small(一次用k=1,一次用k=2)来定位您不想要的两个行号(它们是两个较小的值),然后返回True是否target.Row是这两个值之一。

请注意,在 Excel 的 VBA 中合法使用的情况Selection非常少见;这取决于你打算用该选择做什么,这个帖子Select可能有助于完全避免处理Activate

相关内容