如何检查SheetChange事件是否所做的更改是在命名范围内

时间:2018-06-06 10:54:30

标签: excel vba excel-vba

所以我在Excel中的SheetChange事件中编码。我想知道更改是否在命名范围内进行。基本上是这样的:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Some code
If ('Target address is a part of one of the named ranges')
    'Some code here

请注意,我在不同的表单中有多个命名范围,我想查看。一种方法可以是在某处进行更改时遍历每个命名范围。但我不认为这是一种很好的编码方式。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:4)

尝试

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    'Some code
    If Not Intersect(Target, Range("MyNamedRange")) Is Nothing Then
        'Some code here
    End If

修改

以上工作用于测试目标是否是一个特定命名范围的一部分。如果您的要求是测试目标是否是任何命名范围的一部分,那么您确实必须遍历现有名称 - 这样的事情会起作用:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    'Some code
    Dim sName As String
    sName = InAnyNamedRange(Target)
    If Not sName = "" Then
        'Some code here
        Debug.Print Target.Address & " changed, and is in named range " & sName
    End If
End Sub

Function InAnyNamedRange(ByRef rng As Range)
    Dim nm As Name
    For Each nm In ThisWorkbook.Names
        If Not Intersect(rng, Range(nm)) Is Nothing Then
            InAnyNamedRange = nm.Name
            Exit Function
        End If
    Next nm
End Function