Excel 确定范围是否在闭合范围内

Excel 确定范围是否在闭合范围内,excel,vba,range,Excel,Vba,Range,我想确定rngA是否在rngB这样的封闭范围内 函数并集和交集不会起作用 End Sub这应该能够处理A和B的连续和非连续范围。将rngA和rngB传递到IsIn。如果rngA包含在rngB中,则返回true: Option Explicit Dim lngRowMin As Long Dim lngRowMax As Long Dim lngColMin As Long Dim lngColMax As Long Dim blnMap() As Boolean Public Functio

我想确定rngA是否在rngB这样的封闭范围内

函数并集和交集不会起作用


End Sub

这应该能够处理A和B的连续和非连续范围。将
rngA
rngB
传递到
IsIn
。如果
rngA
包含在
rngB
中,则返回true:

Option Explicit

Dim lngRowMin As Long
Dim lngRowMax As Long
Dim lngColMin As Long
Dim lngColMax As Long
Dim blnMap() As Boolean

Public Function IsIn(rngInner As Range, rngOuter As Range) As Boolean
    If (rngInner.Rows.Count > rngOuter.Rows.Count) Or (rngInner.Columns.Count > rngOuter.Columns.Count) Or (rngInner.Row < rngOuter.Row) Then
        Exit Function
    End If

    Dim cel As Range
    Dim lngInnerCoord As Long
    Dim lngOuterCoord As Long
    Dim lngCoord As Long
    Dim lngOuterCoords() As Long
    Dim lngInnerCoords() As Long

    ReDim lngOuterCoords(1 To rngOuter.Count, 1 To 2)
    ReDim lngInnerCoords(1 To rngInner.Count, 1 To 2)
    lngRowMin = rngOuter.Row
    lngRowMax = lngRowMin
    lngColMin = rngOuter.Column
    lngColMax = lngColMin

    For Each cel In rngOuter
        lngOuterCoord = lngOuterCoord + 1
        lngOuterCoords(lngOuterCoord, 1) = cel.Row
        lngOuterCoords(lngOuterCoord, 2) = cel.Column

        If lngOuterCoords(lngOuterCoord, 1) > lngRowMax Then
            lngRowMax = lngOuterCoords(lngOuterCoord, 1)
        ElseIf lngOuterCoords(lngOuterCoord, 1) < lngRowMin Then
            lngRowMin = lngOuterCoords(lngOuterCoord, 1)
        End If

        If lngOuterCoords(lngOuterCoord, 2) > lngColMax Then
            lngColMax = cel.Column
        ElseIf lngOuterCoords(lngOuterCoord, 2) < lngColMin Then
            lngColMin = lngOuterCoords(lngOuterCoord, 2)
        End If
    Next cel

    For Each cel In rngInner
        lngInnerCoord = lngInnerCoord + 1
        lngInnerCoords(lngInnerCoord, 1) = cel.Row
        lngInnerCoords(lngInnerCoord, 2) = cel.Column

        If lngInnerCoords(lngInnerCoord, 1) > lngRowMax Then
            Exit Function
        ElseIf lngInnerCoords(lngInnerCoord, 1) < lngRowMin Then
            Exit Function
        End If

        If lngInnerCoords(lngInnerCoord, 2) > lngColMax Then
            Exit Function
        ElseIf lngInnerCoords(lngInnerCoord, 2) < lngColMin Then
            Exit Function
        End If
    Next cel

    ReDim blnMap(lngRowMin To lngRowMax, lngColMin To lngColMax)

    For lngCoord = 1 To lngOuterCoord
        blnMap(lngOuterCoords(lngCoord, 1), lngOuterCoords(lngCoord, 2)) = True
    Next lngCoord

    For lngCoord = 1 To lngInnerCoord
        If Not InnerTrap(lngInnerCoords(lngCoord, 1), lngInnerCoords(lngCoord, 2)) Then Exit Function
    Next lngCoord

    IsIn = True
End Function

Private Function InnerTrap(lngRow As Long, lngCol As Long) As Boolean
    On Error GoTo Escaped

    If Not blnMap(lngRow, lngCol) Then
        blnMap(lngRow, lngCol) = True
        If Not InnerTrap(lngRow + 1, lngCol) Then Exit Function
        If Not InnerTrap(lngRow - 1, lngCol) Then Exit Function
        If Not InnerTrap(lngRow, lngCol + 1) Then Exit Function
        If Not InnerTrap(lngRow, lngCol - 1) Then Exit Function
    End If

    InnerTrap = True
Escaped:

End Function
选项显式
长得一样暗
暗淡的lngRowMax尽可能长
变暗lngColMin为长
变暗lngColMax为长
将blnMap()设置为布尔值
公共函数IsIn(rngInner作为范围,rngOuter作为范围)作为布尔值
如果(rngInner.Rows.Count>rngOuter.Rows.Count)或(rngInner.Columns.Count>rngOuter.Columns.Count)或(rngInner.RowlngRowMax,则
lngRowMax=lngOuterCoord(lngOuterCoord,1)
如果lngOuterCoords(lngOuterCoords,1)lngColMax,则
lngColMax=细胞柱
ElseIf lngOuterCoords(lngOuterCoords,2)lngRowMax,则
退出功能
ElseIf lngInnerCoords(lngInnerCoord,1)lngColMax,则
退出功能
ElseIf Lnginercoords(Lnginercoord,2)
这将适用于连续范围:

Sub FindInnerRange()

    Dim rngA As Range, rngB As Range

    Set rngA = Range("H8")
    Set rngB = Range("E4:J4,J5:J8,E8:I8,E5:E7")

    MsgBox rngA.Address & " is" _
           & IIf(Not Intersect(rngA, Intersect(rngB.EntireRow, rngB.EntireColumn)) Is Nothing And Intersect(rngA, rngB) Is Nothing, "", " NOT") _
           & " in a closed range " & rngB.Address, vbCritical

End Sub

如果外部范围确实是封闭的,那么可以使用CurrentRegion

Sub InnerRange()

Dim rngA As Range
Dim rngB As Range
Dim rngC As Range
Dim rngD As Range

    Dim i As Range

    Set rngA = Range("H6")
    Set rngB = Range("E4:J4,J5:J8,E8:I8,E5:E7")

    Set rngC = rngB.CurrentRegion
    Set rngD = Intersect(rngC, rngA)
    Debug.Print rngD.Address
    End Sub

我投票结束这个问题,因为代码在一个图像中。我已经添加了代码…A和B都是连续的吗?
Sub InnerRange()

Dim rngA As Range
Dim rngB As Range
Dim rngC As Range
Dim rngD As Range

    Dim i As Range

    Set rngA = Range("H6")
    Set rngB = Range("E4:J4,J5:J8,E8:I8,E5:E7")

    Set rngC = rngB.CurrentRegion
    Set rngD = Intersect(rngC, rngA)
    Debug.Print rngD.Address
    End Sub