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

Forumthread: Marko für alle Zeilen per Schleife ausführen

Marko für alle Zeilen per Schleife ausführen
18.07.2015 12:46:45
Ingo
Hallo
Ich habe hier eine Excel-Tabelle.
Und ich habe ein Makro, nennen wir es "Makro2".
Ich möchte nun per VBA das "Makro2" für alle Zeilen meiner Tabelle nacheinander ausführen lassen, in denen in Spalte B ein Wert ist.
Meine Tabelle ist so aufgebaut, dass es quasi keine Leerzeilen mittendrin gibt.
Also es gibt naürlich eine Kopfzeile mit den Spalten-Namen.
Dann kommen lauter Zeilen, in denen Spalte B mit einem Wert gefüllt ist.
Und irgendwann kommt eben die erste Zeile, in der Spalte B leer ist.
Ich dachte, dass es am besten mit einer Schleife machbar ist.
Sub Trallalla()
For iCounter = 2 To XXX
Call Makro2
Next iCounter
End Sub

Wobei "XXX" nun die Zeilennummer der letzten Zeile sein soll, die in Spalte B einen Wert hat.
Ist das soweit erstmal von mir richtig überlegt?
Und wenn ja, wie bekomme ich das denn mit dieser letzten Zeile "XXX" hin?
Könnt Ihr mir da helfen?
Gruß
Ingo

Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Marko für alle Zeilen per Schleife ausführen
18.07.2015 12:59:50
hary
Moin
Ob wirklich das Makro bei jeder Zelle ausgefuert werden muss kann man ohne mkro zukennen nicht sagen.
letzte beschriebene:
2 to Cells(Rows.Count, 2).End(xlUp).Row

evtl. musst du den Blattnamen mitgeben. cells geht vom activen Blatt aus.
gruss hary

Anzeige
AW: Marko für alle Zeilen per Schleife ausführen
18.07.2015 18:00:45
Ingo
OK ich habe das nun so probiert.
Aber das geht leider nicht.
Sub Test()
For iCounter = 2 To Cells(Rows.Count, 2).End(xlUp).Row
Cells(iCounter).Call Promotion
Next iCounter
End Sub
Mir ist an dem Beispiel im Ausgangsposting ja eh noch ein blöder Fehler passiert.
Ich habe ja garnicht dafür gesorgt, dass das Makro2 jeweils in der entsprechenden Zeile ausgeführ wird.
Oder?
Leider komme ich hier nicht weiter, weil ich es nicht verstehe.

Anzeige
AW: Marko für alle Zeilen per Schleife ausführen
18.07.2015 18:21:55
Ingo
Ich glaube, ich bin nun doch ein Stück weiter gekommen.
Sub Test()
For iCounter = 2 To Cells(Rows.Count, 2).End(xlUp).Row
Cells(iCounter, 2).Select
Call Promotion
Next iCounter
End Sub
Das funktioniert erstmal gut.
Nur ist es ja sicher nicht sinnvoll, jede einzelne Zeile erstmal zu selektieren, oder?
Ich wollte das jetzt so zusammenfassen/verkürzen:
Sub Test()
For iCounter = 2 To Cells(Rows.Count, 2).End(xlUp).Row
Cells(iCounter, 2).Call Promotion
Next iCounter
End Sub
Aber da gibt es dann eine Fehlermeldung.
Wo ist denn da der Fehler?

Anzeige
AW: Marko für alle Zeilen per Schleife ausführen
19.07.2015 09:14:32
hary
Moin
Schaetze so kommen wir nicht weiter. ;-)
Select brauchst du evtl.(99%) nicht.
Beschreib mal was du erreichen willst oder Bsp.-Mappe hochladen oder setz das Promotionmakro mit rein.
Hier mal ein Bsp. wie du die Zeile(icounter) an das Makro uebergibst.
Sub Anschau()
Dim icounter As Long
For icounter = 2 To Cells(Rows.Count, 2).End(xlUp).Row
Promotion (icounter) '-- icounter an Promotion uebergeben
Next icounter
End Sub
Sub Promotion(Zeile As Long)
MsgBox Zeile '--Zeile ergibt die uebergebene icounter Nummer
End Sub

Die Schleife kann man auch direkt ins Promotionmakro setzen
gruss hary

Anzeige
AW: Marko für alle Zeilen per Schleife ausführen
19.07.2015 09:32:20
Ingo
Hallo und Moin :-)
Ich versuche, mein Anliegen nochmal besser darzustellen.
Ich habe eine Excel-Tabelle.
Und diese hat ein Makro "Promotion".
Das Makro ist im Laufe der Jahre gewachsen und sehr lang.
Das Makro erzeugt aus den Daten der jeweiligen Tabellen-Zeile bestimmte Text-Dateien usw.
Mein Vorgehen ist dann immer so:
Ich wähle eine Zeile meiner Tabelle aus und starkte das Marko.
Dann werden mir die gewüsnchten Text-Dateien usw. "erzeugt".
Sowwit also erstmal alles prima.
Manchmal habe ich das Anliegen das obige Vorgehen für alle Zeilen meiner Tabelle durchzuführen.
Und da es ca. 900 Zeilen mit Daten gibt, ist das natürlich ein langes Herumgeklicke :)
Und darum hatte ich nun die folgende Idee:
Ein zweites Makro, was mir die Arbeit abnimmt.
Das zweite Makro soll also meine Tabelle Zeile für Zeile durchgehen und für jede Zeile einmal das "Promotion" Makro ausführen.
Damit ich das eben nicht 900 mal per Hand machen muss.
Der folgende Code macht ja nun genau das.
Sub Test()
For iCounter = 2 To Cells(Rows.Count, 2).End(xlUp).Row
Cells(iCounter, 2).Select
Call Promotion
Next iCounter
End Sub
Wenn ich das Makro "Test" starte, kann ich quasi dabei zusehen, wie jede einzelne Zeile aktiviert wird und jeweils das "Promotion" Makro ausgeführt wird.
Und da dachte ich, dass liegt daran, dass ich da das "Select" im Code habe.
Und nun dachte, ich dass man das evtl. noch verkürzen kann.
So dass die Abarbeitung der 900 Tabellen-Zeilen durch das "Promotion" Makro
* schneller geht
* nicht auch visuell in der Tabelle sichtbar ist (Curser flitzt von oben bis unten durch)
Hoffentlich habe ich das nun so beschrieben, dass es eher verständlich ist, was ich eigentlich möchte :) Und über Eure Hilfe würde ich mich natürlich auch weiter sehr freuen.
Gruß
Ingo

Anzeige
AW: Marko für alle Zeilen per Schleife ausführen
19.07.2015 10:12:17
hary
Moin
Sub n()
Dim iCounter As Long
Application.ScreenUpdating = False 'schaltet Bildschirmaktuellisierung aus
For iCounter = 2 To Cells(Rows.Count, 2).End(xlUp).Row
Call Promotion(iCounter)
Next
Application.ScreenUpdating = True 'schaltet Bildschirmaktuellisierung ein
End Sub
Sub Promotion(Zeile As Long)
'--Zeile ergibt die uebergebene icounter Nummer
With Cells(Zeile, 1)
'--hier was mit Zelle in SpalteA gemacht werden soll
End With
End Sub

Select brauchst du nicht, es sein den dein Promo-Makro braucht eine markierte Zelle(und das weisst nur du)
gruss hary

Anzeige
AW: Marko für alle Zeilen per Schleife ausführen
19.07.2015 10:12:24
Gerd
Hallo Ingo,
zeige bitte die "Promotion" - Prozedur.
Gruß Gerd

AW: Marko für alle Zeilen per Schleife ausführen
19.07.2015 14:31:46
Ingo
Hallo nochmal
Bitte entschuldige jetzt die Frage.
Aber warum werde ich denn immer nach dem Promotion Makro gefragt?
Das möchte ich doch überhaupt nicht verändern oder anpassen.
Also ich meine, dass Promotion Makro soll doch einfach genau so bleiben, wie es ist.
Genau darum hatte ich doch die Ide mit dem zweiten Schleifen-Makro, welches für jede Zeile der Tabelle genau einmal das Promotion Makro auslöst.
Und mit diesem "Call Promotion" geht das doch auch.
Oder bin ich da jetzt irgendwie zu blöd und verstehe Euch andauernd falsch?

Anzeige
AW: Marko für alle Zeilen per Schleife ausführen
20.07.2015 06:45:50
hary
Moin Ingo
Schaetze dein PromotionMakro braucht eine ausgewaehlte Zelle. Also kommst du um select nicht rum.
Man koennte evtl. eine BooleanVariable nutzen, diese beim start des Makros an das PromotionMakro uebergeben und erst pruefen ob True oder False. Dann je nach Wert alles oder eine Zelle nehmen.
gruss hary

Anzeige
AW: Marko für alle Zeilen per Schleife ausführen
20.07.2015 15:28:58
Ingo
Ah OK, nun verstehe ich.
Ich habe das nun dann doch mit select gemacht.
Und die Bildschirmdarstellung habe ich ausgeschaltet.
So geht es nun sehr gut und erspart mir eine Menge Klick-Arbeit.
Vielen lieben Dank Euch allen nochmal für die nette Hilfe und die Geduld mit mir.
;

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

Makro für alle Zeilen per Schleife ausführen in Excel VBA


Schritt-für-Schritt-Anleitung

Um ein Makro in Excel VBA für alle Zeilen einer Tabelle auszuführen, kannst du die folgende Vorgehensweise nutzen. Das Ziel ist es, eine VBA Schleife über alle Zeilen zu erstellen, um ein bestehendes Makro, zum Beispiel "Promotion", für jede Zeile der Tabelle aufzurufen.

  1. Öffne den VBA-Editor:

    • Drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Erstelle ein neues Modul:

    • Klicke im Projektfenster mit der rechten Maustaste auf "VBAProject (deine_datei.xlsx)" und wähle Einfügen > Modul.
  3. Füge den folgenden Code ein:

    Sub Test()
       Dim iCounter As Long
       Application.ScreenUpdating = False ' Bildschirmaktualisierung ausschalten
       For iCounter = 2 To Cells(Rows.Count, 2).End(xlUp).Row
           Call Promotion(iCounter) ' Aufruf des Promotion-Makros mit der Zeilennummer
       Next iCounter
       Application.ScreenUpdating = True ' Bildschirmaktualisierung einschalten
    End Sub
    
    Sub Promotion(Zeile As Long)
       ' Hier wird etwas mit der Zeile gemacht
       MsgBox "Bearbeite Zeile: " & Zeile
    End Sub
  4. Starte das Makro:

    • Gehe zurück zu Excel und drücke ALT + F8, wähle Test und klicke auf Ausführen.

Häufige Fehler und Lösungen

  • Fehler: „Typen nicht übereinstimmend“
    Dies kann passieren, wenn das übergebene Argument nicht mit dem erwarteten Typ kompatibel ist. Stelle sicher, dass du die richtige Variable übergibst.

  • Fehler: „Method 'Range' of object '_Global' failed“
    Dies tritt auf, wenn du versuchst, auf eine Zelle zuzugreifen, die nicht existiert. Überprüfe, ob die Schleife bis zur letzten Zeile korrekt definiert ist.

  • Lösung: Verwende .End(xlUp)
    Um die letzte Zeile mit einem Wert in Spalte B zu finden, verwende die folgende Zeile:

    For iCounter = 2 To Cells(Rows.Count, 2).End(xlUp).Row

Alternative Methoden

Eine andere Möglichkeit, um durch die Zeilen zu iterieren, ist die Verwendung eines VBA-Arrays oder der For Each-Schleife:

Sub LoopThroughRows()
    Dim cell As Range
    For Each cell In Range("B2:B" & Cells(Rows.Count, 2).End(xlUp).Row)
        If Not IsEmpty(cell.Value) Then
            Call Promotion(cell.Row)
        End If
    Next cell
End Sub

Diese Methode ist besonders nützlich, wenn du nur bestimmte Zellen bearbeiten möchtest.


Praktische Beispiele

Nehmen wir an, du hast eine Excel-Tabelle mit Verkaufsdaten in Spalte B und möchtest das Promotion-Makro für jede Zeile mit einem Wert in dieser Spalte ausführen.

Hier ist ein Beispiel, wie das funktioniert:

  1. Daten in Spalte B: 100, 200, (leer), 300
  2. Ergebnis: Das Promotion-Makro wird nur für die Zeilen mit 100, 200 und 300 aufgerufen.

Tipps für Profis

  • Vermeide die Verwendung von Select: Die Verwendung von Select kann den Code verlangsamen und ist nicht notwendig. Arbeite stattdessen direkt mit den Zellen.

  • Nutze Application.ScreenUpdating = False: Dies beschleunigt die Ausführung des Makros, indem die Bildschirmaktualisierung während der Schleife deaktiviert wird.

  • Dokumentiere deinen Code: Verwende Kommentare, um deinen Code nachvollziehbar zu machen, besonders wenn du mit mehreren Zeilen und Makros arbeitest.


FAQ: Häufige Fragen

1. Wie kann ich das Makro nur für bestimmte Zeilen ausführen?
Du kannst Bedingungen in die Schleife einfügen, um nur bestimmte Zeilen zu bearbeiten, z.B. nur, wenn ein Wert in Spalte C vorhanden ist.

2. Was ist der Unterschied zwischen Call und dem einfachen Aufruf eines Makros?
Call ist optional. Du kannst das Makro auch ohne Call aufrufen, indem du einfach den Namen des Makros schreibst. Es ist jedoch eine gute Praxis, Call zu verwenden, wenn du Argumente übergibst.

3. Wie kann ich die Leistung meines Makros verbessern?
Neben Application.ScreenUpdating = False kannst du auch Application.Calculation = xlCalculationManual verwenden, um die Berechnungen während der Ausführung des Makros auszuschalten. Vergiss nicht, nach dem Makro die Berechnung wieder auf xlCalculationAutomatic zu setzen.

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