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

Worksheet Change Fehler im Code?

Worksheet Change Fehler im Code?
Matthias
Hallo,
ich habe ein Problem mit einem Makro.
Ich habe in Spalte A Artikelnummer, die eigentlich alle 12 stellig sein müssten. Nun möchte ich alle die kürzer oder länger als 12 Stellen haben löschen. Ich füge in Spalte A einige tausend Nummern ein. dann löscht mir das Makro die komplette Spalte A. Schreibe ich die Nummern mit der Hand rein funzt es...
Warum?!? Hier mein Makro:
Option Explicit
Sub Worksheet_Change(ByVal Target As Range)
Dim Zelle As Range
On Error Resume Next
Application.EnableEvents = False
If Not Intersect(Target, Columns(1)) Is Nothing Then
For Each Zelle In Intersect(Target, Columns(1)).Cells
Next Zelle
If Len(Target)  12 Then
Target = ""
End If
End If
Application.EnableEvents = True
End Sub

AW: Worksheet Change Fehler im Code?
13.08.2010 17:20:33
Ramses
Hallo
Das ist nicht gut. Das sollte ein externes Makro sein, das bei Bedarf gestartet werden kann.
Kopiere den nachstehenden code in ein Modul deiner Mappe, dann kannst du das Makro über "Makro - Ausführen" starten.
Sub Clean_Numbers()
Dim i as Long
For i = 1 to Cells(Rows.count,1).end(xlup).Row
With Cells(i,1)
if Len(.Value)  12 then .Value = ""
End With
Next i
End Sub
Gruss Rainer
AW: Worksheet Change Fehler im Code?
13.08.2010 19:14:16
Matthias
Hallo Rainer,
DANKE! Kannst du mir erklären warum das nicht gut ist? Ich bin was Makros betrifft noch sehr lernbedürftig und will versuchen meine Fehler zu verstehen...
Gruß
Matthias
Anzeige
AW: Worksheet Change Fehler im Code?
13.08.2010 21:36:50
Ramses
Hallo
Das ist nicht gut, weil dein Makro bei jeder Änderung einer Zelle ausgeführt wird.
Das kostet enorm viel Zeit.
Gruss Rainer
AW: Worksheet Change Fehler im Code?
14.08.2010 07:18:39
Matthias
Hallo Rainer,
ok das ist natürlich logisch. Eine Frage noch wenn ich dein Makro ausführ funktioniert dann mein nachfolgender Befehl nicht....
Range("A4:A65000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
AW: Worksheet Change Fehler im Code?
14.08.2010 12:23:22
Ramses
Hallo
Nicht nachvollziehbar.
Warum meinst du dass der Befehl nicht funktioniert ?
Gruss Rainer
AW: Worksheet Change Fehler im Code?
15.08.2010 00:16:08
mpb
Hallo Matthias,
Du hast die Zellen, deren Länge ungleich 12 war, mit einem Leerstring belegt. Daher können mit SpecialCells(xlCellTypeBlanks) keine leeren Zellen gefunden werden.
Nehme statt
=""
.ClearContents
dann sollte es gehen.
Noch ein Hinweis zu Deinem als erstes geposteten Code. Der Fehler war, dass die "Next"-Zeile falsch platziert ist, sie muss nach dem ersten "End If" kommen.
Gruß
Martin
Anzeige
AW: Worksheet Change Fehler im Code?
15.08.2010 18:18:36
Matthias
Hallo Martin,
super!
Wieder was gelernt :D
Gruß Matthias
Worksheet_Change ohne Fehler
13.08.2010 19:58:00
Erich
Hi Matthias,
so sollte es aber auch gehen:

Sub Worksheet_Change(ByVal Target As Range)
Dim rngZ As Range
If Not Intersect(Target, Columns(1)) Is Nothing Then
Application.EnableEvents = False
For Each rngZ In Intersect(Target, Columns(1)).Cells
If Not IsError(rngZ) Then
If Len(rngZ)  12 Then rngZ.ClearContents
Next rngZ
Application.EnableEvents = True
End If
End Sub
Zelle habe ich durch rngZ ersetzt, weil ZELLE der Name einer Excelfkt. ist.
"On Error Resume Next" wird nicht gebraucht, sollte da nicht stehen.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
sorry, war mit Fehler!
13.08.2010 20:01:25
Erich
Hi Matthias,
da fehlte ein "End If". Hier noch mal der Code:

Sub Worksheet_Change(ByVal Target As Range)
Dim rngZ As Range
If Not Intersect(Target, Columns(1)) Is Nothing Then
Application.EnableEvents = False
For Each rngZ In Intersect(Target, Columns(1)).Cells
If Not IsError(rngZ) Then
If Len(rngZ)  12 Then rngZ.ClearContents
End If
Next rngZ
Application.EnableEvents = True
End If
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: sorry, war mit Fehler!
14.08.2010 07:29:48
Matthias
Danke, aber irgendwie verläuft sich Excel dann in der Schleife...
Gruß Matthias
AW: sorry, war mit Fehler!
14.08.2010 07:31:18
Matthias
Danke, aber igrendwie verläuft sich Ecxel dann in der Schleife....
Gruß Matthias
Anzeige
Was meinst du damit?
14.08.2010 08:25:08
Erich
Hi Matthias,
kopierst du einen sehr großen Bereich - etwa eine ganze Spalte - auf Spalte A?
Was passiert, wenn sich Excel "verläuft"? Reagiert das Programm nicht mehr?
Oder dauert das dann nur sehr lange?
Bei mir funzt das Makro einwandfrei, auch wenn ich eine ganze Spalte kopiere.
Schneller geht das hiermit:

Sub Worksheet_Change(ByVal Target As Range)
Dim rngB As Range, rngZ As Range
Dim myCalc As XlCalculation
Set rngB = Intersect(Target, UsedRange, Columns(1))
If Not rngB Is Nothing Then
Application.EnableEvents = False
myCalc = Application.Calculation
Application.Calculation = xlCalculationManual
For Each rngZ In rngB.Cells
If Not IsError(rngZ) Then
If Len(rngZ)  12 Then rngZ.ClearContents
End If
Next rngZ
Application.Calculation = myCalc
Application.EnableEvents = True
End If
End Sub
Noch eine Bemerkung zu Rainers Antwort
"Das ist nicht gut, weil dein Makro bei jeder Änderung einer Zelle ausgeführt wird. Das kostet enorm viel Zeit."
Gilt das nicht immer bei Worksheet_Change()? Sollte man dieses Ereignis dann besser nie auswerten?
Es kann doch geradezu gewollt sein, dass das Makro bei jeder Eingabe läuft,
dass es den Zweck hat, falsche Werte in einem Bereich von vornherein zu verhindern?
Ein Löschmakro zu Fuß anzusteuern, kann man vergessen...
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Was meinst du damit?
14.08.2010 12:16:03
Ramses
Hallo
"...Es kann doch geradezu gewollt sein, dass das Makro bei jeder Eingabe läuft,..."
Es macht wohl keinen Sinn, wenn die Daten einmal bereinigt worden sind, dies bei jeder Eingabe erneut zu prüfen.
Das hat mit vergessen nichts zu tun, ausserdem ist die Eingabe einfacher mit "Gültigkeit" zu lösen
Gruss Rainer
Bin anderer Meinung
14.08.2010 12:54:09
Erich
Hi Rainer,
sorry, aber das sehe ich anders.
Meinst du mit "wenn die Daten einmal bereinigt worden sind" die Daten in Spalte A?
Die werden geändert. Und die Änderungen sollen doch geprüft werden.
Soll nicht bei jedem neuen Wert in Spalte A sichergestellt werden, dass er zulässig ist?
Bei manueller Eingabe ist das einfacher mit "Gültigkeit" zu lösen - das sehe ich auch so.
Aber Matthias wollte die Prüfung auch haben, wenn Daten in Spalte A kopiert werden. Dann versagt "Gültigkeit".
Mit meinem Ereignismakro wird jeder neue Wert in Spalte A genau 1 mal geprüft - direkt bei der Änderung.
Was daran wäre ineffektiv oder unnötig?
Wozu sonst sollte man Worksheet_Change() einsetzen?
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
Hab ich erwartet...
14.08.2010 14:33:50
Ramses
Hallo
... tut aber nichts zur Sache dass dieses Change-Makro völlig überflüssig ist.
For Each rngZ In rngB.Cells
Was bitte ist daran einmalig geprüft ?
Ganz abgesehen voim allgemeinen aus und einschalten der Berechnung und dem einschalten (was wiederum Zeit kostet wenn die ganze Tabelle nochmals berechnet wird)
Wenn die Daten einmal bereinigt sind, ist das Makro hinfällig und der Rest über Gültigkeit zu lösen.
Du kannst das Makro irgendwann nochmals aufrufen wenn du meinst nochmal bereinigen zu müssen.
Aber grundsätzlich:
Völlig unnötig.
Gruss Rainer
Anzeige
Reden wir aneinander vorbei?
14.08.2010 15:55:15
Erich
Hi Rainer, :-)
zu
"For Each rngZ In rngB.Cells - Was bitte ist daran einmalig geprüft?":
Einmalig wird hier jede neue Eingabe geprüft - was ja auch sein soll.
Sicher - da steht "For Each". Aber die Schleife läuft doch nur über
rngB = Intersect(Target, UsedRange, Columns(1))
Und das sind genau die neuen Eingaben, also: Nix mit mehrmalig.
"Wenn die Daten einmal bereinigt sind, ist das Makro hinfällig und der Rest über Gültigkeit zu lösen."
Noch einmal: Mein Makro bereinigt keine bestehenden Daten. Es bereinigt nur neu eingetragene Werte,
auch wenn sie per Kopie in Spalte A kommen.
Und auch noch einmal:
Wenn Daten in Spalte A kopiert werden, versagt "Gültigkeit". Stimmt das denn nicht?
(Wenn Zellen, nicht nur Werte, in Spalte A kopiert werden,
verschwindet dabei leicht die Gültigkeitsprüfung in den Zielzellen...)
Zum Aus- und Einschalten der Berechnung:
Das ist sicher nicht angesagt, wenn Target nur aus einer oder wenigen Zellen besteht.
Ich hatte das hereingenommen für den Fall, dass Matthias einen sehr großen Bereich - etwa eine ganze Spalte -
auf Spalte A kopiert. Dann dürfte das Ausschalten beschleunigen.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
Nein...
14.08.2010 23:57:27
Ramses
Hallo
"...rngB = Intersect(Target, UsedRange, Columns(1))..."
Dann ist UsedRange aber überflüssig
"...Noch einmal: Mein Makro bereinigt keine bestehenden Daten...."
Die Frage lautete:
"...Ich habe in Spalte A Artikelnummer, die eigentlich alle 12 stellig sein müssten. Nun möchte ich alle die kürzer oder länger als 12 Stellen haben löschen.
Lassen wir es dabei, es führt zu nichts.
Gruss Rainer
Nein...
14.08.2010 23:58:15
Ramses
Hallo
"...rngB = Intersect(Target, UsedRange, Columns(1))..."
Dann ist UsedRange aber überflüssig
"...Noch einmal: Mein Makro bereinigt keine bestehenden Daten...."
Die Frage lautete:
"...Ich habe in Spalte A Artikelnummer, die eigentlich alle 12 stellig sein müssten. Nun möchte ich alle die kürzer oder länger als 12 Stellen haben löschen.
Lassen wir es dabei, es führt zu nichts.
Gruss Rainer
Anzeige
Zwei Vorschläge
16.08.2010 10:58:12
Erich
Hi Rainer, :-)
erster Vorschlag, zu "Dann ist UsedRange aber überflüssig":
Das könntest du einfach ausprobieren in dieser Mappe: https://www.herber.de/bbs/user/71078.xls
Der zweite Vorschlag findet sind in dieser Mappe: https://www.herber.de/bbs/user/71079.xls
Hier habe ich deine und meine Auffassung zusammengeführt.
Die erste Teil der Frage lautete:
"Ich habe in Spalte A Artikelnummer, die eigentlich alle 12 stellig sein müssten.
Nun möchte ich alle die kürzer oder länger als 12 Stellen haben löschen."
Auf diesen Teil hast du dein Augenmerk gerichtet, dazu hast du das Makro Clean_Numbers() gepostet.
Im zweiten Teil der Frage steht:
"Ich füge in Spalte A einige tausend Nummern ein. dann löscht mir das Makro die komplette Spalte A.
Schreibe ich die Nummern mit der Hand rein funzt es..."
Und damit hatte ich mich beschäftigt - mit Worksheet_Change().
Bezüglich "Gültigkeit" sind wir uns mittlerweile wohl einig?
Und das mit "einmalig" ist jetzt auch ok?
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Nachsatz
16.08.2010 11:10:50
Erich
Hi Rainer,
der Test mit meinem ersten Vorschlag fällt beeindruckend aus, wenn du in den beiden Tabellen
jeweils die komplette Spalte B aus Spalte A kopierst.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

286 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige