Vba 如何在SheetChange事件中检查所做的更改是否在命名范围内
因此,我正在Excel中的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 请注意,我在不同的工作表中有多个命名范围,我想进行检查
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-不多。一个直接的解决方案是最好的,但是,我认为我可以修改我当前的代码,使之更好。