Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: For-Each- Schleife bei Arrays

For-Each- Schleife bei Arrays
17.09.2014 13:02:21
Florian
Liebe VBA- Freunde,
ich habe ein Problem, dass wahrscheinlich auf meine begrenzten Fähigkeiten als VBA-User zurückzuführen ist. Bin schon lange am Suchen, finde aber irgendwie keine funktionierende Lösung.
Zum Sachverhalt:
Ich habe ein Eingabefeld, in das ich einen String eingebe, der von meinem Makro ausgelesen wird. Daraufhin wird prüft ein Array, wie häufig dieser String in meiner Tabelle vorkommt - soweit so gut. Jetzt stellt sich mir die Frage, wie ich dem Makro sagen soll, dass er in jeder Zeile, das erste rechts stehende "x" suchen soll und mir dessen Adresse ausgibt? Hatte hier die For-Each-Schleife ins Auge gefasst, aber irgendwie klappt das nicht so, wie ich mir das vorgestellt hab... Habe euch hier mal die Datei angehangen: https://www.herber.de/bbs/user/92679.xlsm
Kann jemand Abhilfe schaffen? Danke im Voraus!
Grüße,
Florian

Anzeige

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: For-Each- Schleife bei Arrays
17.09.2014 13:35:54
Jack_d
Hallo Florian
so kann der Code aussehen
Hier die Lösung als WS_Change (Makro muss in das Arbeitsblatt1)
Ausgabe der Adresse derzeit über msgbox
Grüße
Private Sub Worksheet_change(ByVal Target As Range)
Dim Suchwert As String
Dim rngZelle As Range
Suchwert = Intersect(Target, Range("C15"))
With Worksheets("Einzelteile")
Set rngZelle = .Columns(3).Find(Suchwert, lookat:=xlWhole)
If Not rngZelle Is Nothing Then
Set rngZelle2 = .Rows(rngZelle.Row).Find("x", lookat:=xlWhole)
If Not rngZelle2 Is Nothing Then
Adresse = rngZelle2.Address
End If
End If
Set rngZelle = Nothing
Set rngZelle2 = Nothing
End With
MsgBox Adresse
End Sub

Anzeige
Was heißt 'rechtsstehendes "x"', ...
17.09.2014 13:42:55
Luc:-?
…Florian,
in den Zellen von Blatt3 steht ab einer bestimmten Spalte nur x bzw X! So wie du formulierst klingt das nach längeren Texten, die auf x enden.
Ansonsten ist da nur ein rudimentäres Makro zu finden, ganz ohne For Each-Zyklus! Einen solchen müsstest du über alle Zeilen des Gesamtbereichs laufen lassen und hast dann in Form der LaufVariablen gleich einen Bereich, auf den du die vbMethode .Find ansetzen könntest, also ungefähr so:
For Each xRo In bereich.Rows
If Not xRo.Find(…) Is Nothing Then …
Next xRo
Ansonsten das übliche AnfängerDurcheinander wie fehlende bzw Mittendrin-Variablen-/Konstanten-Deklaration (im Pgm unveränderte Werte sollten als Const deklariert wdn!), Benutzung von reservierten VBA-Begriffen als VariablenNamen (nimm doch dt Begriffe, da passiert das kaum mal!) usw.
Es gibt hier im Forum und seinem Archiv doch genügend Bspp wie das ordentlich gemacht wird, warum dann so?!
Gruß, Luc :-?

Anzeige
AW: For-Each- Schleife bei Arrays
17.09.2014 17:16:55
Beverly
Hi Florian,
eine Möglichkeit:
Sub Finden()
Dim rngZelle As Range
Dim strStart As String
Dim arrFound()
Dim lngFound As Long
With Worksheets("Einzelteile")
Set rngZelle = .Columns(3).Find(Range("C15").Value, lookat:=xlPart)
If Not rngZelle Is Nothing Then
strStart = rngZelle.Address
ReDim arrFound(0)
Do
If Not IsError(Application.Match("x", .Rows(rngZelle.Row), 0)) Then
ReDim Preserve arrFound(0 To lngFound)
arrFound(lngFound) = Cells(rngZelle.Row, Application.Match("x", .Rows( _
rngZelle.Row), 0)).Address(False, False)
lngFound = lngFound + 1
End If
Set rngZelle = .Columns(3).FindNext(rngZelle)
Loop While Not rngZelle Is Nothing And rngZelle.Address  strStart
End If
End With
Range("A1").Resize(UBound(arrFound()) + 1, 1) = Application.Transpose(arrFound())
End Sub
Es wird nur etwas ins Array geschrieben, wenn tatsächlich in mindestens einer Zelle ein "x" steht.


Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

For-Each-Schleife bei Arrays in Excel VBA


Schritt-für-Schritt-Anleitung

  1. Vorbereitung: Stelle sicher, dass Du ein Excel-Dokument mit einem Arbeitsblatt hast, in dem Du die VBA-Programmierung nutzen möchtest. Öffne den VBA-Editor mit ALT + F11.

  2. Erstelle ein neues Modul: Klicke im VBA-Editor mit der rechten Maustaste auf dein Projekt und wähle „Einfügen“ > „Modul“.

  3. Code für die For-Each-Schleife: Kopiere den folgenden Code in das Modul:

    Sub Finden()
        Dim rngZelle As Range
        Dim strStart As String
        Dim arrFound() As String
        Dim lngFound As Long
        With Worksheets("Einzelteile")
            Set rngZelle = .Columns(3).Find(Range("C15").Value, lookat:=xlPart)
            If Not rngZelle Is Nothing Then
                strStart = rngZelle.Address
                ReDim arrFound(0)
                Do
                    If Not IsError(Application.Match("x", .Rows(rngZelle.Row), 0)) Then
                        ReDim Preserve arrFound(0 To lngFound)
                        arrFound(lngFound) = Cells(rngZelle.Row, Application.Match("x", .Rows(rngZelle.Row), 0)).Address(False, False)
                        lngFound = lngFound + 1
                    End If
                    Set rngZelle = .Columns(3).FindNext(rngZelle)
                Loop While Not rngZelle Is Nothing And rngZelle.Address <> strStart
            End If
        End With
        Range("A1").Resize(UBound(arrFound()) + 1, 1) = Application.Transpose(arrFound())
    End Sub
  4. Ausführen des Codes: Speichere Deine Arbeit und führe das Makro aus, um die Adressen der gefundenen „x“ in der ersten Spalte anzuzeigen.


Häufige Fehler und Lösungen

  • Fehler: „Objekt nicht gefunden“: Stelle sicher, dass Du die richtigen Zellreferenzen verwendest. Überprüfe, ob der Suchwert in der Zelle C15 steht.

  • Lösung für Match-Fehler: Wenn der Fehler „#N/A“ auftritt, bedeutet das, dass kein „x“ in der Zeile gefunden wurde. Vergewissere Dich, dass tatsächlich ein „x“ vorhanden ist.

  • Fehler bei der Schleife: Achte darauf, dass die Schleife korrekt terminiert wird. Ein falsches Next oder ein fehlendes End If kann dazu führen, dass der Code nicht wie erwartet funktioniert.


Alternative Methoden

Eine andere Möglichkeit, um die For-Each-Schleife in VBA zu verwenden, ist die Nutzung der For Each-Schleife direkt über die Zeilen:

For Each xRo In Worksheets("Einzelteile").Rows
    If Not xRo.Find("x") Is Nothing Then
        ' Verarbeitung hier
    End If
Next xRo

Diese Methode ist besonders nützlich, wenn Du durch alle Zeilen iterieren und nach dem Suchwert „x“ suchen möchtest.


Praktische Beispiele

Hier ist ein einfaches Beispiel, um zu demonstrieren, wie Du die For Each-Schleife in einem VBA-Skript verwenden kannst:

Sub ForeachBeispiel()
    Dim cell As Range
    Dim rng As Range
    Set rng = Worksheets("Einzelteile").Range("A1:A10")

    For Each cell In rng
        If cell.Value = "x" Then
            Debug.Print "Gefunden in: " & cell.Address
        End If
    Next cell
End Sub

Dieses Skript sucht in den Zellen A1 bis A10 nach dem Wert „x“ und gibt die Adresse der gefundenen Zellen im Debug-Fenster aus.


Tipps für Profis

  • Variablen-Deklaration: Deklariere Deine Variablen immer am Anfang, um potenzielle Fehler zu vermeiden. Nutze Option Explicit, um sicherzustellen, dass alle Variablen deklariert sind.

  • Verwendung von With: Reduziere die Anzahl der Codezeilen und verbessere die Lesbarkeit, indem Du den With-Block verwendest.

  • Fehlerbehandlung: Implementiere eine Fehlerbehandlung, um Deinen Code robuster zu gestalten. Nutze On Error Resume Next, um mögliche Laufzeitfehler zu ignorieren.


FAQ: Häufige Fragen

1. Wie kann ich die For-Each-Schleife für ein mehrdimensionales Array verwenden?
Du kannst die For-Each-Schleife nicht direkt für mehrdimensionale Arrays verwenden. Stattdessen musst Du eine geschachtelte Schleife verwenden.

2. Was ist der Vorteil der Verwendung von For Each gegenüber For?
Die For Each-Schleife ist oft einfacher und lesbarer, besonders wenn Du mit Sammlungen oder Arrays arbeitest. Sie macht den Code weniger fehleranfällig.

3. Wie finde ich heraus, ob ein Element im Array vorhanden ist?
Du kannst die Funktion Application.Match verwenden, um zu prüfen, ob ein Element im Array vorhanden ist.

Wenn Du diesen Leitfaden befolgst, wirst Du in der Lage sein, die For-Each-Schleife in Excel VBA effektiv zu nutzen und Deine Programmierfähigkeiten zu verbessern.

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