Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1588to1592
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

Berechnungen für alle Tabellenblätter

Berechnungen für alle Tabellenblätter
06.11.2017 13:05:50
Peter
Hallo,
ich habe einen Code, den ich für alle Tabellenblätter anwenden möchte (außer Tabelle1, WE und Vorlage). Er füllt bestimmte Zellen aus, wenn in anderen Zellen ein Wert eingegeben wird.
Aktuell beginnt er wie folgt und ist in "DieseArbeitsmappe" geschrieben:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If ActiveSheet.Name  "Tabelle1" Or "WE" Or "Vorlage" Then
With ActiveSheet
Dim a As Integer, b As Integer, c As Integer
a = Target.Row
If Target.Row > 1 Then

usw.
Wenn ich jetzt auf ein Tabellenblatt gehe und die zur Ausführung notwendige Zellen beschreibe, tut sich nichts. Wenn ich den Code in das entsprechende Tabellenblatt schreibe, funktioniert er hingegen wunderbar.
Muss ich in den Code im aktiven Blatt noch extra aufrufen? Oder habe ich am Anfang einen Fehler drin?
Vielen Dank im voraus!

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Berechnungen für alle Tabellenblätter
06.11.2017 13:16:57
ChrisL
Hi Peter
If ActiveSheet.Name "Tabelle1" Or ActiveSheet.Name "WE" Or ActiveSheet.Name "Vorlage" Then
Alternative z.B.
Select Case ActiveSheet.Name
Case "Tabelle1", "WE", "Vorlage"
' Hier Code
End Select
cu
Chris
AW: Berechnungen für alle Tabellenblätter
06.11.2017 13:17:13
Daniel
Hi
mit dem OR-Operator verknüpfst du immer die beiden Werte, die links und rechts vom OR stehen.
"WE" OR "Vorlage" ergibt daher einen Fehler, weil du mit OR keine Texte, sondern nur Boolsche Ausdrücke wie TRUE oder FALSE miteinander verknüpfen kannst.
du müsstest das dann so schreiben, denn erst durch den Vergleich entsteht der Wahrheitswert, den du mit OR verknüpfen kannst: (ohne jetzt die Logik genauer geprüft zu haben)
IF ActiveSheet.Name  "Tabelle1" or ActiveSheet.Name  "WE" or ActiveSheet.Name  "Vorlage" Then

für deinen Fall ist das Select Case besser geeignet also das IF-Then
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim a As Integer, b As Integer, c As Integer
Select Case ActiveSheet.Name
Case "Tabelle1", "WE", "Vorlage"
Case Else
a = Target.Row
if Target.Row > 1 then
usw
End Select
Gruß Daniel
Anzeige
AW: Berechnungen für alle Tabellenblätter
06.11.2017 13:40:02
Peter
Hallo,
erstmal vielen Dank euch beiden.
Mit dem Case Operator macht er jetzt schonmal was.
Allerdings sagt er mir das erste mal "Stapelfehler" und wenn ich dann noch einen Wert ändere Laufzeitfehler (Die Methode '_Default' für das Objekt 'Range' ist fehlgeschlagen)
Debuggen geht nicht, excel stürzt davor ab...
Hat das was mit einer gegebenenfalls unsauberen Deklaration meiner Variablen zutun? (könnte durchaus sein, da das mein erster VBA-Code ist).
Geht er mit dem Case Operator alle Tabellenblätter durch oder nur das aktuelle?
AW: Berechnungen für alle Tabellenblätter
06.11.2017 13:40:09
Peter
Hallo,
erstmal vielen Dank euch beiden.
Mit dem Case Operator macht er jetzt schonmal was.
Allerdings sagt er mir das erste mal "Stapelfehler" und wenn ich dann noch einen Wert ändere Laufzeitfehler (Die Methode '_Default' für das Objekt 'Range' ist fehlgeschlagen)
Debuggen geht nicht, excel stürzt davor ab...
Hat das was mit einer gegebenenfalls unsauberen Deklaration meiner Variablen zutun? (könnte durchaus sein, da das mein erster VBA-Code ist).
Geht er mit dem Case Operator alle Tabellenblätter durch oder nur das aktuelle?
Anzeige
Stochern im Nebel
06.11.2017 13:52:45
Werner
Hallo Peter,
ohne den ganzen Code zu kennen. Noch besser - Beispieldatei hochladen.
Gruß Werner
AW: Berechnungen für alle Tabellenblätter
06.11.2017 13:57:33
Rudi
Hallo,
du solltest die Events ausschalten.
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim a As Long
Select Case LCase(Sh.Name)
Case "we", "tabelle1", "vorlage"
'nix passiert
Case Else
On Error GoTo ERREXIT
Application.EnableEvents = False
a = Target.Row
If a > 1 Then
'Code
End If
End Select
ERREXIT:
Application.EnableEvents = True
End Sub
Gruß
Rudi
AW: Berechnungen für alle Tabellenblätter
06.11.2017 14:14:58
Daniel
Hi
du solltest beachten, dass sich die Eventmakros rekursiv selbst aufrufen können.
dh wenn du im Change-Event einen Tabellenwert änderst, wird das Change-Event erneut mit dem neuen Target aufgerufen.
damit das ursprüngliche Change-Event sauber weiter laufen kann wenn das neue Change-Event durchgelaufen ist, werden die Variablenwerte auf den Stapelspeicher gelegt, so dass jedes Change-Event mit seinen eigenen Variablen arbeiten kann und es kein durcheinander gibt.
Das Problem entsteht, wenn sich die Change-Events in einer Endlossschleife immer neu aufrufen. Dann läuft der Stapelspeicher irgendwann voll, weil für jeden Aufruf die Variablen auf den Stapelspeicher gelegt werden.
Was du dagegen tun kannst, wurde dir von Rudi schon gezeigt:
führe die Aktion Application.EnableEvents = False aus.
nach diesem Befehl werden keine Eventmakros mehr ausgeführt, dh du kannst im Change-Event einen Wert ändern, ohne dass das Change-Event erneut ausgeführt wird.
du darfst nur nicht vergessen, diese Einstellung vor Makroende wieder zurückzunehmen:
Application.EnableEvents = True , denn diese Einstellung bleibt bei Makroende erhalten und wird nicht automatisch zurückgesetzt.
Dh wenn das Application.EnableEvents = True unterbleibt, funktioniert deine Datei nicht mehr.
Sollte das mal beim Testen oder bei einem Fehlerabbruch passieren, kannst du den Befehl auch im Direktfenster ausführen, um die Events wieder zu aktivieren.
Gruß Daniel
Anzeige
AW: Berechnungen für alle Tabellenblätter
06.11.2017 14:49:43
Peter
Danke für die ausführliche Erklärung und @ Rudi danke für den Code.
Es funktioniert nun!
Allerdings führt er nur einen Schritt aus und bricht dann ab, die darunter liegenden Zeilen werden also nicht angepasst.
Ich probiere also noch etwas rum, an welcher Stelle ich die Events wieder aktivieren muss. Woran es liegt, weiß ich jetzt ja dank euch!
Grüße Peter
AW: Berechnungen für alle Tabellenblätter
06.11.2017 13:39:41
EtoPHG
Hallo Peter,
Dein IF ist völlig falsch formuliert. Zudem verträgt sich nicht mit OR
Wieso Activesheet, wenn sh zur Verfügung steht?
...und ROW / COLUMN Angaben in Long nicht Integer!
Mach es so:
    Dim a As Long, b As Long, c As Long
If Sh.Name = "Tabelle1" Or Sh.Name = "WE" Or Sh.Name = "Vorlage" Then Exit Sub
a = Target.Row
If Target.Row > 1 Then
Gruess Hansueli
Anzeige

310 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige