Vba 如何检查命名范围是否在当前范围内?

Vba 如何检查命名范围是否在当前范围内?,vba,excel,Vba,Excel,我知道如何命名一系列单元格 例如,如果A1到B2被命名为RangeA,我选择A1到C2,我是否可以判断RangeA是否在其中?以下是一些代码,可以帮助您进行操作: Sub test() Dim r1 As Range, r2 As Range, r3 As Range Set r1 = Range("A1:A5") Set r2 = Range("A3:A6") Set r3 = Application.Intersect(r1, r2) If Not r3 Is Nothing Then

我知道如何命名一系列单元格


例如,如果A1到B2被命名为RangeA,我选择A1到C2,我是否可以判断RangeA是否在其中?

以下是一些代码,可以帮助您进行操作:

Sub test()
Dim r1 As Range, r2 As Range, r3 As Range

Set r1 = Range("A1:A5")
Set r2 = Range("A3:A6")
Set r3 = Application.Intersect(r1, r2)

If Not r3 Is Nothing Then
  If r3.Cells.Count = r2.Cells.Count Then
    MsgBox "there is a complete intersection"
  Else
    MsgBox "there is some overlap"
  End If
Else
  MsgBox "there is no overlap"
End If

End Sub
应该是不言自明的。并向@TimWilliams致敬,他发表了一条关于这些内容的评论

根据您对要求的澄清进行更新

Sub getIntersectingNames(r As Range)
  For Each Nm In ActiveWorkbook.Names
    If Not Application.Intersect(r, Range(Nm)) Is Nothing Then
      MsgBox Nm.Name & " intersects"
    End If
  Next
End Sub

Sub test()
  ' pop up a message box for every range that intersects cell B2:
  getIntersectingNames [B2]
End Sub

Function listIntersectingNames(r As Range)
  Dim result() As String
  ReDim result(1 To ActiveWorkbook.Names.Count)
  Dim matchCount As Integer

  matchCount = 0

  For Each Nm In ActiveWorkbook.Names
    If Not Application.Intersect(r, Range(Nm)) Is Nothing Then
      matchCount = matchCount + 1
      result(matchCount) = Nm.Name
    End If
  Next
  ReDim Preserve result(1 To matchCount)
  listIntersectingNames = result

End Function

Sub test2()
' return an array of names of all ranges that intersect cell B3:
  ans = listIntersectingNames([B3])
  s = ""
  For Each r In ans
    s = s & r & vbCrLf
  Next
  MsgBox s
End Sub

我不太清楚您希望如何返回一个姓名列表,因此我在上面给出了几个选项。让我知道您是否可以将此应用于您的情况,或者您是否需要更多信息?

进一步扩展Tim和Floris所说的内容,请参见以下内容:

Dim myNamedRange As Range, mySelection As Range, myIntersect As Range

Set mySelection = Selection '~~> gets your selection
Set myNamedRange = Range("RangeA") '~~> can be declared or directly pass to Intersect
Set myIntersect = Intersect(mySelection, myNamedRange)

    '~~> Then use intersect
If Not myIntersect Is Nothing Then
    If myIntersect.Address = myNamedRange.Address Then
        MsgBox "Your named range is within your selection."
    Else
        MsgBox "Your named range is beyond your selection."
    End If
Else
    MsgBox "Your named range is beyond your selection."
End If

End Sub
这是基于您的实际问题,将命名范围a与选择进行比较。
希望这能有所帮助。

看看应用程序。Intersect@TimWilliams我冒昧地把你的评论扩展成一个答案…@TimWilliams这太棒了,如果我不知道RangeA的话,我更想知道。类似于查看选择中的所有命名范围。对不起,我不清楚。不管怎样,这对我都有帮助。谢谢。这真的很接近我想要做的。我真的很想知道你是否能得到一份当前选择中所有命名范围的列表。不知道其他范围。@elb0w-根据您更新的请求更新答案。