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

Forumthread: Makro für die ganze Arbeitsmappe

Makro für die ganze Arbeitsmappe
15.06.2018 08:14:12
Sven
Guten Morgen :-)
Ich habe eine Frage, ich habe ein Dokument wo wenn ich in dem Arbeitsblatt Einstellungen in dem Zellenbereich C8:F10 beispielsweise etwas ändere sich in den Arbeitsblättern Tabelle5 - Tabelle16 etwas ändert.
Dieses Funktioniert jetzt auch, indem ich in jedes Arbeitsblatt meine Makros kopiert habe und _ diese im Arbeitsblatt Einstellungen mit folgendem Code aufrufe:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim iZaehler As Byte
Dim ABlatt As String
Dim ABlatt1 As String
Dim ABlatt2 As String
Dim i As Integer
For i = 1 To ActiveWorkbook.Worksheets.Count
ActiveWorkbook.Worksheets(i).Activate
ActiveSheet.Unprotect Password:="a"
Next i
For iZaehler = 5 To 16 Step 1
ABlatt = "Tabelle" & iZaehler & ".Spalte_aus_Kavitaeten"
ABlatt2 = "Tabelle" & iZaehler & ".Spalte_aus_Stroke"
ABlatt1 = "Tabelle5" & ".Beschriftung"
If Not Application.Intersect(Target, Range("C8:F10")) Is Nothing Then
Sheets("Januar").Range("AD13:AS15").ClearContents
Application.Run ABlatt1
Application.Run ABlatt
Application.Run ABlatt2
End If
Debug.Print iZaehler
Next iZaehler
For i = 1 To ActiveWorkbook.Worksheets.Count
ActiveWorkbook.Worksheets(i).Activate
ActiveSheet.Protect Password:="a"
Sheet("Requalifizierung").Unprotect Password:="a"
Next i
End Sub

