2017-11-17 1 views
0

Der folgende Code fügt jeden Wert über 10 in dem Blatt auf die „Over10“ Bereich gründet:Iteration vs. Bereich über Union erstellt

Sub IterateOver10() 

Dim Over10 As Range 

For Each cell In ActiveSheet.UsedRange.Cells 
    If cell > 10 Then 
     If Over10 Is Nothing then 
      Set Over10 = cell 
     Else 
      Set Over10= Union(cell,Over10) 
     End If 
    End If 
Next cell 

Ich möchte „Over10“ mit einem durch jedes Element iterieren Schleife und prüfen, ob es in einem anderen Bereich existiert. Das Problem ist, dass die folgende Iteration:

For each cell2 in Over10 
    ' check if exists in another range 
next cell2 

nicht für eine Reihe funktioniert auf diese Weise erklärt, weil es den Bereich von cell2 bis (cell2 + die Anzahl der Over10) stattdessen zu verwenden scheint. Irgendwelche Vorschläge für eine Problemumgehung. Soll ich stattdessen Arrays verwenden?

Danke, Bartek

+0

Arrays sind viel schneller als Schleifen über Zellen auf einem Arbeitsblatt. – Brian

+0

es wird jedes Element in Over10 iterieren. Das wird eine Reihe von Bereichen sein. – QHarr

Antwort

0

Es gibt durchaus ein paar Möglichkeiten, dies zu tun. Einer von ihnen ist mit verschachtelten Schleifen, wo man durch beide der Sammlungen iterieren (oder Bereichen oder Arrays, wie Sie mögen):

Sub IterateOver10() 

    Dim myCell   As Range 
    Dim Over10   As Range 
    Dim myCollection As New Collection 
    Dim myCollection2 As New Collection 

    Dim iterator  As Variant 
    Dim iterator2  As Variant 

    For Each myCell In ActiveSheet.UsedRange 
     If myCell > 10 Then 
      myCollection.Add (myCell) 
     End If 
    Next myCell 

    myCollection2.Add 15 
    myCollection2.Add 16 

    For Each iterator2 In myCollection2 
     For Each iterator In myCollection 
      If iterator = iterator2 Then 
       Debug.Print iterator 
      End If 
     Next iterator 
    Next iterator2 

End Sub 

Wenn also Ihre Eingabe am Anfang wie folgt aussieht:

enter image description here

in Ihrer Sammlung myCollection genannt würden Sie 12 haben, 13, 14 und 15. Dann in dem myCollection2 Sie werden feststellen, dass 15 in beiden Sammlungen sind, und es wird auf dem sofortigen Fenster gedruckt werden.

+0

Ich habe diesen Code ausprobiert, aber nichts wird jemals im Direktfenster gedruckt (der Code wird nie zum "Debug.Print" Teil). Siehe auch meinen Post unten. – barciewicz

+0

@barciewicz - Öffnen Sie einfach eine leere Excel-Datei und legen Sie meinen Code dort. – Vityata

0

Dank Vityata, ich habe dich Vorschlag versucht und kam mit dem folgenden Code auf Werte in einem neu erstellten Sammlung mit Arbeitsblatt Namen einer anderen Arbeitsmappe zu vergleichen und diese Arbeitsblätter verstecken, wo keine Übereinstimmung gefunden wird:

Sub Over10Vol2() 

Dim myCell As Range 
Dim Over10 As New Collection 

For Each myCell In ActiveSheet.UsedRange 
    If myCell > 10 Then 
     Over10.Add (myCell) 
    End If 
Next myCell 

Dim Final As Workbook 
Set Final = Workbooks("testbook") 

Dim ws As Worksheet 
Dim cell2 As Variant 

For Each ws In Final.Worksheets 
    For Each cell2 In Over10 ' jumps from here... 
     If ws.Name <> cell2 Then 
      ws.Visible = False 
     Else 
      ws.Visible = True 
     End If 
    Next cell2 
Next ws      ' to here 

End Sub 

Dies funktioniert jedoch nicht, da der Code die If-Klausel in der zweiten For Each-Schleife vollständig auslässt, sondern einfach von "für jede Zelle2 ..." direkt auf "next ws" springt. Danke für alle Vorschläge