Discussion:
Makro ausführen?
(zu alt für eine Antwort)
Peter Schuerer
2014-07-08 06:22:29 UTC
Permalink
Hallo Claus und Hallo Zusammen,

beim verlassen einer Tabelle möchte ich folgendes Makro ausführen:

Private Sub Worksheet_Deactivate()
'Code Stillstand wird in Spalte AA aktualisiert

Dim rngC As Range

rngC = [Tabelle16].Range("Y3")

If Range("Y1").Value = Range("AA1").Value Then
Exit Sub
End If

Application.ScreenUpdating = False

rngC.Activate
For i = 1 To 6000
If ActiveCell.Value <> "x" Then
Selection.Offset(0, 2).Value = Left(ActiveCell.Value, 2)
End If
ActiveCell.Offset(1, 0).Activate

If ActiveCell.Value = 0 Then
Exit Sub
End If

Next i
End Sub

Starte ich das Makro als Modul, wird es normal ausgeführt und funktioniert.
Beim verlassen der Tabelle funktioniert es nicht und es kommt bei:
rngC = [Tabelle16].Range("Y3")
eine Fehlermeldung.
Hoffe auf Hilfe.

Danke und Gruß
Peter
Claus Busch
2014-07-08 06:53:35 UTC
Permalink
Hallo Peter,

Am Tue, 08 Jul 2014 08:22:29 +0200 schrieb Peter Schuerer:

da sind einige Dinge zu verbessern und es sind zwei Fehler drin.
Post by Peter Schuerer
rngC = [Tabelle16].Range("Y3")
Ein Range ist ein Objekt und muss mit Set initialisiert werden:
Set rngC = ...
Post by Peter Schuerer
rngC.Activate
For i = 1 To 6000
If ActiveCell.Value <> "x" Then
Selection.Offset(0, 2).Value = Left(ActiveCell.Value, 2)
End If
ActiveCell.Offset(1, 0).Activate
Hier würde ich nicht alle Zeilen aktivieren, das verlangsamt die
Ausführung. Du kannst direkt referenzieren ohne zu aktivieren
Das Bildschirmflackern hast du mit Application.ScreenUpdating = False
abgeschaltet, hast es am Ende aber nicht mehr eingeschaltet.

Dann ist mir unklar, warum in der Schleife nach Wert 0 gesucht wird. Du
kannst doch die letzte Zeile erfassen und dann den Code bis dorthin
laufen lassen:

Private Sub Worksheet_Deactivate()
'Code Stillstand wird in Spalte AA aktualisiert

Dim i As Long
Dim LRow As Long

If Range("Y1").Value = Range("AA1").Value Then
Exit Sub
End If

Application.ScreenUpdating = False

LRow = Cells(Rows.Count, "Y").End(xlUp).Row

For i = 3 To LRow
If Cells(i, "Y") <> "x" Then
Cells(i, "Y").Offset(0, 2).Value = Left(Cells(i, "Y"), 2)
End If
Next i

Application.ScreenUpdating = True
End Sub



Mit freundlichen Grüßen
Claus
--
Vista Ultimate / Windows7
Office 2007 Ultimate / 2010 Professional
Peter Schuerer
2014-07-08 15:03:03 UTC
Permalink
Hallo Claus,
Post by Claus Busch
Du kannst direkt referenzieren ohne zu aktivieren
Das Bildschirmflackern hast du mit Application.ScreenUpdating = False
abgeschaltet, hast es am Ende aber nicht mehr eingeschaltet.
funktioniert, wie immer, bestens.
Das referenzieren muss ich wohl noch üben.

Danke und Gruß
Peter
Jörg Eisenträger
2014-07-08 18:53:17 UTC
Permalink
Post by Claus Busch
Das Bildschirmflackern hast du mit Application.ScreenUpdating = False
abgeschaltet, hast es am Ende aber nicht mehr eingeschaltet.
Hallo Claus,
das ist mir unklar. Früher hatte ich am Ende eines Makros das
ScreenUpdating auch immer wieder eingeschaltet. Habe dann aber
festgestellt, dass es nach Beendigung eines Makros keinen Unterschied
macht, ob ich es explizit wieder einschalte oder nicht.

Warum also sollte ich es am Ende einschalten?

Gruß
Jörg
--
"One of the best ways to boost your Excel efficiency is also one of the best ways to shoot yourself in the foot."
(Susan Harkins auf www.techrepublic.com/blog/10things/10-mistakes-to-avoid-when-working-with-multiple-worksheets/1961 )
Claus Busch
2014-07-08 19:00:08 UTC
Permalink
Hallo Jörg,
Post by Jörg Eisenträger
Warum also sollte ich es am Ende einschalten?
es ist einfach zur Sicherheit und andere Dinge wie z.B. EnableEvents
brauchen es definitiv und da ist es besser man gewöhnt es sich an.
Wenn das Makro durchgelaufen ist, sind auch alle Objekte Nothing.
Trotzdem gibt es immer wieder Experten, die sagen, dass man vor dem Ende
alle Objekte im Code auf Nothing setzen soll.
Ich habe es mir einfach angewöhnt, alles was ich am Anfang abschalte, am
Ende auch wieder einzuschalten. Meist füge ich das Einschalten in eine
Fehlerbehandlung ein, damit gerade z.B. EnableEvents nicht auf False
stehen bleibt, wenn das Makro in einen Fehler läuft.


Mit freundlichen Grüßen
Claus
--
Vista Ultimate / Windows7
Office 2007 Ultimate / 2010 Professional
Lesen Sie weiter auf narkive:
Loading...