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

Forumthread: Makro über alle Tabellenblätter laufen lassen

Makro über alle Tabellenblätter laufen lassen
25.07.2008 14:49:00
Philipo
Hallo zusmmen,
ein Super Forum und Super Arbeit von Herber!
Das musste mal als erstes gesagt werden.
Ich habe das letze mal VBA-Makros vor ca. 6 Jahren geschrieben und brauche das jetzt wieder, da ich einige Daten von einer DB nach Excel exportiert habe und diese neun auswerten muss/soll.
Den Import und die Formatierungen habe ich über VBA realisiert um wieder in die ganze Geschichte rein zu kommen. Ich wollte mir das Leben nochmal dank eines VBA Makros erleichtern, jedoch bin ich kurz vor dem Ziel zum stocken gekommen.
Das Makro das ich jetzt geschrieben habe bildet im aktiven Tabellenblatt die relavanten Summen und Durchschnittswerte, jetzt soll dieses Makro aber auf ALLEN Tabellenblättern durchlaufen, wie bekomme ich das hin?
Gibt es keine Funktion die besagt, führe anschließenden Code für bzw. in allen Tabellenblättern aus und vor dem END SUB ein Stop oder so?!?!
Vielen Dank und viele Grüße

Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro über alle Tabellenblätter laufen lassen
25.07.2008 15:01:00
Worti
Hallo Philipo,
so

Sub Schleife()
Dim ws as Worksheet
For each ws in Thisworkbook.Worksheets
'Deinen Code, hierbei Zelladressen komplett referenzieren zB. mit ws.Range("K7")
Next ws
End Sub


Gruß Worti

AW: Makro über alle Tabellenblätter laufen lassen
25.07.2008 15:16:19
Philipo
Hallo Worti,
das habe ich mir auch schong edacht aber er wiederholt sich dann so oft wie es tabellenblätter gibt und macht die Ausgaben in dem ersten Tabellenblatt in dem ich das Makro starte.
Das problem ist wohl, dass die Angaben nicht wie Du erwähnt hast komplett referenzierbar ist.
Denn die Zeilenmenge ist unterschiedlich von Tabellenblatt zu tabellenblatt und ich suche in meinem makro nach der letzten befüllten zeile und mache dann eine zeile frei und mache sozusagen eine neue titelzeile und bilde AVG, SUM etc.
wenn ich einzeln in die Tabellenblätter gehe und mein Makro über die Tastenkombi ausführe klappt alles wunderbar. Ich will jetzt eben nichgt in jedes Tabellenblatt einzlen gehen.
Vielleicht hilft dir mein code weiter ist bestimmt murks und lässt sich alles auch anderst realisieren aber ich habe es so hinbekommen und es läuft und gibt aus was ich mächte jetzt muss nur nocht die "automation" her :)

lastrow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
ActiveSheet.Cells(lastrow + 2, 2).Select
ActiveCell.FormulaR1C1 = "Totaldistance in Km"
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = "Totalconsumption in L"
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = "Standconsumption in L"
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = "Averagespeed in Km/h"
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = "Averageweight in T"
ActiveCell.Offset(0, -4).Select
With ActiveCell
Range(.Offset(0, 0), .Offset(0, 4)).Select
End With
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Font.Bold = True
Columns("E:E").EntireColumn.AutoFit
Columns("B:B").EntireColumn.AutoFit
Dim iRow As Integer, iRowL As Integer, iColL As Integer, iCounter As Integer, Zeilen As Integer
iColL = Cells(1, 256).End(xlToLeft).Column
iRowL = Cells(Rows.Count, 1).End(xlUp).Row
For iRow = 1 To iRowL
If Rows(iRow).Hidden = False Then
If WorksheetFunction.CountA(Rows(iRow)) > 0 Then
iCounter = iCounter + 1
End If
End If
Next iRow
Zeilen = iCounter - 1
Zeilen2 = iCounter - 3
Range("B65536").End(xlUp).Offset(1, 0).Formula = "=sum(B2:B" & Range("B65536").End(xlUp).Row & " _
)/1000"
Range("C65536").End(xlUp).Offset(1, 0).Formula = "=sum(C2:C" & Range("C65536").End(xlUp).Row & " _
)/1000"
Range("D65536").End(xlUp).Offset(1, 0).Formula = "=sum(D2:D" & Range("D65536").End(xlUp).Row & " _
)/1000"
Range("E65536").End(xlUp).Offset(1, 0).Formula = "=(sum(E2:E" & Range("E65536").End(xlUp).Row &  _
"))/" & Zeilen & "*3.6"
Range("F65536").End(xlUp).Offset(1, 0).Formula = "=sum(F2:F" & Range("F65536").End(xlUp).Row & " _
)/1000"
ActiveCell.Offset(1, -1).Select
ActiveCell.FormulaR1C1 = "SUM:"
Selection.Font.Bold = True
ActiveCell.Offset(1, 0).Select
ActiveCell.FormulaR1C1 = "AVG:"
Selection.Font.Bold = True
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = ActiveCell.Offset(-1, 0).Value / Zeilen
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = ActiveCell.Offset(-1, 0).Value / Zeilen
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = ActiveCell.Offset(-1, 0).Value / Zeilen
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = ActiveCell.Offset(-1, 0).Value
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = ActiveCell.Offset(-1, 0).Value / Zeilen
End Sub


Anzeige
AW: Makro über alle Tabellenblätter laufen lassen
25.07.2008 15:23:00
Worti
Hallo Philipo,
da hilft auf die schnelle das:

Sub Schleife()
Dim ws as Worksheet
For each ws in Thisworkbook.Worksheets
ws.Activate 'Dann ist das jeweilige Blatt das Active und alle Anweisungen werden ohne  _
weitere
'Referenzierung auf dem dann "richtigen" Blatt gemacht
Next ws
End Sub


Ist zwar nicht so toll mit dem activate, aber es müßte funzen
Gruß Worti

Anzeige
Klasse Antwort, schönes WE! :o) (kwT)
25.07.2008 15:30:46
Backowe

AW: Makro über alle Tabellenblätter laufen lassen
25.07.2008 15:34:04
Philipo
Hallo Worti,
wir stehen kurz vor dem Ziel :)
er führt es jetzt auf ALLEN TABELLENBLÄTTERN aus ABER!!!!!
Die Werte für AVG stimmen nicht mehr!!!!
Die Werte für die SUM sind korrekt und er macht auch die neuen Titel am Schluss wie gewünscht auf jedem Blatt jedoch stimmt die Berechnung von AVG nicht mehr
Ich bilde erst die Summen, dann mach gehe ich eine zeile tiefer und schreib AVG rein und gehe wieder meine Spalten durch und teile durch anzahl der Zeilen.........soweit zur Theorie :)

Range("B65536").End(xlUp).Offset(1, 0).Formula = "=sum(B2:B" & Range("B65536").End(xlUp).Row & " _
_
)/1000"
Range("C65536").End(xlUp).Offset(1, 0).Formula = "=sum(C2:C" & Range("C65536").End(xlUp).Row & " _
_
)/1000"
Range("D65536").End(xlUp).Offset(1, 0).Formula = "=sum(D2:D" & Range("D65536").End(xlUp).Row & " _
_
)/1000"
Range("E65536").End(xlUp).Offset(1, 0).Formula = "=(sum(E2:E" & Range("E65536").End(xlUp).Row &  _
_
"))/" & Zeilen & "*3.6"
Range("F65536").End(xlUp).Offset(1, 0).Formula = "=sum(F2:F" & Range("F65536").End(xlUp).Row & " _
_
)/1000"
ActiveCell.Offset(1, -1).Select
ActiveCell.FormulaR1C1 = "SUM:"
Selection.Font.Bold = True
ActiveCell.Offset(1, 0).Select
ActiveCell.FormulaR1C1 = "AVG:"
Selection.Font.Bold = True
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = ActiveCell.Offset(-1, 0).Value / Zeilen
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = ActiveCell.Offset(-1, 0).Value / Zeilen
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = ActiveCell.Offset(-1, 0).Value / Zeilen
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = ActiveCell.Offset(-1, 0).Value
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = ActiveCell.Offset(-1, 0).Value / Zeilen


Anzeige
AW: Makro über alle Tabellenblätter laufen lassen
25.07.2008 15:43:17
Worti
Hallo Philipo,
initialisierst du deine Variablen icounter etc.. auch schön vor jedem Umlauf?
Gruß Worti

AW: Makro über alle Tabellenblätter laufen lassen
25.07.2008 15:53:00
Philipo
Danke für den Tip!!!
am Schluss noch iCounter = 0 gesetzt und siehe da die Werte stimmen :)

