Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

target.offset = "" für mehrere Zellen?

Forumthread: target.offset = "" für mehrere Zellen?

target.offset = "" für mehrere Zellen?
24.09.2021 17:17:51
ObiWanPaps
In einer Erfassungsdatei verwende ich die Worksheet_Change(ByVal Target As Range) Funktion.
Allerdings braucht das Makro stellenweise mega lange bis es fertig ist und der Anwender weitermachen kann.
Vorne weg allgemeine Fragen.
1. Sollte man bei jeder Anweisung, die Zellinhaltänderung mit sich bringt Application.EnableEvents = False vor und Application.EnableEvents = true nach der Änderung angeben?
2. Sollte man zusätzlich jedes mal auch Application.ScreenUpdating = False bzw. true verwenden?
3. Wie kann ich mehrere Zellinhalte mit einem Befehl löschen? Geht das überhaupt? Aktuell habe ich mehrere Target.Offset(0, ...).Value = "" hintereinander. Siehe Code in fett.
4. Zellinhalt löschen eher mit dem Befehl empty oder mit "" ?
5. Zellfarbenänderung benötigt kein Application.EnableEvents = False bzw. true?
Kann mir hier bitte jemand auf die Sprünge helfen?
An sich ist die Worksheet_change Geschichte eine tolle Sache, aber aktuell hat nach Überarbeitung meiner Datei sich die Laufzeit/Reaktion des Makros mega verschllechtert.
Code:

If Target.Column = 11 Then    'Fzg.-Art   WKZ
'Stop
If Target.Value = Empty Then
Target.Offset(0, 0).Interior.ColorIndex = 3
End If
If Target.Value = "704" _
And Target.Offset(0, -2).Value  "A" Then
Application.EnableEvents = False
Target.Offset(0, -2).Value = "A"   'Alternative rot markieren
Application.EnableEvents = True
End If
If Target.Value  Empty Then
Application.ScreenUpdating = False
Application.EnableEvents = False
Target.Offset(0, 6).Value = ""
Target.Offset(0, 7).Value = ""
Target.Offset(0, 8).Value = ""
Target.Offset(0, 10).Value = ""
Target.Offset(0, 11).Value = ""
Target.Offset(0, 12).Value = ""
Application.EnableEvents = True
End If
If Target.Value = "401" _
Or Target.Value = "411" Then
Application.EnableEvents = False
Target.Offset(0, 6).Value = "9999"
Target.Offset(0, 6).Interior.ColorIndex = 37
Application.EnableEvents = True
End If
If Target.Value = "551 S" Then
Application.EnableEvents = False
Target.Offset(0, 10).Value = ""
Target.Offset(0, 10).Interior.ColorIndex = 3
Application.EnableEvents = True
Else
Application.EnableEvents = False
Target.Offset(0, 10).Value = ""
Target.Offset(0, 10).Interior.ColorIndex = 37
Application.EnableEvents = True
End If
Application.EnableEvents = False
Target.Offset(0, 11).Value = ""
Target.Offset(0, 11).Interior.ColorIndex = 37
Target.Offset(0, 12).Value = ""
Target.Offset(0, 12).Interior.ColorIndex = 37
Application.EnableEvents = True
Application.EnableEvents = False
                   Target.Offset(0, 15).Value = ""
Target.Offset(0, 16).Value = ""
Target.Offset(0, 17).Value = ""
Target.Offset(0, 18).Value = ""
Target.Offset(0, 19).Value = ""
Target.Offset(0, 20).Value = ""
Target.Offset(0, 21).Value = ""
Target.Offset(0, 22).Value = ""
Target.Offset(0, 23).Value = ""
Target.Offset(0, 24).Value = ""
Target.Offset(0, 25).Value = ""
Target.Offset(0, 26).Value = ""
Target.Offset(0, 27).Value = ""
Target.Offset(0, 28).Value = ""
Target.Offset(0, 29).Value = ""
Target.Offset(0, 30).Value = ""
Target.Offset(0, 31).Value = ""
Target.Offset(0, 32).Value = ""
Target.Offset(0, 33).Value = ""
Target.Offset(0, 34).Value = ""
Target.Offset(0, 35).Value = ""
Target.Offset(0, 38).Value = ""
Target.Offset(0, 39).Value = ""
Application.EnableEvents = True
Target.Offset(0, 15).Interior.ColorIndex = 37
Target.Offset(0, 16).Interior.ColorIndex = 37
Target.Offset(0, 17).Interior.ColorIndex = 37
Target.Offset(0, 18).Interior.ColorIndex = 37
Target.Offset(0, 19).Interior.ColorIndex = 37
Target.Offset(0, 20).Interior.ColorIndex = 37
Target.Offset(0, 21).Interior.ColorIndex = 3
Target.Offset(0, 22).Interior.ColorIndex = 37
Target.Offset(0, 23).Interior.ColorIndex = 37
Target.Offset(0, 24).Interior.ColorIndex = 37
Target.Offset(0, 25).Interior.ColorIndex = 37
Target.Offset(0, 26).Interior.ColorIndex = 37
Target.Offset(0, 27).Interior.ColorIndex = 37
Target.Offset(0, 28).Interior.ColorIndex = 37
Target.Offset(0, 29).Interior.ColorIndex = 37
Target.Offset(0, 30).Interior.ColorIndex = 37
Target.Offset(0, 31).Interior.ColorIndex = 37
Target.Offset(0, 32).Interior.ColorIndex = 37
Target.Offset(0, 33).Interior.ColorIndex = 37
Target.Offset(0, 34).Interior.ColorIndex = 37
Target.Offset(0, 35).Interior.ColorIndex = 37
'                    Application.EnableEvents = True
End If
Call Ausstieg
Exit Sub
End If
'*                         Spalte 11   WKZ    ENDE
'*******************************************************************************
Anzeige

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: target.offset = "" für mehrere Zellen?
24.09.2021 17:24:06
Hajo_Zi
zu 1 ja
Range(Target.Offset(0, 6), Target.Offset(0, 12)).clearcontents
GrußformelHomepage
In diesem Forum bekomme ich kein Mailbenachrichtigung, weitere Antworten sind zufällig.
Anzeige
AW: target.offset = "" für mehrere Zellen?
24.09.2021 18:21:00
Stefan
Hallo Hajo.
vielen Dank für den Befehl und die Antwort zu 1.
Könntest Du mir auch etwas zu 2 und 4 sagen?
2. Sollte man zusätzlich jedes mal auch Application.ScreenUpdating = False bzw. true verwenden?
4. Zellinhalt löschen eher mit dem Befehl empty oder mit "" ? Oder egal?
Danke und Grüße Stefan
Anzeige
AW: target.offset = "" für mehrere Zellen?
24.09.2021 18:38:50
Hajo_Zi
ich bin dann raus, da meine Beitrag nicht komplett gelesen wurde.
Das wird schon seinen Grund haben.
Ich schreibe nicht für den Papierkorn. Ich bin dann raus.
Viel Erfolg noch.
Gruß Hajo
;
Anzeige
Anzeige

Infobox / Tutorial

target.offset in VBA: Effiziente Nutzung für mehrere Zellen


Schritt-für-Schritt-Anleitung

Um mehrere Zellinhalte in einem Excel VBA-Makro mit Target.Offset zu löschen, kannst du den folgenden Ansatz verwenden. Dieser Code hilft dir, die Effizienz deines Makros zu verbessern, indem du mehrere Zellen mit einem Befehl leerst.

  1. Aktiviere die Ereignisse: Stelle sicher, dass du Application.EnableEvents entsprechend setzt, um unerwünschte Rekursion zu vermeiden.
  2. Verwende Range und ClearContents: Anstelle von mehreren Target.Offset-Befehlen kannst du den Bereich festlegen, den du leeren möchtest.

Hier ist ein Beispielcode:

If Target.Column = 11 Then
    If Not IsEmpty(Target) Then
        Application.EnableEvents = False
        ' Leere die Zellen von Offset(0, 6) bis Offset(0, 12)
        Range(Target.Offset(0, 6), Target.Offset(0, 12)).ClearContents
        Application.EnableEvents = True
    End If
End If

Häufige Fehler und Lösungen

  1. Fehlerhafte Verwendung von Application.EnableEvents: Stelle sicher, dass du Application.EnableEvents = True am Ende deines Codes setzt, um zu verhindern, dass Excel die Ereignisse blockiert.

  2. Zu viele Target.Offset-Befehle: Vermeide es, mehrere Target.Offset-Befehle hintereinander zu verwenden, da dies die Ausführung deines Makros verlangsamen kann. Nutze stattdessen einen Bereich mit Range.

  3. Zellinhalt nicht gelöscht: Wenn du versuchst, Zellinhalte mit Empty zu löschen, stelle sicher, dass du die richtige Methode verwendest. ClearContents ist in den meisten Fällen effektiver.


Alternative Methoden

Wenn du nach alternativen Ansätzen suchst, um Inhalte effizient zu löschen, könntest du Folgendes in Betracht ziehen:

  • Array-Methoden: Du kannst die Werte in einem Array speichern und dann gleichzeitig mehrere Zellen aktualisieren.
  • VBA-Formeln: Anstatt VBA zu verwenden, kannst du auch Excel-Formeln nutzen, um die Zellinhalte zu verwalten.

Hier ist ein Beispiel für die Verwendung eines Arrays:

Dim values(1 To 8) As Variant
values(1) = "" ' Wert für Offset(0, 6)
values(2) = "" ' Wert für Offset(0, 7)
' ... und so weiter
' Setze die Werte in einem Schritt
Target.Offset(0, 6).Resize(1, 8).Value = values

Praktische Beispiele

In diesem Abschnitt findest du einige nützliche Beispiele für die Verwendung von target.offset vba in deinem Makro:

  1. Farben ändern und Inhalte löschen:
If Target.Value = "704" Then
    Application.EnableEvents = False
    Target.Offset(0, 6).Value = "9999"
    Target.Offset(0, 6).Interior.ColorIndex = 37
    ' Leere benachbarte Zellen
    Range(Target.Offset(0, 7), Target.Offset(0, 12)).ClearContents
    Application.EnableEvents = True
End If
  1. Konditionale Formatierung:
If Target.Value = "551 S" Then
    Target.Offset(0, 10).Interior.ColorIndex = 3
End If

Tipps für Profis

  • Verwende With...End With, um den Code leserlicher zu gestalten und die Ausführung zu beschleunigen.
  • Überprüfe die Performance deines Codes regelmäßig, insbesondere bei großen Datenmengen.
  • Nutze Option Explicit, um sicherzustellen, dass alle Variablen deklariert sind und um mögliche Fehlerquellen zu minimieren.

FAQ: Häufige Fragen

1. Sollte ich immer Application.ScreenUpdating = False verwenden?
Ja, dies kann die Ausführungsgeschwindigkeit deines Makros erheblich verbessern, insbesondere wenn viele Zellen bearbeitet werden.

2. Ist es besser, Zellinhalte mit ClearContents oder "" zu löschen?
ClearContents ist der empfohlene Weg, da es die Zellen wirklich leert, während "" nur den Inhalt ersetzt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige