Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1652to1656
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

Error in Makro finden

Error in Makro finden
06.11.2018 09:41:40
Marco
Hallo zusammen,
ich habe ein Makro im Tabellenblatt SP1. Dies wird aktiviert wenn eine Eingabe erfolgt. Das Makro hat zwei Ziele:
1. Rechtschreibkontrolle (falsch geschriebene Wörter werden unterstrichen)
2. Es markiert die aktivierte Zeile in blau (indem die Zeile ausgelesen wird und die bedingte Formatierung anspringt)
https://www.herber.de/bbs/user/125168.xlsm
Natürlich ist mir das ganze Makro zu langsam, aktuell werden bei mir pro 100 Wörter ca. 7 Sekunden für die Rechtschreibkontrolle gebraucht (siehe AO 102; Lorem ipsum). Um beim Bastel wie es schneller, bzw. optimaler nacheinander ablaufen könnte habe ich in den Errorhandler eine MSGBOX eingebaut die mir sagt ob dieser angesprungen ist. Dabei stellte sich heraus, dass der Errorhandler nach jeder Eingabe 2x anspringt.
Da sich meine Fähigkeiten in VBA aus meinen Fähigkeiten mit Google ergeben :-) finde ich den Grund für die "Errors" nicht und vermute, dass diese auch Zeit kosten. Das Error-Makro steht im Modul 1, das andere im Tabellenblatt. Das Error Makro nutze ich, weil bei einem Error sonst das Screen-Updating und die automatische Berechnung deaktiviert bleibt.
Mag mir bitte jemand helfen dieses Makro zu optimieren damit es sicher und schnell läuft.
Vielen Dank im Vorraus,
Marco

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Dann Fehlerbehandlung ausschalten.
06.11.2018 10:04:28
Daniel
Hi
screenUpdating muss man nicht aktivieren, das wird automatisch auf True gesetzt, wenn das Makro durchgelaufen ist (muss Excel machen sonst könntest du nicht mit Excel arbeiten.
Ebenso wird ScreenUpdating automatisch aktiviert, wenn du den Code im Einzelstepmodus durchgehst z.B. nach einen Haltepunkt, STOP oder Fehlerabbruch.
Application.Calculation kann man im Bedarfsfall über das Menü wieder aktualisieren.
dh solange dein Code noch nicht fehlerfrei läuft und du auf Fehlersuche bist, solltest du jegliche Fehlerbehandlungsroutinen deaktivieren.
Dann hält der Code bei einem Fehler in der Zeile mit dem Fehler an.
Damit bekommst du dann viele Informationen, die für die Ermittlung der Fehlerursache extrem hilfreich sind:
- wo passiert der Fehler
- welchen Werte haben die Variablen und verwendete Zellen, wenn der Fehler passiert.
mit einer einfachen Fehlerbehandlungsroutine verlierst du diese wichtigen Informationen.
daher: solange der Code noch nicht Fehlerfrei läuft, ist eine allgemeine Fehlerbehandlungsroutine nicht sinnvoll.
Erst wenn der Code nach bestem Wissen und Gewissen getestet ist und fehlerfrei läuft, kann man so eine Routine einbauen, um ggf übersehne Fehlermöglichkeiten abzufangen und den Endanwender nicht mit einem verstellten Excel stehen zu lassen.
aber sobald man auf Fehlersuche geht, ist das erste was man tun sollte die Fehlerbehandlungsroutine auszuschalten.
Gruß Daniel
Anzeige
AW: Error in Makro finden
06.11.2018 10:18:02
Daniel
ansonsten, du hast in deinem makro keinen Errorhandler oder Fehlerbehandlung.
du rufst nur am Ende des Change-Events dein Makro "Notstart" auf (wofür aber keinerlei Notwendigkeit besteht) und bekommst deswegen die Message, auch wenn gar kein Fehler passiert ist.
so würde dein Code mit einem funktionerenden Errorhändler aussehen:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
'--- der Fehlersprung wird erst nach diesem Befehl aktiv, daher muss dieser Befehl an den  _
Anfang
On Error GoTo errorHandler1
If Not Intersect(Target, Range("af102:AO149")) Is Nothing Then
[TargetZeile] = Target.Row
'[TargetSpalte] = Target.Column
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
Dim Wert, Werte, FalseWörter(1 To 1000), i As Long, j As Long
Werte = Split(Target.Value)
For Each Wert In Werte
With Target.Characters(InStr(Target, Wert), Len(Wert)).Font
If .Underline = xlUnderlineStyleDouble Then .Underline = xlNone
End With
Next
For Each Wert In Werte
If Application.CheckSpelling(Wert) = False Then
i = i + 1
FalseWörter(i) = Wert
End If
Next
For j = 1 To i
Target.Characters(InStr(Target, FalseWörter(j)), Len(FalseWörter(j))).Font.Underline =  _
xlUnderlineStyleDouble
Next
End If
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
End With
' ---dies vermeidet, dass der nachfolgende Code ausgeführt wird, wenn kein Fehler auftritt
Exit Sub
errorHandler1:
Call Makro_Notstart
End Sub

außerdem solltest du noch
Application.EnableEvents = False
an den Anfang setzen.
dies verhindert das Selbstaufrufen des Change-Events, wenn du im Change-Event einen Zellwert änderst.
muss natürlich am Ende wieder mit Application.EnableEvents = True zurückgesetzt werden.
das ist die einzige Einstllungsänderung, die einen Errorhändler rechtfertigt, weil hier die zuletzt gemachte Einstellung nach Makroende erhalten bleibt und nicht vom Anwender per einfachen Mausklick wieder zurückgesetzt werden kann.
Gruß Daniel
Anzeige
AW: Error in Makro finden
06.11.2018 10:27:12
Marco
Hallo Daniel,
vielen Dank für die Erklärung UND den angepassten Code. Das es nun funktioniert brauch ich wohl nicht betonen.
DANKESCHÖN!
Beste Grüße
Marco
AW: Error in Makro finden
06.11.2018 10:57:16
PeterK
Hallo
Einige kleine Verbesserungen:
- "." und "," durch Leerzeichen ersetzt
- Instr Funktion mit Startindex versehen

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim Wert, Werte
Dim myStart As Long
Dim myString As String
Application.EnableEvents = False
On Error GoTo errorHandler1
If Not Intersect(Target, Range("AF102:AO149")) Is Nothing Then
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
myString = Target.Value
myString = Replace(myString, ",", " ")
myString = Replace(myString, ".", " ")
Werte = Split(myString)
Target.Font.Underline = xlNone
myStart = 0
For Each Wert In Werte
If Application.CheckSpelling(Wert) = False Then
myStart = InStr(myStart + 1, Target, Wert)
Target.Characters(myStart, Len(Wert)).Font.Underline = xlUnderlineStyleDouble
End If
Next
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
End With
End If
Application.EnableEvents = True
Exit Sub
errorHandler1:
Call Makro_Notstart
End Sub

Anzeige
AW: Error in Makro finden
06.11.2018 12:01:13
Marco
Hallo Peter,
sehr geil. Bei 100 Wörtern ist deine Version leicht schneller (5,5 statt 7 Sekunden). Bei 500 Wörtern ist deine Version SEHR VIEL SCHNELLER (7,6 statt 36 Sekunden).
Vielen Vielen Dank,
Marco

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige