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

Workbook_SheetChange -> Excel hängt...

Workbook_SheetChange -> Excel hängt...
21.09.2016 12:07:02
cH_rI_sI
Hallo liebe Forumsgemeinde,
ich habe nun in meinem Code versucht die Zahlen bei Range / Cells durch Namen zu ersetzen (sofern möglich), damit beim Einfügen von Spalten oder Zeilen die Makros weiterhin funktionieren.
Excel hängt jedoch nach Einfügen einer Spalte (z.B. zwischen Spalte E und F) - aber warum? Wie kann ich das Verhindern?
Anbei der Code welchen ich in "Dieser Arbeitsmappe" hinterlegt habe:
Option Explicit
Private Sub Workbook_Open()
Dim shp As Shape
Dim dattab As Range
Dim datum As Date
Dim i As Long
Dim WSh As Worksheet
Dim mySheet As Worksheet
For Each WSh In Worksheets
If WSh.CodeName = "Tabelle1" Then Set mySheet = WSh: Exit For '
Next
mySheet.Select
Application.ScreenUpdating = False
ActiveSheet.Unprotect
Set shp = ActiveSheet.Shapes("Gerade Verbindung 11")
'Range("A1") = 0
Range("ZählerHeutelinie") = 0
'Set dattab = ActiveSheet.Range("Y15:AQD15")
Set dattab = ActiveSheet.Range(Cells(Range("CalcDate").Row, Range("EndeKW").Column + 1),  _
Cells(Range("CalcDate").Row, 16384))
' actual date
datum = Now()
'datum = Range("C9")
' user defined date
'If Range("C8") > 0 Then
'datum = Range("C8")
If Range("Heute") > 0 Then
datum = Range("Heute")
End If
' find the date in the date table
For i = 1 To 1100
If datum = dattab(1, i) Then
'Range("A1") = 1100
Range("ZählerHeutelinie") = 1100
End If
' for dates before first date mark column AD
If datum 

Wenn ich den Code deaktiviere, kann ich ohne Probleme Spalten oder Zeilen einfügen und alle Makros funktionieren weiterhin - daher muss es fast an den Events liegen...
Vielleicht kann sich das jemand kurz anschauen - schonmal vielen lieben Dank!!!
Lg,
Chrisi

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Application.EnableEvents = False...
21.09.2016 12:26:26
Case
Hallo, :-)
habe mir den Code nicht näher angeschaut, aber wenn Du z. B. Kopieraktionen machst, dann musst Du...
Application.EnableEvents = False
... setzten, da sich sonst die Routine immer wieder selbst aufruft.
Du darfst aber nicht vergessen, das am Ende wieder auf "Application.EnableEvents = True" zu setzen!!!
Servus
Case

AW: Application.EnableEvents = False...
21.09.2016 14:09:29
cH_rI_sI
Hi Case,
vielen lieben Dank für die rasche Rückmeldung - ich habe soeben deinen Vorschlag wie folgt eingebaut:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Application.ScreenUpdating = False
'If Target.Address = "$C$7" Then
If Target.Address = Range("Enddate").Address Then
Combox
Else
'If Target.Address = "$K$7" And _
'Range("E1") = 3 Then
If Target.Address = Range("Startdate").Address And _
Range("Calendardetails") = 3 Then
Combox
Else
'If Target.Address = "$K$7" And _
'Range("E1") = 4 Then
If Target.Address = Range("Startdate").Address And _
Range("Calendardetails") = 4 Then
Combox
Application.ScreenUpdating = True
End If
End If
End If
Application.EnableEvents = False
If Target.Address = "$AJ$4" Then
ActiveSheet.Range("AJ4").Copy
'ActiveSheet.Range("F1").Select
ActiveSheet.Range("savePREVIOUS").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveSheet.Range("AJ4").Select
Else
If Target.Address = "$AJ$6" Then
ActiveSheet.Range("AJ6").Copy
'ActiveSheet.Range("K1").Select
ActiveSheet.Range("saveCURRENT").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveSheet.Range("AJ6").Select
Else
If Target.Address = "$AJ$8" Then
ActiveSheet.Range("AJ8").Copy
'ActiveSheet.Range("L1").Select
ActiveSheet.Range("saveTREND").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveSheet.Range("AJ8").Select
Else
If Target.Address = "$AG$4" Then
ActiveSheet.Range("AG4").Copy
'ActiveSheet.Range("F1").Select
ActiveSheet.Range("savePREVIOUS").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveSheet.Range("AG4").Select
Else
If Target.Address = "$AG$6" Then
ActiveSheet.Range("AG6").Copy
'ActiveSheet.Range("K1").Select
ActiveSheet.Range("saveCURRENT").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveSheet.Range("AG6").Select
Else
If Target.Address = "$AG$8" Then
ActiveSheet.Range("AG8").Copy
'ActiveSheet.Range("L1").Select
ActiveSheet.Range("saveTREND").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveSheet.Range("AG8").Select
End If
End If
End If
End If
End If
End If
Application.EnableEvents = True
End Sub

Wenn ich jedoch wie vorher eine Spalte einfüge, dann steht das Excel komplett - wenn ich den ganzen Code entferne, funktioniert alles - an was liegt das? Hast noch eine Idee?
Danke im Voraus!
Lg,
Chrisi
Anzeige
Debuggen...
21.09.2016 15:01:38
Case
Hallo, :-)
gehe doch mal mit F8 Schritt für Schritt durch den Code, dann siehst du doch wo er aussteigt. ;-)
Bzw. setzte dir mit F9 einen Haltepunkt am Anfang und dann mit F8 weiter.
Oder lade mal eine abgespeckte Datei hoch, bei welcher das Problem auftritt.
Servus
Case

AW: Debuggen...
21.09.2016 15:33:17
Llemaban
Setz "Application.ScreenUpdating = True" mal unter die folgenden drei "end if"?
AW: Debuggen...
21.09.2016 17:02:04
cH_rI_sI
@ all: Danke für Eure Tipps!
Ich habe gerade festgestellt, dass dies vermutlich ein Excel 2007 Problem sein muss, weil mit Excel 2013 (habe ich zuhause) funktioniert alles tadellos - mit dem blöden 2007er in der Firma friert alles ein wenn ich nur eine Spalte einfüge?!?
Jemand eine Idee wie man das löst? Schonmal recht herzlichen Dank!
Lg und schönen Abend,
Chrisi
Anzeige
AW: Debuggen...
21.09.2016 17:23:53
cH_rI_sI
Ich habe jetzt auch noch gesehen, dass der Code beim Debuggen unter 2007 auch durchläuft, Excel jedoch dann einfriert?!? Ist wie gesagt bei 2013 nicht...
Lg,
Chrisi
AW: Debuggen...
21.09.2016 18:19:06
Llemaban
Hi Chrisi
Versuch mal einfach am Ende sinnlose Sachen wie zB ActiveSheet.range("A1").Select einzufügen. Kann nichts garantieren, aber hat mir auch schon geholfen.
lg Llemaban
AW: Application.EnableEvents = False...
21.09.2016 18:36:05
ChrisL
Hi
Was macht Combox?
Lösche mal die eine Code-Hälfte (Schnitt bei EnableEvents), teste, und dann die andere Hälfte. Vielleicht lässt sich die Fehlersuche um 50 % eingrenzen :)
Ich tippe auf eine Endlosschleife, wobei ich mir vorstellen könnte, dass die Excel-Versionen unterschiedlich empfindlich reagieren. Mache EnableEvents = False zur Sicherheit mal ganz oben rein.
Übersichtlichkeit im Code und halbwegs sauberes Programmieren hilft vermeintliche Random-Errors zu vermeiden. Dazu ein paar Tipps:
Momentan verschachtelst du viele If-Then-Else. ElseIf wäre eine Alternative:
If Bedingung Then
...
ElseIf Bedingung Then
...
ElseIf Bedingung Then
...
usw.
In deinem Fall scheint mir Select-Case Ideal:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Application.EnableEvents = False
If Target.Cells.Count > 1 Then Exit Sub
Select Case Target.Address
Case Range("Enddate").Address
Combox
Case Range("Startdate").Address
If Range("Calendardetails") = 3 Or Range("Calendardetails") = 4 Then Combox
Case "$AJ$4", "$AG$4"
Range("savePREVIOUS") = Target
Target.Select
Case "$AJ$6", "$AG$6"
Range("saveCURRENT") = Target
Target.Select
Case "$AJ$8", "$AG$8"
Range("saveTREND") = Target
Target.Select
End Select
Application.EnableEvents = True
End Sub

Ungetestet, nur ein kleiner Versuch den Code aufzuräumen ;)
cu
Chris
Anzeige
AW: Application.EnableEvents = False...
21.09.2016 18:43:54
ChrisL
Ups...

If Target.Cells.Count > 1 Then Exit Sub
Application.EnableEvents = False
Die zwei Zeilen musst du unbedingt tauschen. Wenn ganze Bereiche kopiert werden, soll der Code gleich zu beginn aussteigen (sonst passt die Target.Address nicht). In dem Fall soll EnableEvents natürlich eingeschaltet bleiben.
AW: Application.EnableEvents = False...
22.09.2016 07:42:19
cH_rI_sI
Lieber Chris,
besten Dank für deine Mühe - der Code funktioniert, aber leider läuft das Ganze jetzt langsamer ab als vorher - d.h. ich habe auch "Application.ScreenUpdating = False" gesetzt aber trotzdem läuft das Ganze langsam - anbei mein Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub
Application.EnableEvents = False
Application.ScreenUpdating = False
Select Case Target.Address
Case Range("Enddate").Address
Combox
Case Range("Startdate").Address
If Range("Calendardetails") = 3 Or Range("Calendardetails") = 4 Then Combox
Case "$AJ$4", "$AG$4"
Range("savePREVIOUS") = Target
Target.Select
Case "$AJ$6", "$AG$6"
Range("saveCURRENT") = Target
Target.Select
Case "$AJ$8", "$AG$8"
Range("saveTREND") = Target
Target.Select
End Select
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
An was liegt das?
Weiters habe ich einen Artikel gefunden, was auf einen Excel 2007 Fehler hindeutet:
http://www.online-excel.de/fom/fo_read.php?f=1&bzh=0&h=20041
Ich füge eine Spalte ein und dann friert Excel 2007 ein - könnte ja auch mit dem zusammenhängen oder?
Lg,
Chrisi
Anzeige
Da gibt es u. U. noch mehr Bremsen...
22.09.2016 08:21:05
Case
Hallo, :-)
Du solltest auch an "Calculation" denken. Wenn die Arbeitsmappenberechnung auf Automatisch steht kann das auch ausbremsen.
Ich nehme bei meinen Codes immer am Anfang...
Dim lngCalc As Long
' Wenn ein Fehler auftritt gehe zu der angegebenen Sprungmarke
On Error GoTo Fin
' Die Excelapplikation wird ruhig gestellt - UNBEDINGT wieder einschalten
With Application
' Das Bildschirmaktualisierung wird unterbrochen
.ScreenUpdating = False
' Ereignisroutinen werden deaktiviert
.EnableEvents = False
' Auslesen der momentanen Einstellung für die Berechnung
lngCalc = .Calculation
' Setzen der Berechnung auf "Manuell"
.Calculation = xlCalculationManual
'  Eingabeaufforderungen und Warnmeldungen unterdrücken
.DisplayAlerts = False
End With
... und am Ende...
Fin:
' Die Applikation aufwecken
With Application
' Bildschirmaktualisierung wieder einschalten
.ScreenUpdating = True
' Ereignisroutinen werden wieder aktiviert
.EnableEvents = True
' Setzen der Berechnung auf den gemerkten Wert
.Calculation = lngCalc
' Eingabeaufforderungen und Warnmeldungen wieder zulassen
.DisplayAlerts = True
' Abbrechen Ausschneide- bzw. Kopiermodus und entfernen des Laufrahmens
.CutCopyMode = True
End With
' Wenn ein Fehler auftritt gib ihn aus mit Fehlernummer und Beschreibung
If Err.Number  0 Then MsgBox "Error: " & _
Err.Number & " " & Err.Description
Sepp (Josef Ehrensberger) hat das mal in eine Funktion gepackt. Suche mal im Archiv.
Weiteres kann ich nicht sagen, da ich schon lange nicht mehr mit der 2007er Version arbeite.
Servus
Case

Anzeige
AW: Application.EnableEvents = False...
22.09.2016 08:41:55
ChrisL
Hi Chrisi
Ich habe meine Mühe zu glauben, dass eine Umstellung If-Then auf Select-Case einen Unterschied macht. Sicherlich lohnt es sich den Hinweis von Case betr. Calculate zu beachten.
Und auch einen Zusammenhang mit dem Artikel sehe ich weniger. Dort wird das Event/Ereignis nicht ausgelöst, aber das Problem scheinst du ja nicht zu haben.
Wenn du sagst, der Code läuft. Besteht dann das Grundproblem (freeze) noch?
Und was macht denn nun ComBox?
cu
Chris
CLOSED
22.09.2016 13:50:03
cH_rI_sI
@ Chris: Dein Code funktioniert nun doch - keine Ahnung an was es lag - Excel friert nun nicht mehr ein ;-)
@ Case: Auch Dir Danke für die Tipps!!!
@ all: Natürlich auch eine Danke an alle, die sich auch Gedanken gemacht haben!
Anzeige

98 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige