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

Vba 如何在SheetChange事件中检查所做的更改是否在命名范围内,vba,excel,Vba,Excel,因此,我正在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 请注意,我在不同的工作表中有多个命名范围,我想进行检查

因此,我正在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
请注意,我在不同的工作表中有多个命名范围,我想进行检查。一种方法是,每当某个地方发生更改时,循环遍历每个命名范围。但我认为这不是一个好的编码方式。任何帮助都将不胜感激

试试看

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
试一试

编辑:

上述方法用于测试目标是否属于一个特定的命名范围。如果您的需求是测试目标是否是任何命名范围的一部分,那么您确实需要遍历现有的名称—类似这样的操作:

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

代码不错!我只是好奇为什么你让函数返回一个变量而不是一个字符串。我现在也在遍历这些名称,但觉得这不是一个真正的最佳解决方案。因为在这里,每次更改都会检查每个命名范围,然后返回。不过还是谢谢你。你的代码比以前干净多了mine@Brian-没有真正的原因-我想我最初考虑返回一个布尔值,然后认为返回第一个匹配的命名范围名称可能有用。。。不确定这两种方式都会带来巨大的性能差异!Tanmay-你是否看到这种方法对性能的影响?@Olly-不多。一个直接的解决方案可能是最好的,但是,我认为我可以修改我当前的代码,使之更好。很好的代码!我只是好奇为什么你让函数返回一个变量而不是一个字符串。我现在也在遍历这些名称,但觉得这不是一个真正的最佳解决方案。因为在这里,每次更改都会检查每个命名范围,然后返回。不过还是谢谢你。你的代码比以前干净多了mine@Brian-没有真正的原因-我想我最初考虑返回一个布尔值,然后认为返回第一个匹配的命名范围名称可能有用。。。不确定这两种方式都会带来巨大的性能差异!Tanmay-你是否看到这种方法对性能的影响?@Olly-不多。一个直接的解决方案是最好的,但是,我认为我可以修改我当前的代码,使之更好。