soweit so gut.
Gibt es eine Möglichkeit das ich meine Makros in Diese Arbeitsmappe packe und dort irgendwie Implementieren kann das diese ausgelöst werden wenn sich in Einstellungen was ändert?
Ich weiß leider nicht wie das funktioniert.
Weil so muss ich jedes mal wenn ich an meinen Makros etwas ändere das in allen Arbeitsblättern machen.
Excel Version 2016
Gruß Sven
Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: Makro für die ganze Arbeitsmappe
15.06.2018 08:24:30
Matthias
Hallo
Code in DieseArbeitsmappe
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Hier Dein Code
End Sub
Aus den anderen Blättern löschst Du dann den Code
Evtl müssen die Events vorher abgeschalten werden, damit sich der Code nicht ständig selbst aufruft.
Bitte immer an einer Kopie testen!
Gruß Matthias
Anzeige
AW: Makro für die ganze Arbeitsmappe
15.06.2018 08:38:07
Sven
Hallo Matthias,
danke erstmal für die Hilfe, damit hatte ich schonmal angefangen, dann lag ich ja gar nicht so falsch.
Jedoch habe ich noch das Problem das ich nicht weis wie ich beschreibe auf welche Arbeitsblätter der Code angewendet werden soll. Soll ja nicht auf alle.
Und da mein Code ja jetzt in diese Arbeitsmappe steht muss ja vor die Range fürs auslösen noch das Arbeitsblatt oder?
If Not Application.Intersect(Target, Worksheets("Einstellungen").Range("C8:F10")) Is Nothing Then
Ist das so dann Korrekt?
Und falls ja kann ich daraus auch ne Oder Funktion mit ner anderen Range machen?
Gruß Sven
Anzeige
AW: Makro für die ganze Arbeitsmappe
15.06.2018 08:43:14
EtoPHG
Hallo Sven,
Grundsätzlich ja. Statt der einzelnen Worksheet_Change Ereignisse brauchst du in der Arbeitsmappe das Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Ereignis. Dabei zeigt das Objekt Sh auf auslösende Tabellenblatt. D,h. heisst, dass Referenzierungen wie Range so geändert werden, dass sie auf das richtige Blatt zeigen, also Sh.Range()
Ein kurze Code-Analyse:
Aus deinem Code geht nicht hervor, was die Makros ABlatt1, ABlatt und ABlatt2 machen.
Das sind Falltüren für Fehler, wie z.B. Veränderungen von Zellinhalten, die endlose Change-Ereigniss-Ketten auslösen.
Aus meiner Sicht macht es keinen Sinn, bei jedem Change (unabhängig davon wo, was verändert wird) in allen Blätter den Schutz aufzuheben und wieder zu setzen.
Da nur im Not Intersect(...) Is Nothing ev. Veränderungen stattfinden, sollten die oben erwähnten Makros den Schutz gezielt für die zu verändernden Tabellen aufheben und wieder setzen.
Zusätzlich sind die .Activate der Tabellenblätter ebenfalls kontraproduktiv. Da sollte besser einfach Worksheets(i).Protect Password:="a" stehen!
Gruess Hansueli
Anzeige
AW: Makro für die ganze Arbeitsmappe
15.06.2018 09:04:06
Sven
Hallo Hansueli,
danke schonmal für die Hilfe, das mit dem Activeworksheet habe ich jetzt geändert(ich hoffe richtig).
Das nicht die ganze Arbeitsmappe geschützt und entschützt wird wird fand ich auch nicht gut. Aber ich wusste nicht wie ich nur einzelne Arbeitsblätter für den Schutz auswähle.
Ich habe insgesamt 16 Arbeitsblätter wovon 12 bei den Makros immer entsperrt und wieder gesperrt werden müssen.
Die Sache mit dem sh.Range verstehe ich leider nicht so ganz.
Ich kopiere mal meinen kompletten Code hier rein.
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim Spalte As Integer
Dim i As Integer 'Schleife Housing
Dim j As Integer 'Schleife Lever
Dim a As Integer 'Beschriebene Zelle
Dim intLever As Integer 'Lever zum Schreiben in die Zelle
Dim intHousing As Integer 'Housing zum Beschreiben der Zelle
Dim intLZLever As Integer 'Anzahl Hebel
Dim intLZHousing As Integer 'Anzahl Gehäuse
Dim i As Integer
For i = 1 To ActiveWorkbook.Worksheets.Count
Worksheets(i).Protect Password:="a"
Next i
Sheets("Januar").Range("AD13:AS15").ClearContents
If Not Application.Intersect(Target, Worksheets("Einstellungen").Range("C8:F10")) Is Nothing  _
Then
'Ursprünglich ABlatt1
'Anzahl Level und Housing ermitteln; Tabelle bis Zelle
intLZLever = Sheets("Hilfe").Cells(8, Columns.Count).End(xlToLeft).Column
intLZHousing = Sheets("Hilfe").Cells(10, Columns.Count).End(xlToLeft).Column
a = 30
For i = 3 To intLZHousing
intHousing = Sheets("Hilfe").Cells(10, i).Value
For j = 3 To intLZLever
intLever = Sheets("Hilfe").Cells(8, j).Value
Sheets("Januar").Cells(13, a).Value = "Lever: " & intLever & "; Housing: " &  _
intHousing
a = a + 1
Next j
Next i
'Ursprünglich ABlatt
For Spalte = 34 To 45
Columns(Spalte).Hidden = Cells(13, Spalte) = ""
Next
For Spalte = 49 To 61
If Range("AT6") = "NA" Then
Columns(Spalte).Hidden = True
Else
Columns(Spalte).Hidden = Cells(13, Spalte) = ""
End If
Next
'Ursprünglich ABlatt2
For Spalte = 46 To 61
If Range("AT6") = "NA" Then
Columns(Spalte).Hidden = True
Else
Columns(Spalte).Hidden = Cells(13, Spalte) = ""
End If
Next
For i = 1 To ActiveWorkbook.Worksheets.Count
Worksheets(i).Protect Password:="a"
Sheets("Requalifizierung").Unprotect Password:="a"
End Sub
Ich habe jetzt die alten Makros einfach nacheinander darein kopiert, auch wenn das wahrscheinlich nicht ganz richtig ist.
Gruß Sven
Anzeige
AW: Makro für die ganze Arbeitsmappe
15.06.2018 09:04:39
Sven
vergessen das Ausrufezeichen zu setzen
AW: Makro für die ganze Arbeitsmappe
15.06.2018 13:22:40
EtoPHG
Hallo Sven,
Es ist schon etwas mühsam nur mit Reverse-Engineering (Analyse/Interprätation) des Codes herauszufinden, was denn die eigentlichen Anforderungen des Auftragstellers sind.
Grundsätzlich besteht ein Widerspruch zwischen deinem ersten und dem zweiten Code. Der entscheidende Bereich für das Reagieren auf Zelländerungen scheint C8:F10 zu sein. Nur wird im ersten Code auf Änderungen in jedem Blatt (in dem der Code steht) reagiert, im Zweiten hingegen nur noch auf den gleichen Bereich im Blatt "Einstellungen". Erkläre bitte warum!
Im Teil ABlatt1 werden Zellinhalte nur im Blatt "Januar" vorgenommen. Auch hier, warum?
Im Teil ABlatt & ABlatt2 werden Spalten abhängig vom Zellinhalten in Zeile 13 aus- oder eingeblendet? Ist der Inhalt dieser Zellen abhängig von den Änderungen in Einstellungen!C8:F10 ?
Das Ganze wirft mehr Fragen auf, als ich Antworten geben kann.
Gruess Hansueli
Anzeige
AW: Makro für die ganze Arbeitsmappe
18.06.2018 08:34:15
Sven
Hallo Hansueli,
ja ich weis auch nicht warum ich manches so gelöst habe. Auf jedenfall habe ich es jetzt hinbekommen das alles so funktioniert wie ich es haben möchte.
Hab es jetzt auch mit einem ClickButton und nicht über das automatische reagieren.
Vielen Dank trotzdem noch mal für alle Hilfe und Anregungen.
Dieses ist jetzt mein kompletter Code.
Private Sub CommandButton2_Click()      'Makro für Änderung von Kavitäten
'Variablen Deklarieren
Dim ws As Integer
Dim i As Integer 'Schleife Housing
Dim j As Integer 'Schleife Lever
Dim a As Integer 'Beschriebene Zelle
Dim intLever As Integer 'Lever zum Schreiben in die Zelle
Dim intHousing As Integer 'Housing zum Beschreiben der Zelle
Dim intLZLever As Integer 'Anzahl Hebel
Dim intLZHousing As Integer 'Anzahl Gehäuse
Dim Spalte As Integer
Dim pass As String
'Passwortabfrage für Button
pass = InputBox("passwort")
If pass = "b" Then
For ws = 2 To 13 Step 1
Worksheets(ws).Unprotect ("a")
'Kavitäten Löschen
Sheets(ws).Range("AD13:AS15").ClearContents
'Anzahl Level und Housing ermitteln; Tabelle bis Zelle
intLZLever = Sheets("Hilfe").Cells(8, Columns.Count).End(xlToLeft).Column
intLZHousing = Sheets("Hilfe").Cells(10, Columns.Count).End(xlToLeft).Column
a = 30
'Zellen mit Kavitäten beschreiben
For i = 3 To intLZHousing
intHousing = Sheets("Hilfe").Cells(10, i).Value
For j = 3 To intLZLever
intLever = Sheets("Hilfe").Cells(8, j).Value
Sheets(ws).Cells(13, a).Value = "Lever: " & intLever & "; Housing: " & intHousing
a = a + 1
Next j
Next i
'Spalten(Hebelabstand) die nicht benötigt werden ausblenden
For Spalte = 34 To 45
Sheets(ws).Columns(Spalte).Hidden = Sheets(ws).Cells(13, Spalte) = ""
Next
For Spalte = 49 To 61
If Sheets(ws).Range("AT6") = "NA" Then
Sheets(ws).Columns(Spalte).Hidden = True
Else
Sheets(ws).Columns(Spalte).Hidden = Sheets(ws).Cells(13, Spalte) = ""
End If
Next
'Spalten(Stroke) die nicht benötigt werden ausblenden
For Spalte = 46 To 61
If Sheets(ws).Range("AT6") = "NA" Then
Sheets(ws).Columns(Spalte).Hidden = True
Else
Sheets(ws).Columns(Spalte).Hidden = Sheets(ws).Cells(13, Spalte) = ""
End If
Next
Worksheets(ws).Protect ("a")
Next
End If
End Sub

Gruß Sven
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Makro für die gesamte Excel Arbeitsmappe


Schritt-für-Schritt-Anleitung

  1. Öffne die Excel-Arbeitsmappe, in der du das Makro implementieren möchtest.

  2. Drücke ALT + F11, um den Visual Basic for Applications (VBA) Editor zu öffnen.

  3. Im Projektfenster auf der linken Seite, doppelklicke auf "DieseArbeitsmappe" (ThisWorkbook).

  4. Füge den folgenden Code ein:

    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
       If Not Application.Intersect(Target, Worksheets("Einstellungen").Range("C8:F10")) Is Nothing Then
           ' Hier deinen Code einfügen
       End If
    End Sub
  5. Passe den Code an, indem du den spezifischen Code für deine Arbeitsblätter hinzufügst.

  6. Speichere die Arbeitsmappe als "Excel Arbeitsmappe mit Makros" (*.xlsm).

  7. Teste das Makro, indem du Änderungen im Bereich C8:F10 auf dem Blatt "Einstellungen" vornimmst.


Häufige Fehler und Lösungen

  • Fehler: Das Makro wird nicht ausgeführt.

    • Lösung: Stelle sicher, dass das Makro in "DieseArbeitsmappe" gespeichert ist und die Excel-Arbeitsmappe als Makro-fähige Datei (*.xlsm) gespeichert wurde.
  • Fehler: Fehlermeldung beim Ausführen des Makros.

    • Lösung: Überprüfe, ob alle Arbeitsblätter existieren und dass die Namen korrekt geschrieben sind. Achte auch darauf, dass der Bereich "C8:F10" auf dem richtigen Arbeitsblatt referenziert wird.

Alternative Methoden

Wenn du nicht mit VBA arbeiten möchtest, kannst du auch Excel-Formeln oder Bedingte Formatierungen verwenden, um bestimmte Zellen in Abhängigkeit von anderen Zellen zu ändern. Diese Methoden sind jedoch weniger flexibel und mächtig als VBA-Makros.


Praktische Beispiele

Hier ist ein Beispiel für einen einfachen Code, der den Inhalt eines anderen Arbeitsblatts basierend auf Änderungen im Arbeitsblatt "Einstellungen" aktualisiert:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Not Application.Intersect(Target, Worksheets("Einstellungen").Range("C8:F10")) Is Nothing Then
        Worksheets("Zielblatt").Range("A1").Value = Worksheets("Einstellungen").Range("C8").Value
    End If
End Sub

In diesem Beispiel wird der Wert von C8 im Arbeitsblatt "Einstellungen" in die Zelle A1 des Arbeitsblatts "Zielblatt" kopiert, wenn Änderungen in dem vorgesehenen Bereich vorgenommen werden.


Tipps für Profis

  • Verwende Error Handling: Füge On Error Resume Next und On Error GoTo 0 um deinen Code, um Fehler zu ignorieren oder zu behandeln.

  • Optimierung: Deaktiviere Bildschirmaktualisierungen und Berechnungen während der Ausführung des Makros, um die Geschwindigkeit zu erhöhen:

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    ' Dein Code hier
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
  • Verwende Modul- oder Klassenmodule: Wenn deine Makros komplexer werden, erwäge, diese in Module oder Klassenmodule zu organisieren, um die Wartbarkeit zu erhöhen.


FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass das Makro nur auf bestimmte Arbeitsblätter reagiert?
Du kannst die If-Bedingung im Makro anpassen, um nur auf die gewünschten Arbeitsblätter zu reagieren, z.B. durch die Verwendung von If Sh.Name = "Einstellungen" Then.

2. Kann ich das Makro auf mehrere Bereiche anwenden?
Ja, du kannst mehrere Bereiche in der If-Bedingung überprüfen, indem du die Or-Bedingung verwendest, z.B. If Not Application.Intersect(Target, Range1) Is Nothing Or Not Application.Intersect(Target, Range2) Is Nothing Then.

3. Wie teste ich das Makro in einer Kopie meiner Arbeitsmappe?
Erstelle eine Kopie deiner Excel-Arbeitsmappe und arbeite dort, um sicherzustellen, dass deine ursprüngliche Datei nicht beschädigt wird.

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