Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1628to1632
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

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
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

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige