Excel 确定范围是否在闭合范围内
我想确定rngA是否在rngB这样的封闭范围内 函数并集和交集不会起作用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
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