2016-04-11 14 views
2

Ich habe ein Problem beim Vergleich zweier Bereiche. Der Einfachheit halber werde ich zwei einfache Bereiche M6:M10 und M6:M8, ich möchte wissen, ob der zweite in die erste enthalten ist, und das erste, was ich ist aberWie finde ich heraus, ob ein Bereich in einem anderen Bereich enthalten ist? VBA

Sub example() 
    Dim range1, range2, inte As range 
     Set range1 = range("M6:M10") 
     Set range2 = range("M6:M8") 
     Set intersec = Intersect(range1, range2) 
     If intersec = range2 Then 
      [if statement] 
     End If 
    End Sub 

Aber diese Prozedur gibt mir den folgenden Fehler schreiben :

PRB: Error 13 (Type Mismatch) & Error 3061 w/ SQL Queries

vielleicht kann ich auf diese Weise die Methode nicht „schneiden“ ... jeden Hinweis, wie Bereichs der Aufnahme zu testen? Vielen Dank!

+0

'Dim Bereich1, Bereich2, inte As Bereich' decl res 'range1' und' range2' sind Varianten (nicht dass dies das Problem ist). Auch - der von Ihnen erwähnte Fehler scheint nichts mit dem angezeigten Code zu tun zu haben, ist aber wahrscheinlich in den eckigen Klammern versteckt. –

+0

auch die Schnittpunktmethode Gibt nichts zurück, wenn es keine Schnittmenge ist, könnte ein Problem sein. Sie sollten überprüfen, ob die Schnittmenge Nothing first –

+0

Können Sie bestätigen, welche Zeile den Fehler erzeugt? Verdächtig es wird sein 'Wenn intersec = range2 Then'. Wenn Sie versuchen, zu bestätigen, dass sich intersec und range2 vollständig überschneiden, versuchen Sie Folgendes: 'Wenn intersec.Address = range2.Address Then'. –

Antwort

3

Hier ist eine Möglichkeit:

Sub ProperSubSet() 
    Dim range1 As Range, range2 As Range, inte As Range 
    Dim r As Range 

    Set range1 = Range("M6:M10") 
    Set range2 = Range("M6:M8") 

    For Each r In range2 
     If Intersect(r, range1) Is Nothing Then 
      MsgBox "range2 is not a proper subset of range1" 
     Exit Sub 
     End If 
    Next r 
    MsgBox "range2 is a proper subset of range1" 
End Sub 
+0

danke !!!!!! –

1

So wie ich es bin mit ist wie folgt:

If Application.Intersect(rng1, rng2) Is Nothing Then 
    'herecomesthecode 
Else 
    'herecomesthecode 
End if 

Sie können die sonst entfernen oder schreiben nicht nichts, je nachdem, was Sie erreichen wollen.

2

Zuerst erklären Ihre range1 und range2 Variablen als Bereiche.

Wenn Sie die intersec-Variable mit der range2-Variablen vergleichen, verwenden Sie die address -Eigenschaft der range-Methode, um den Inhalt zu vergleichen.

Etwas wie:

Sub example() 
Dim range1 As Range, range2 As Range, intersec As Range 
    Set range1 = Range("M6:M10") 
    Set range2 = Range("M11:M12") 
    Set intersec = Intersect(range1, range2) 
    If Not intersec Is Nothing Then 
     If intersec.Address = range2.Address Then 
      '[CODE GOES HERE] 
     End If 
    End If 
End Sub 
+0

Korrekt .. Rushing und nicht aufgepasst ..Aktualisierte Antwort, um Fehlerbehandlung zu vermeiden. –

1

Hier ist etwas, das Sie mit experimentieren können:

Sub Test() 
    Dim R1 As Range, R2 As Range, R3 As Range 

    Set R1 = Application.InputBox("Select first range", , , , , , , 8) 
    Set R2 = Application.InputBox("Select second range", , , , , , , 8) 

    Set R3 = Intersect(R1, R2) 
    If Not R3 Is Nothing Then 
     If R3.Address = R1.Address Then 
      MsgBox "First Range is subset of second" 
     ElseIf R3.Address = R2.Address Then 
      MsgBox "Second Range is subset of first" 
     Else 
      MsgBox "Neither range contained in the other" 
     End If 
    Else 
     MsgBox "Ranges are disjoint" 
    End If 

End Sub 
0

eine weitere zusätzliche Variante:

Sub ProperSubSet2() 
    Dim range1 As Range, range2 As Range 
    Set range1 = [M6:M10] 
    Set range2 = [M6:M8] 
    Set rComp = Intersect(range2, range1) 

    If Not rComp Is Nothing Then 
     If rComp.Cells.Count = range2.Cells.Count Then 
      MsgBox "range2 is a proper subset of range1" 
     Else 
      MsgBox "range2 is not a proper subset of range1" 
     End If 
    Else 
     MsgBox "Both ranges aren't intersected at all!" 
    End If 

End Sub 
0

Sie einen Vergleich der intersect tun können, um die Bereiche, um herauszufinden, ob eine Reihe in einer anderen enthalten ist. Einige Code, dies zu zeigen ...

Sub TestExample() 
    Dim Range1 As Range: Set Range1 = Range("M6:M10") 
    Dim Range2 As Range: Set Range2 = Range("M6:M8") 
    MsgBox Example(Range1, Range2) 
End Sub 

Function Example(Range1 As Range, Range2 As Range) As Integer 
    Dim Overlay As Range: Set Overlay = Application.Intersect(Range1, Range2) 
    If Not Overlay Is Nothing Then 
     If Overlay.Address = Range1.Address Then Example = Example + 1 
     If Overlay.Address = Range2.Address Then Example = Example + 2 
    End If 
End Function 

Die Funktion 0 zurück, wenn kein Bereich vollständig in einem anderen enthalten ist, 1, wenn der erste Bereich innerhalb der zweiten enthalten ist, 2, wenn der zweite Bereich in dem ersten enthält und 3, wenn die Bereiche gleich sind

0

Für eine robustere Lösung, die auf Bereichen mit mehreren Bereichen funktioniert, Bereiche auf verschiedenen Arbeitsblättern voneinander, Bereiche mit sehr vielen Zellen (also .CountLarge, nicht .Count) dann dies funktioniert:

Function RangeContainsRange(BigRange As Range, SmallRange As Range) As Boolean 
    If BigRange.Parent Is SmallRange.Parent Then 
     RangeContainsRange = Application.Union(BigRange, SmallRange).Cells.CountLarge = BigRange.Cells.CountLarge 
    Else 
     RangeContainsRange = False 
    End If 
End Function 
Verwandte Themen