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

Code Ausführung sehr langsam

Code Ausführung sehr langsam
27.06.2021 16:11:00
Philipp
Guten Tag liebe Forum-Teilnehmer,
seit kurzem wird der folgend beschriebene VBA-Code sehr langsam ausgeführt. Schon beim Öffnen der Tabelle dauert es sehr lange bis Eingaben gemacht werden können.
Das merkwürdige ist, dass sich die Bearbeitungszeit verlängert hat ohne das ich Veränderungen vorgenommen habe.
Alle anderen Tabellen sind nicht betroffen und deren VBA Code läuft einwandfrei. Ich hoffe, dass jemand anhand der Beschreibung und dem Code einen Grund für die Langsamkeit entdecken kann.
1. Beschreibung:
in einer Tabelle (Stammdaten) der Arbeitsmappe stehen Personaldaten. Um das Personal schneller zu finden gibt es zwei Comboboxen.
Bei Eingabe der Personalnummer (Combobox 1) oder Nachnamen (Combobox 2) sucht eine "For/ Next Schleife" nach Übereinstimmungen in den Personalstammdaten.
Wird eine Übereinstimmung gefunden, wird die in Spalte A befindliche Personalnummer angewählt und das Fenster an die entsprechende Position gescrollt.
Anhand der Personalnummer in Spalte A wird in den Zeilen A2 bis A6 das Foto des Mitarbeiters angezeigt.
Durch Doppelklick in eine beliebige Zeile mit Personaldaten öffnet eine UserForm in der die Personaleinzelansicht zu sehen ist. Des Weiteren können ihr Eingaben gemacht werden, die dann in die Stammdatentabelle übernommen werden. Das Personal kann auch gelöscht werden. Des Weiteren kann das Personal in andere Tabellen übernommen werden.
Sobald Eintragungen in der Tabelle Stammdaten gemacht werden läuft auch die UserForm sehr langsam, sodass ich vermute, dass der Fehler im unten stehenden Code der Tabelle Stammdaten steckt.
Wäre über jeden Tipp oder Hinweis sehr dankbar!

Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Unprotect Password:="UB"
If Not Intersect(Target, Range("A8:A1000")) Is Nothing Then ActiveCell.Copy Destination:=Tabelle2.Range("A1")
On Error Resume Next
If Not Intersect(Target, Range("B8:B1000")) Is Nothing Then ActiveCell.Offset(0, -1).Copy Destination:=Tabelle2.Range("A1")
If Not Intersect(Target, Range("C8:C1000")) Is Nothing Then ActiveCell.Offset(0, -2).Copy Destination:=Tabelle2.Range("A1")
If Not Intersect(Target, Range("D8:D1000")) Is Nothing Then ActiveCell.Offset(0, -3).Copy Destination:=Tabelle2.Range("A1")
If Not Intersect(Target, Range("E8:E1000")) Is Nothing Then ActiveCell.Offset(0, -4).Copy Destination:=Tabelle2.Range("A1")
If Not Intersect(Target, Range("F8:F1000")) Is Nothing Then ActiveCell.Offset(0, -5).Copy Destination:=Tabelle2.Range("A1")
If Not Intersect(Target, Range("G8:G1000")) Is Nothing Then ActiveCell.Offset(0, -6).Copy Destination:=Tabelle2.Range("A1")
If Not Intersect(Target, Range("H8:H1000")) Is Nothing Then ActiveCell.Offset(0, -7).Copy Destination:=Tabelle2.Range("A1")
If Not Intersect(Target, Range("I8:I1000")) Is Nothing Then ActiveCell.Offset(0, -8).Copy Destination:=Tabelle2.Range("A1")
If Not Intersect(Target, Range("J8:I1000")) Is Nothing Then ActiveCell.Offset(0, -9).Copy Destination:=Tabelle2.Range("A1")
Dim cDir As String
Dim trname As String
Const sPath As String = "B:\Gemeinsame Daten\Fahrtechnik\Bilder Dienstausweise\"
'    Const sPath As String = "F:\Eigene Dateien von Philipp\KVB\Fahrmeister\Bilder Dienstausweise\"
trname = Worksheets("Stammdaten").Range("A1").Text
cDir = Dir(sPath & trname & "*.jpg")
If Range("A1") > "" Then
Image1.Picture = LoadPicture(sPath & cDir)
Image1.PictureSizeMode = fmPictureSizeModeZoom
Else: Image1.Picture = LoadPicture("")
End If
Protect Password:="UB"
End Sub
Private Sub CheckBox1_Click()
ActiveSheet.Columns("K:K").Hidden = Not (CheckBox1)
End Sub
Private Sub ComboBox1_Change() 'Feld zur Eingabe der Personalnummer
'Variablen ihrem Typ zuweisen
Dim Wiederholungen As Long, Auswahl As String
ComboBox2 = ""
'Angezeigten Wert aus Kombinationsfeld1 in Variable "Auswahl" schreiben
Auswahl = ComboBox1
'e zum Finden von Übereinstimmungen des Inhaltes der
'Variablen "Auswahl"
For Wiederholungen = 8 To 4000
'Abfrage: Wenn Kombinationsfeld leer dann zur Sprungmarke "Ende" springen
If Cells(Wiederholungen, 1) = "" Then GoTo Ende
'Abfrage: Wenn Inhalt der angesprochenen Zelle gleich dem Inhalt der
'Variablen "Auswahl", dann...
' If Left$(Cells(Wiederholungen, 1).Text, Len(Auswahl)) = Auswahl Then
If Cells(Wiederholungen, 1) = Auswahl Then
'Zelle markieren,
Cells(Wiederholungen, 1).Select
'Fenster an die entsprechende Position scrollen
ActiveWindow.ScrollColumn = ActiveWindow.ActiveCell.Column
ActiveWindow.ScrollRow = ActiveWindow.ActiveCell.Row
'Kombinationsfeld zur weiteren Eingabe wieder aktivieren
ComboBox1.Activate
'Abfrage Ende
End If
'Nächsten Schleifendurchlauf starten
Next
'Sprungmarke
Ende:
'Worksheets("Stammdaten").ComboBox1.Value = ""
End Sub
Private Sub ComboBox2_Change() 'Feld zur Eingabe des Nachnamens
'Variablen ihrem Typ zuweisen
Dim Wiederholungen As Long, Auswahl As String
ComboBox1 = ""
'Angezeigten Wert aus Kombinationsfeld1 in Variable "Auswahl" schreiben
Auswahl = ComboBox2
'For/ Next Schleife zum Finden von Übereinstimmungen des Inhaltes der
'Variablen "Auswahl"
For Wiederholungen = 8 To 4000
'Abfrage: Wenn Kombinationsfeld leer dann zur Sprungmarke "Ende" springen
If Cells(Wiederholungen, 11) = "" Then GoTo Ende
'Abfrage: Wenn Inhalt der angesprochenen Zelle gleich dem Inhalt der
'Variablen "Auswahl", dann...
If Cells(Wiederholungen, 11) = Auswahl Then
'Zelle markieren,
Cells(Wiederholungen, 1).Select
'Fenster an die entsprechende Position scrollen
ActiveWindow.ScrollColumn = ActiveWindow.ActiveCell.Column
ActiveWindow.ScrollRow = ActiveWindow.ActiveCell.Row
'Kombinationsfeld zur weiteren Eingabe wieder aktivieren
ComboBox2.Activate
'Abfrage Ende
End If
'Nächsten Schleifendurchlauf starten
Next
'Sprungmarke
Ende:
End Sub
Private Sub CommandButton1_Click()
ComboBox2 = ""
ComboBox1 = ""
frm_Suche.Show
End Sub
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, Range("A8:I1000")) Is Nothing Then Exit Sub
Cancel = True
ComboBox2.ListIndex = -1 'Leert den Text (Fahrpersonalnamen) aus der ComboBox2
ComboBox1.Value = ""  'Leert die Personalnummer aus der ComboBox1
frm_Fahrpersonal_Einzelansicht.Show
End Sub
Private Sub worksheet_Beforeopen()
ComboBox1 = ""
ActiveWindow.ScrollRow = 1
ActiveWindow.ScrollColumn = 1
End Sub

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Code Ausführung sehr langsam
27.06.2021 17:24:51
EtoPHG
Hallo,
Ich kann nur ein paar allgemeine Aussagen zu diesem Code machen. Das verwundene und (zu) komplizierte Konstrukt werde ich nicht auseinanderdröseln.
1. Ein SelectionChange-Ereignis sollte nur in wirklich notwendigen als Trigger für Code gewählt werden.
2. Innerhalb des Ereignis mit .Select zu arbeiten kann zu 'tödlichen' Endlosschlaufen führen. Zelladressen sollten direkt referenziert werden, so kann .Select und .Activate zu praktisch 100% überflüssig gemacht werden.
3. Events sollten vor dem Codestart einer Eventprozedur vorher ausgeschaltet (Application.EnableEvents=False) und vor dem Ende wieder eingeschaltet werden (Application.EnableEvents=True). Das verhindert unerwünschte 'Ketten'-Reaktionen durch andere Event-Prozeduren.
4. Das Initialsieren oder Ändern von Controls in einer Userform, sollte möglichst nicht ausserhalb des Klassenmoduls der Userform erfolgen. Dazu stehen Events wie Userform_Intialize und Userform_Activate zur Verfügung. Das Setzen von Inhalten der Userform ausserhalb deren Klassmoduls, lädt letzteres von aussen, statt nur mit der .Show Methode.
5. On Error Resume Next äusserst sparsamen verwenden und vor allem sobald eine erwartetes Fehlerereignis auftreten könnte wieder mit On Error Goto -1 zurücksetzen!
Gruess Hansueli
Anzeige
AW: Code Ausführung sehr langsam
27.06.2021 20:25:16
Matthias
Hallo ...,
wie kommst Du auf

On Error Goto -1?
es heißt doch eigentlich

On Error Goto 0
Der Rückgabewert von Err ist jedenfalls gleich.
Hab ich da irgend etwas verpasst, oder warum benutzt Du

-1
Gruß ...
AW: Code Ausführung sehr langsam
28.06.2021 05:49:32
Philipp
Hallo Hansueli,
vielen Dank für deine Anregungen! Werde versuchen diese im Code zu berücksichtigen.
Kannst du mir eine Alternative zum SelectionChange-Ereignis in meinem Code nennen? Es wird als Trigger für Code genutzt, um die jeweilige Personalnummer aus Spalte A in Zelle A 1 zu kopieren. Dort wird sie genutzt um in Bereich A2 bis A6 das Foto des Personals anzuzeigen.
Vielen Dank im Vorraus.
Anzeige
AW: Vielleicht ganz ohne Code möglich...
28.06.2021 10:33:39
EtoPHG
Hallo,
Diese Anforderung lässt sich ev. ganz ohne Code lösen. Bilder können z.B. auch in Kommentaren eingefügt werden oder aus Bilderspeicher aus anderen Tabellenblättern referenziert werden. Für beides benutze die Forums-Recherche.
Es wäre besser du würdest eine anonymisierte Beispielmappe hochladen. Erkläre darin möglichst genau deine Zielvorstellungen.
Es ineffizient Brösel für Brösel zu picken wenn man den ganzen Kuchen nicht sieht und bei dem Basiswissen dürftest du diesen sowieso nicht gebacken kriegen ;-)
Gruess Hansueli
Vor allem …
27.06.2021 18:55:56
RPP63
Moin!
… sollte man sich keine "eigenen" Ereignis-Makros ausdenken und sich fragen, warum sie nicht laufen.
Ich jedenfalls kenne kein Private Sub worksheet_Beforeopen()
Gruß Ralf
Anzeige
AW: Code Ausführung sehr langsam
28.06.2021 13:25:41
Daniel
HI
da gibts insgesamt sehr viel zu optimiern.
1. solltest du nicht das Change-Event der Userform nehmen, um auf eine Eingabe des Anwenders zu reagieren.
das Change-Event läuft bei jeder Änderung los, auch schon beim Eintippen des ersten Buchstabens.
hier wäre es besser, erst dann zu starten, wenn die Eingabe fertig ist, also mit Click, Exit oder After Update
2. die For-Next-Schleife über alle Zellen ist langsam.
arbeite hier besser mit .FIND und nicht mit der Schleife, weise die Fundstelle einer Range-Variablen zu, damit kannst du prüfen, ob der Wert vorhanden ist und hast auch gleich die Zelle zum Weiterarbeiten.
also statt:

For Wiederholungen = 8 To 4000
'Abfrage: Wenn Kombinationsfeld leer dann zur Sprungmarke "Ende" springen
If Cells(Wiederholungen, 11) = "" Then GoTo Ende
'Abfrage: Wenn Inhalt der angesprochenen Zelle gleich dem Inhalt der
'Variablen "Auswahl", dann...
If Cells(Wiederholungen, 11) = Auswahl Then
'Zelle markieren,
Cells(Wiederholungen, 1).Select
'Fenster an die entsprechende Position scrollen
ActiveWindow.ScrollColumn = ActiveWindow.ActiveCell.Column
ActiveWindow.ScrollRow = ActiveWindow.ActiveCell.Row
'Kombinationsfeld zur weiteren Eingabe wieder aktivieren
ComboBox2.Activate
'Abfrage Ende
End If
'Nächsten Schleifendurchlauf starten
Next
das hier

dim rngFundstelle as range
set rngFundstelle = Columns(11).Find(what:=Auswahl, lookin:=xlvalues, lookat:=xlwhole)
if not rngFunstelle is nothing then
Fundstelle.Offset(0, -10).select
ActiveSheet.ScrollRow = Fundstelle.Row
ActiveSheet.ScrollColumn = 1
end if
auch ansonsten ist das ganze nicht besonders gut programmiert.
- Variablendeklaration mitten im Code
- willkürlichs On Error Resume Next
- Wechselweise verwendung von CodeNamen und Indexnamen bei der Ansprache des Tabellenblatts.
- Sprungmarken in den IF-Blöcken, obwohl IF THEN ELSE eigentlich bekannst sein müsste.
da gibts noch viel zu tun.
Anzeige
AW: Code Ausführung sehr langsam
28.06.2021 21:24:56
Philipp
Hallo Daniel,
war als Neuling im Programmierung mit VBA stolz auf meine zusammengebastelten Code. Dank eurer Anregungen und Tipps ist mir sehr deutlich geworden, dass es in diesem aber sehr viel zu optimieren gibt. Werde versuchen die Tipps umzusetzen. Vielen Dank für den Code als Alternative zur For / Next Schleife! Werde ein Feedback geben und bei evtl. weiteren Fragen eine anonymisierte Arbeitsmappe hochladen. Nochmals vielen Dank. Es macht Spaß jeden Tag etwas dazu zu lernen.
Warum noch offen?
02.07.2021 14:11:36
Yal
Hallo Philipp,
ich schlage vor, dass Du die nächste auftauchende Frage als neue Thread postet.
Ich bin froh, dass Du die "Korrekturen" der Gemeinschaft als gut gemeint verstehst. Der Unterton "wie kann man nur" könnte manche Newbies erschrecken (ich gehöre auch zu den Übeltäter ;-)
Nur eine Ergänzung zu der -richtigen- Vorschlag von Daniel:
"die For-Next-Schleife über alle Zellen ist langsam. arbeite hier besser mit .FIND"
Der Fokus liegt auf dem "hier": ein Vorgang über alle Elemente um nur das eine zu finden, ist mit FIND schneller. Ein Vorgang, der aber jede einzelne Zelle in der Hand nehmen muss (weil darauf etwas gemacht wird), ist natürlich mit FOR besser bedient.
VG
Yal
Anzeige
AW: Warum noch offen?
05.07.2021 15:22:08
Philipp
Hallo Yal,
vielen Dank auch an dich zu deiner Ergänzung. Habe mittlerweile auf die Find Methode umgestellt. Tabelle läuft leider noch nicht schneller. Mittlerweile glaube ich, dass der Grund dafür nicht an vba-Code liegt. Den selbst wenn ich alles auskommentiere bleibt die Tabelle langsam.

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige