Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

2 For Each Schleifen mit Array

Forumthread: 2 For Each Schleifen mit Array

2 For Each Schleifen mit Array
27.03.2017 13:56:30
Matthias
Hey liebe Experten :)
ich hab folgenden Code geschrieben:
SpArray = Array(2,4,6,7,8)

For Each wks In wb.Worksheets
Prüf = False
If Abfrage Then
ZlArray = Array(1,5,7,8,9,14)
Elseif AbfrageSonst Then
ZlArray = Array(3,6,7,15)
End If
With wks
For Each Row In ZlArray
For Each Column In SpArray
If Not .Cells(Row, Column) = 0 Then
Prüf = True
Exit For
Exit For
End If
Next Column
Next Row
If Prüf = False Then
.Delete
End If
End With
Dabei muss der Fehler iwie in der Verschachtelung der beiden For each (Row und Column) Schleifen stecken denn wenn ich die erste mit einer For To Schleife probiere dann klappt es.... leider versteh ich nicht genau wo der Fehler steckt und VBA gibt auch keinen Fehler aus -_-
Mit For To geht leider nicht da es 2 verschiedene Varianten gibt und Lücken in den zu prüfenden Zeilen und Spalten sind
Hoffe ihr könnt mir helfen :)
Vielen Dank im Vorraus
Matthias
Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: 2 For Each Schleifen mit Array
27.03.2017 14:19:06
Mullit
Hallo,
die Lücken sind doch völlig egal, Du fragst einfach mit For To Next bis zum Ubound Deiner Variant-Arrays ab, Exit For darfst Du nicht zweimal in derselben Schleife setzen, in der äußeren prüfst Du nochmal auf Prüf = True und setzt es dort ein zweites Mal....
Gruß, Mullit
Anzeige
AW: 2 For Each Schleifen mit Array
27.03.2017 14:27:24
Mullit
Hallo nochmal,
ah ja und ich seh grad, setz erstmal Option Explicit über Deinen Code und hol die Variablen-Deklaration nach, Row und Column sind VBA-Schlüsselwörter >>> nix gut, die mußt Du umbenennen...
Gruß, Mullit
AW: 2 For Each Schleifen mit Array
27.03.2017 15:02:27
Matthias
Also erstmal Danke
die ganzen Deklarationen hab ich hier weggelassen da der Code denke ich auch so verständlich ist und dadurch das ganze in die länge gezogen wird und unübersichtlicher (ist halt auch nur ein Ausschnitt aus dem code) :) Explicit verwende ich - Danke für den Hinweis mit Row und Column, das wusste ich noch nicht & auch das mit Exit For hab ich erledigt
Ubound hab ich bisher noch nie genutzt und ich hab es mal versucht einzubauen aber es läuft noch nicht :( habe jetzt erstmal eingestellt das es die Tabellenblätter blau einfärbt und es werden falsche eingefärbt...
    For Each wks In wb.Worksheets
Prüf = False
With wks
If Left(.Cells(ZlPrüfPF, SpPrüf).Value, 3) = "TXT" Then
ZlArray = Array(8, 9, 10)
Else
ZlArray = Array(10, 11, 12)
End If
For Reihe = UBound(ZlArray, 1) To UBound(ZlArray)
For Each Spalten In SpArray
If Not .Cells(Reihe, Spalten) = 0 Then
Prüf = True
Exit For
End If
Next Spalten
If Prüf = True Then
Exit For
End If
Next Reihe
If Prüf = False Then
.Tab.ColorIndex = 5
End If
Wo liegt der Fehler oder hab ich dich falsch verstanden?
Danke
Anzeige
AW: 2 For Each Schleifen mit Array
27.03.2017 16:20:37
ChrisL
Hi Matthias

For Reihe = 0 To UBound(ZlArray)
For Spalten = 0 To UBound(SpArray)
If Not .Cells(ZlArray(Reihe), SpArray(Spalten)) = 0 Then
End If
Next Spalten
Next Reihe
cu
Chris
AW: 2 For Each Schleifen mit Array
28.03.2017 10:13:58
Matthias
Hey Chris
Danke, also es läuft zwar ohne Fehler aber es klappt nicht
Daher jetzt noch eine Frage, druchläuft die schleife jetzt wirklich nur die im Array angegebenen Elemente? oder werden die Elemente aufgefüllt also bspw. Array(1,2,5,6) wird dann nur 1,2,5,6 durchlaufen oder nimmt der dann auch die 3 & 4?
Also ich versteh es leider noch nicht so ganz :( ich hab quasi eine reihe die durchlaufen werden soll mit Lücken drinne und daher dachte ich geht das über nen Array aber evtl ist dieser Ansatz ja schon falsch? [die Lücken sind nicht regelmäßig]
Grüße
Matthias
Anzeige
AW: 2 For Each Schleifen mit Array
28.03.2017 10:43:34
Matthias
Hey
ich glaub ich hab eine Lösung gefunden :)

For i = 0 To 5
Reihe = ZlArray(i)
For j = 0 To 4
Spalten = SpArray(j)
If Not .Cells(Reihe, Spalten) = 0 Then
Prüf = True
Exit For
End If
Next j
If Prüf = True Then
Exit For
End If
Next i
Aber trotzdem die Frage gäbe es denn einen eleganteren Ansatz?
Grüße Matthias
Anzeige
AW: 2 For Each Schleifen mit Array
28.03.2017 17:50:16
ChrisL
Hi Matthias
Deine und meine Lösung sind grundsätzlich identisch. Du übergibst die Zeilennummer einfach vorher noch an eine Variable:
Reihe = ZlArray(i)
.Cells(Reihe, ...)
vs.
.Cells(ZlArray(i), ...)
In deinem Code würde ich einzig noch UBound (= Array-Grösse resp. -Dimensionierung) verwenden. Wenn neue Werte dazu kommen, musst du so nur noch das Array, nicht aber den Rest vom Code anpassen.
For i = 0 To UBound(ZlArray)
Was in meinem Beispiel vielleicht für Verwirrung gesorgt hat, ist dass ich aus Bequemlichkeit die Variablen "Reihe" und "Spalten" wiederverwendet habe. Die Bezeichnungen sind ungeschickt, weil der Wert von der Schleife stammt (0, 1, 2...) und damit nicht die Zeilen- und Spaltennummer repräsentiert hat. Normalersweise würde ich Schleifen auch mit einer Variable "i" durchlaufen.
cu
Chris
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Infobox / Tutorial

2 For Each Schleifen mit Array in Excel VBA


Schritt-für-Schritt-Anleitung

  1. Deklaration der Variablen: Stelle sicher, dass du Option Explicit am Anfang deines Codes verwendest, um alle Variablen zu deklarieren. Dies hilft, Fehler durch nicht deklarierte Variablen zu vermeiden.

  2. Initialisierung des Arrays: Erstelle dein Array, das die Zeilen oder Spalten enthält, die du durchlaufen möchtest. Zum Beispiel:

    Dim SpArray As Variant
    SpArray = Array(2, 4, 6, 7, 8)
  3. VBA For Each Schleife: Verwende die For Each-Schleife, um durch die Worksheets in deiner Arbeitsmappe zu iterieren:

    For Each wks In wb.Worksheets
  4. Innere Schleifen für Arrays: Nutze For Each oder For To für die Zeilen und Spalten, die du prüfen möchtest. Beachte, dass du bei For Each die Elemente des Arrays direkt durchläufst:

    For Each Row In ZlArray
       For Each Column In SpArray
           If Not .Cells(Row, Column) = 0 Then
               Prüf = True
               Exit For
           End If
       Next Column
    Next Row
  5. Prüfung und Löschung: Überprüfe, ob die Bedingung erfüllt ist und lösche das Arbeitsblatt, wenn dies nicht der Fall ist:

    If Prüf = False Then
       .Delete
    End If

Häufige Fehler und Lösungen

  • Doppelte Verwendung von Exit For: Stelle sicher, dass du Exit For nicht mehrmals in der gleichen Schleife verwendest, da dies zu unerwartetem Verhalten führen kann.
  • Verwendung von reservierten Wörtern: Variablen wie Row und Column sind in VBA reservierte Wörter. Benenne sie um, um Konflikte zu vermeiden.
  • Fehler bei der Array-Größe: Verwende UBound, um die Größe deines Arrays dynamisch zu bestimmen, anstatt eine feste Zahl zu verwenden. Dies ist besonders nützlich, wenn du neue Werte hinzufügst.

Alternative Methoden

  • For To Schleife: Wenn du Lücken in deinem Array hast, kann es sinnvoll sein, eine For To-Schleife mit UBound zu verwenden, um über die Indizes des Arrays zu iterieren:

    For i = 0 To UBound(ZlArray)
       Reihe = ZlArray(i)
       ' Weitere Logik hier
    Next i
  • VBA Array Durchlaufen: Anstelle von For Each kannst du auch For i = 0 To UBound(Array) verwenden, um direkt auf die Indizes zuzugreifen.


Praktische Beispiele

Hier ist ein Beispiel, das zeigt, wie du mit For Each die Zellen eines Arbeitsblattes prüfen kannst:

Dim i As Long
Dim SpArray As Variant
Dim ZlArray As Variant
Dim Prüf As Boolean
SpArray = Array(2, 4, 6, 7, 8)
ZlArray = Array(1, 5, 7, 8, 9, 14)

For Each wks In wb.Worksheets
    Prüf = False
    With wks
        For Each Row In ZlArray
            For Each Column In SpArray
                If Not .Cells(Row, Column) = 0 Then
                    Prüf = True
                    Exit For
                End If
            Next Column
            If Prüf Then Exit For
        Next Row
        If Not Prüf Then
            .Delete
        End If
    End With
Next wks

Tipps für Profis

  • Verwende Option Explicit: Dies zwingt dich, alle Variablen zu deklarieren, was Fehler verhindert.
  • Nutze UBound für dynamische Arrays: Du musst deinen Code nicht anpassen, wenn sich die Größe deines Arrays ändert.
  • Code kommentieren: Halte deinen Code mit Kommentaren klar verständlich, besonders bei komplexeren Schleifen.
  • Debugging: Nutze den Debugger von VBA, um die Ausführung deines Codes Schritt für Schritt zu verfolgen.

FAQ: Häufige Fragen

1. Laufen die Schleifen nur die im Array angegebenen Elemente durch?
Ja, die Schleifen durchlaufen nur die Elemente, die im Array definiert sind. Wenn du Array(1, 2, 5, 6) hast, werden nur diese Werte durchlaufen.

2. Was ist der Unterschied zwischen For Each und For To?
For Each wird verwendet, um durch alle Elemente eines Arrays zu iterieren, während For To eine Schleife über feste Indizes ermöglicht. Bei Lücken im Array ist For To oft die bessere Wahl.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige