Microsoft Excel

Herbers Excel/VBA-Archiv

Grenze von Schleife

Betrifft: Grenze von Schleife von: Toni
Geschrieben am: 03.09.2014 17:07:21

Hi, ich habe mal wieder ein Problem mit vba und würd mich freunen wenn mir einer helfen kann: zur Veranschaulichung hier schonmal ein Beispielbild:



Zughöriger Quellcode:
For i=1 To a ' a ist eine variable Grenze die in einer anderen Schleife bestimmt wird(ca. 4000)
For j=1 To a
For l=1 To x ' gilt das gleiche wie bei a, nur auf eine andere Spalte bezogen(ca. 200)
If Cells(2+i,3).Value=l And Cells(2+j,4).Value="1" Then
Cells(2+j,5). Copy Destination:= Cells(2+z,6)
z=z+1
End If
Next l
Next j
Next i

was mein Ziel ist: Wenn in Spalte C(laufvariable i) eine 1 steht und in Spalte D eine 1(Laufvariable j) steht, soll die Zelle daneben(Spalte D) kopiert werden und in Spalte F ausgegeben werden, geordnet nach Spalte B(also von 1 bis 500 oder so, laufvariable l). Enstsprechend sollen E3 und E9 kopiert und nach F3 und F4 kopiert werden. Fehlt solch ein passender Eintrag, wie bei C20/D20 so soll in F5 eine Zelle frei bleiben(das schafft z als zusätzliche Laufvariable leider nicht).
Für Zelle C ist die Anzahl gleicher Einträge(1,2 usw.) nicht immer die selbe Anzahl von Zellen, sodass ich bisher keine Möglichkeit gefunden habe außer alle Spalten durchsuchen zu lassen. Das wäre aus meiner Sicht auch eine Möglichkeit, durch eine variable obere und untere Grenze von j das einzugrenzen. Eine andere Möglichkeit wäre vllt noch, sobald er ein Erg. gefunden hat die Schleife abzubrechen.

Mit dem oben beschriebenen Quelltext sucht er mir zwar alle Werte richtig raus, lässt aber da wo kein Wert ist auch keine Zelle frei...

ich hoffe ich hab mich mehr oder weniger Verständlich ausgedrückt und irgendjemand kann mir helfen.

Viele Grüße, Toni

  

Betrifft: AW: Grenze von Schleife von: fcs
Geschrieben am: 04.09.2014 11:34:13

Hallo Toni,

die Spalte C ist ja aufsteigend sortiert, deshalb kann man den Startwert der Schleife dynamisch anpassen.
Durch eine Anpassung der Prüfungen kann man den Startwert der inneren Schleife am aktuelen Wert der äußeren Schleife starten. Die inere Schleife kann man verlassen, wenn eine Übereinstimmung gefunden wurde oder wenn sich der Wert in Spalte C nicht mehr übereinstimmt.

So erreicht man, dass bei den Schleifen durchläufen immer nur wenige Zeilen verglichen werden müssen.
Die Reihenfolge der Schleifen muss geändert werden, damit die Reihenfolge im kopierten Bereich stimmt.

Gruß
Franz

Sub bbTest()
  Dim i, j, L, a, x, z, iStart
  Dim bolGefunden As Boolean
  a = 32                                            'Testzeile
  x = Application.WorksheetFunction.Max(Columns(3)) 'Testzeile
  
  'Makrobremsen lösen
  With Application
    StatusCalc = .Calculation
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
    .EnableEvents = False
  End With
  
  iStart = 1
  For L = 1 To x ' gilt das gleiche wie bei a, nur auf eine andere Spalte bezogen(ca. 200)
    bolGefunden = False
    For i = iStart To a ' a ist eine variable Grenze die in einer anderen Schleife bestimmt  _
wird(ca. 4000)
      If Cells(2 + i, 3).Value = L Then
        iStart = i
        For j = i To a
         If Cells(2 + j, 3).Value = L And Cells(2 + j, 4).Value = "1" Then
            Cells(2 + j, 5).Copy Destination:=Cells(2 + z, 6)
            z = z + 1
            bolGefunden = True
            Exit For
          ElseIf Cells(2 + i, 3).Value <> L Then
            Exit For
          End If
        Next j
        If j < a Then Exit For
      End If
    Next i
    If bolGefunden = False Then z = z + 1
  Next L
  'Makrobremsen zurücksetzen
  With Application
    .Calculation = StatusCalc
    .ScreenUpdating = True
    .EnableEvents = True
  End With
End Sub




 

Beiträge aus den Excel-Beispielen zum Thema "Grenze von Schleife"