Fehlerhafter Code

Moin,
Ich habe olgenden Code um eine Tabelle zu aktualisieren, wenn eine Zeile in ihr gelöscht wird(Tabelle geht von A-E und von 38 bis max 1038):
Herausfinden, wo die leere(gelöschte) Zeile ist:

n = 0
Do Until Cells(38 + n, 2) = „“ Or n = 1000
n = n + 1
Loop

Herausfinden, wo die Tabelle endet.

m = 0
Do Until Cells(38 + n + 1 + m, 2) = „“ Or m = 1000
m = m + 1
Loop

Reihe für Reihe kopieren, einfügen und löschen.

o = 0
If m = 1 Then m = 2
Do Until o = m - 1
Range(Cells(38 + n + 1 + o, 1), Cells(38 + n + 1 + o, :5)).Copy
Range(Cells(38 + n + o, 1), Cells(38 + n + o, :5)).PasteSpecial
Range(Cells(38 + n + 1 + o, 1), Cells(38 + n + 1 + o, :5)).Delete
Cells(38 + n + o, 1) = o + n
o = o + 1
Loop

Das funktioniert so lange, wie unter dem gelöschten Eintrag noch min 2 beschriebene Reihe sind. Wenn dort nur noch eine ist, dann wird diese kopiert und er geht bis zur vorletzten Reihe alle Reihen durch kopiert sie und fügt sie ein und löscht sie. So war das nicht geplannt und außerdem dauert das immer eine halbe Ewigkeit bis er die 65000 Reihen durchgekaut hat.

  1. Was ist daran falsch?
  2. Geht das nicht irgendwie wesentlich einfacher?
    z.B. Man kopiert einfach die ganze darunter liegende Tabelle und verschiebt sie eine Reihe nach oben?

Gruß
GURKE

Ich habe olgenden Code um eine Tabelle zu aktualisieren, wenn
eine Zeile in ihr gelöscht wird(Tabelle geht von A-E und von
38 bis max 1038):

Moin Gurke,

wenn du eine Zeile löschst hast du das Problem nicht. Du hast den Zellinhalt der Zeile gelöscht *annehm*

Sub tt()
Dim Zei As Long
On Error GoTo Ende
Application.ScreenUpdating = False
For Zei = 38 To 1038
 If Cells(Zei, 2) = "" Then
 Rows(Zei).Delete
 Exit For
 End If
Next Zei
Ende:
Application.ScreenUpdating = True
End Sub

Gruß
Reinhard

Moin Reinhard,

Ich habe olgenden Code um eine Tabelle zu aktualisieren, wenn
eine Zeile in ihr gelöscht wird(Tabelle geht von A-E und von
38 bis max 1038):

Moin Gurke,

wenn du eine Zeile löschst hast du das Problem nicht. Du hast
den Zellinhalt der Zeile gelöscht *annehm*

Stimmt, dadurch konnte ich das auch noch verkürzen, da ich die Zeile erst gar nicht löschen muss. Ich hatte das relativ kompliziert gemacht, konnte den Löschen-sub mit deinem Sub zusammenfügen.

Sub tt()
Dim Zei As Long
On Error GoTo Ende
Application.ScreenUpdating = False
For Zei = 38 To 1038
If Cells(Zei, 2) = „“ Then
Rows(Zei).Delete
Exit For
End If
Next Zei
Ende:
Application.ScreenUpdating = True
End Sub

Aber eine Frage noch:

On Error GoTo Ende

Stoppt er dann, wenn er ein Fehler hat?

Und wofür ist die?

Application.ScreenUpdating = False

Ansonsten danke, ging einwandfrei!

Gruß
Reinhard

Gruß
GURKE

Hallo Gurke,

Aber eine Frage noch:

On Error GoTo Ende

Stoppt er dann, wenn er ein Fehler hat?

nein, grad nicht. Durch die Anweisung wird nicht gestoppt sondern der Code hüpft dann in die Fehlerbehandlungsroutine, die ich hier „Ende“ benannte.
Dort kann man dann den Fehler auswerten. das habe ich hier nicht getan.
Durch die On Error Goto Ende wird dafür gesorgt daß die nachfolgende Anweisung (nach Ende:smile:
Application.Schreenupdating=True
auf jeden Fall, also auch im Fehlerfall, ausgeführt wird.

Und wofür ist die?

Application.ScreenUpdating = False

Sie bestimmt ob der Bildschirm aktualisiert wird. Das verlangsamt den Code, deshalb wird die Aktualisierung anfangs eines Codes auf False gestzt, am Ende dann wieder auf True.

Gruß
Reinhard

Moin Reinhard,

nein, grad nicht. Durch die Anweisung wird nicht gestoppt
sondern der Code hüpft dann in die Fehlerbehandlungsroutine,
die ich hier „Ende“ benannte.
Dort kann man dann den Fehler auswerten. das habe ich hier
nicht getan.
Durch die On Error Goto Ende wird dafür gesorgt daß die
nachfolgende Anweisung (nach Ende:smile:
Application.Schreenupdating=True
auf jeden Fall, also auch im Fehlerfall, ausgeführt wird.

Okay danke! Verstanden :wink:

Und wofür ist die?

Application.ScreenUpdating = False

Sie bestimmt ob der Bildschirm aktualisiert wird. Das
verlangsamt den Code, deshalb wird die Aktualisierung anfangs
eines Codes auf False gestzt, am Ende dann wieder auf True.

Ah okay gut zu wissen :wink:

Gruß
Reinhard

Gruß
GURKE