iCounter = 0
Next ws
End Sub


Merci!
Viele Grüße
Phibo

Anzeige
AW: Makro über alle Tabellenblätter laufen lassen
25.07.2008 15:57:00
Worti
Tja, so ist das öfter: Kaum macht man's richtig ;-)
Schönes WE
Worti
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Makro über alle Tabellenblätter ausführen


Schritt-für-Schritt-Anleitung

Um ein Excel-Makro über alle Tabellenblätter durchlaufen zu lassen, kannst Du den folgenden VBA-Code verwenden. Dieser ermöglicht es Dir, die gewünschten Berechnungen oder Formatierungen in jedem einzelnen Blatt auszuführen:

Sub Schleife()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        ws.Activate ' Aktiviere das jeweilige Blatt
        ' Füge hier Deinen Code ein, z.B.:
        ' ws.Range("K7").Value = "Beispiel"
    Next ws
End Sub

Achte darauf, dass Du den Code an die spezifischen Anforderungen Deiner Tabellenblätter anpasst. Zum Beispiel, wenn Du bestimmte Berechnungen durchführen möchtest, sollte dies innerhalb der Schleife geschehen.


Häufige Fehler und Lösungen

  1. Problem: Das Makro wiederholt sich für jedes Tabellenblatt

    • Lösung: Stelle sicher, dass Du ws.Activate verwendest, um das aktive Blatt korrekt zu referenzieren, bevor Du darauf Operationen ausführst.
  2. Problem: Berechnungen stimmen nicht

    • Lösung: Achte darauf, Variablen wie iCounter vor jedem Durchlauf der Schleife zu initialisieren. Setze sie am Anfang der Schleife auf 0.
  3. Problem: Werte werden nur im ersten Tabellenblatt ausgegeben

    • Lösung: Verwende vollständige Referenzen für Zellen, z.B. ws.Range("A1").Value anstelle von ActiveSheet.Range("A1").Value.

Alternative Methoden

Falls Du keine Schleife verwenden möchtest, kannst Du auch eine direkte Methode nutzen, um bestimmte Aktionen auf jedem Blatt durchzuführen. Hier ist ein Beispiel:

Sub Automatisierung()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        ws.Cells(1, 1).Value = "Neuer Wert"
    Next ws
End Sub

Diese Methode ist einfach und eignet sich besonders gut für wiederholte Aufgaben, die auf allen Tabellenblättern dieselben Ergebnisse liefern.


Praktische Beispiele

Hier sind einige praktische Beispiele für ein Excel-Makro, das über alle Tabellenblätter läuft:

  1. Summenbildung in jeder Tabelle:
Sub SummenBildung()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        ws.Range("B1").Value = Application.WorksheetFunction.Sum(ws.Range("A1:A10"))
    Next ws
End Sub
  1. Durchschnittswerte berechnen:
Sub DurchschnittBerechnung()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        Dim avgValue As Double
        avgValue = Application.WorksheetFunction.Average(ws.Range("A1:A10"))
        ws.Range("B1").Value = avgValue
    Next ws
End Sub

Tipps für Profis

  • Vermeide Activate: Es ist besser, die Referenz zu den Blättern direkt zu verwenden, anstatt sie zu aktivieren. Das verbessert die Performance.

    Beispiel:

    ws.Range("A1").Value = "Test"
  • Verwende With-Anweisungen: Diese verbessern die Lesbarkeit und Performance Deines Codes.

    Beispiel:

    With ws
      .Range("A1").Value = "Test"
      .Cells(1, 2).Value = "Test 2"
    End With
  • Debugging: Nutze Debug.Print um Werte während der Ausführung zu überprüfen, das hilft beim Auffinden von Fehlern.


FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass mein Makro nur auf bestimmten Tabellenblättern läuft? Du kannst eine Bedingung hinzufügen, um nur bestimmte Blätter zu überprüfen, z.B.:

If ws.Name = "Blatt1" Then
    ' Code hier
End If

2. Was mache ich, wenn ich eine Fehlermeldung erhalte? Überprüfe Deinen Code auf Syntaxfehler und stelle sicher, dass alle Variablen korrekt initialisiert und verwendet werden.

3. Wie kann ich meine Makros schneller machen? Vermeide die Verwendung von Select und Activate, da dies die Ausführungsgeschwindigkeit verlangsamen kann. Arbeite direkt mit den Objekten.

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