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
Zellenwerte prüfen
05.07.2021 10:52:39
Chris
Hallo VBAler,
ich möchte prüfen, ob die Zellenwerte aus der aktiven Zelle in Spalte B bereits in selbiger Spalte vorhanden sind. Geprüft werden soll ab B11, die erste Eingabe erfolgt ab B10.
Falls der Wert der aktiven Zelle in Spalte B nicht gefunden wird, soll nichts passieren, falls doch sollen alle Inhalte von 5 Zellen neben dem gefundenen Werte in die aktiven Reihe kopiert werden und die 3. Zelle von rechts von der aktiven selektiert werden.
Das Makro funktioniert soweit, jedoch wird immer die 3. Zelle aktiviert, auch wenn der Wert in Spalte B nicht existiert. Weiß jmd. wo der Fehler liegt?
Gruß
Chris
Dim Zelle2 As Range
Dim SearchArea As Long
Dim lngzelle3 As Long
SearchArea = ActiveSheet.Range("B:B").Find(What:="*", LookIn:=xlValues, Lookat:=xlWhole, _
searchorder:=xlByRows, SearchDirection:=xlPrevious).Row - 1 'Suchbereich = AktiveZelle -1
lngzelle3 = ActiveSheet.Range("B:B").Find(What:="*", LookIn:=xlValues, Lookat:=xlWhole, _
searchorder:=xlByRows, SearchDirection:=xlPrevious).Row - 1
'WSChange-Anwendung bis jeweils akive Zelle
If Not Intersect(Target, Range("B11:B" & lngzelle3)) Is Nothing Then
Application.EnableEvents = False
For Each Zelle2 In Intersect(Target, Range("B11:B" & lngzelle3))
Set c = ActiveSheet.Range("B11:B" & SearchArea).Find(Zelle2.Value, LookIn:=xlValues, Lookat:=xlWhole, MatchCase:=True, searchorder:=xlByRows)
If Not c Is Nothing Then
Zelle2.Offset(, 1).Value = c.Offset(, 1).Value
Zelle2.Offset(, 2).Value = c.Offset(, 2).Value
Zelle2.Offset(, 4).Value = Format(c.Offset(, 4).Value, "hh:mm")
Zelle2.Offset(, 5).Value = Format(c.Offset(, 5).Value, "hh:mm")
Zelle2.Offset(, 3).Activate
End If
Next
Application.EnableEvents = True
End If

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zellenwerte prüfen
05.07.2021 13:13:37
{Boris}
Hi Chris,
dass Du noch keine Antwort erhalten hast zeigt, dass die Gemeinde offensichtlich auf eine Beispieldatei wartet ;-)
VG, Boris
AW: Zellenwerte prüfen
05.07.2021 18:46:46
Yal
Hallo Chris,
wenn ich richtig verstehe, sollte den/die neue(n) Einträge, die geprüft werden sollten, vor der Zeile 10 erfolgen, oder?

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Z As Range 'Lauf-Variable so kurz wie möglich
Dim Result As Range
Application.EnableEvents = False
'On Error Resume Next 'Ausschalten, wenn man testen möchte
'1. Reagieren, nur wenn die Eingabe vor Zeile 11 passiert
If Not Intersect(Target, Range("B1:B9")) Is Nothing Then
For Each Z In Intersect(Target, Range("B1:B9"))
Set Result = Nothing
'2. Suchen in B11:Bxx (bei Find optimiert Excel selber den Suchbereich)
Set Result = Me.Range("B10:B9999").Find(Z.Value, LookIn:=xlValues, Lookat:=xlWhole, MatchCase:=True, searchorder:=xlByRows)
If Not Result Is Nothing Then
Z.Offset(0, 1).Value = Result.Offset(0, 1).Value
Z.Offset(0, 2).Value = Result.Offset(0, 2).Value
Z.Offset(0, 3).Value = Result.Offset(0, 3).Value
Z.Offset(0, 4).Activate
End If
Next
End If
Application.EnableEvents = True
End Sub
VG
Yal
Anzeige
AW: Zellenwerte prüfen
05.07.2021 22:54:46
Chris
Hallo Yal,
nicht ganz: Eingaben finden grundsätzlich erst ab B10 statt.
Eine Prüfung, ob bereits ein Eintrag existiert soll ab B 11 stattfinden. Den ersten Eintrag in Zelle B zu überprüfen ob er schon existiert macht keinen Sinn da ist der aller erste ist. Wird beispielsweise ein Eintrag in der Zelle B 15 gemacht, sollen alle Einträge die zuvor in den Zellen B10 bis B 14 gemacht wurden überprüft werden ob diese sich mit dem Eintrag in B 15 gleichen. Das Ende in Spalte B ist offen.
Ich hoffe es ist auf diese Weise ein wenig verständlicher.
Vielen Dank
AW: Zellenwerte prüfen
06.07.2021 07:01:35
Oberschlumpf
Hi Chris,
und es soll wirklich nur in Spalte B geprüft werden?
So würdest du nach dem 1. Eintrag von Müller Thomas (egal in welcher Zeile) nie die Möglichkeit haben, einen Müller Bernd einzutragen, weil ja schon nach erneutem Eintrag von Müller in Spalte B in der nächsten Zeile sofort alle Daten von Müller Thomas übernommen werden.
Wäre es nicht besser, wenn die Daten aus den Spalten B bis E überprüft werden? Denn nur dann weißt du, dass es eine neue Person ist...
Ciao
Thorsten
Anzeige
AW: Zellenwerte prüfen
06.07.2021 07:38:07
Chris
Hallo Thorsten,
Ja, das würde auch gehen. Wichtig dabei wäre dann, dass die Spalte B-E der neue Eingabe auch markiert werden würden, so dass ich sie mit DEL alle auf einmal löschen kann, wenn gewünscht. Sollte in einer Zeile in Spalte B kein Name stehen, soll Excel leere Zellen ignorieren.
Gruß
Chris
AW: Zellenwerte prüfen
06.07.2021 08:44:31
GerdL
Moin Chris,
teste mal.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim schon_da As Range
If Not Intersect(Target, Range("B11:B" & Rows.Count)) Is Nothing Then
If Not IsEmpty(Target) And Not IsArray(Target) Then
Application.EnableEvents = False
schon_da = Range("B10:B" & Target.Row - 1).Find(Target.Value, xlValues, xlWhole)
If Not schon_da Is Nothing Then
Target.Offset(0, 1).Resize(1, 3) = schon_da.Offset(0, 1).Resize(1, 3)
Target.Offset(0, 4).Activate
End If
Application.EnableEvents = True
Set schon_da = Nothing
End If
End If
End Sub
Gruß Gerd
Anzeige
AW: Zellenwerte prüfen
06.07.2021 09:20:53
Chris
Hallo Gerd,
danke für das Makro. "Typen unverträglich" bei Zeile:
schon_da = range(B10:B.....)
Gruß
Chris
AW: Zellenwerte prüfen
06.07.2021 09:36:31
Yal
Hallo Chris,
nicht

schon_da = Range("B10:B" & Target.Row - 1).Find(Target.Value, xlValues, xlWhole)
sondern

Set schon_da = Range("B10:B" & Target.Row - 1).Find(Target.Value, xlValues, xlWhole)
Es liegt daran, dass das Ergebnis einen Range ist, also ein existierenden Objekt. Objekte werden nicht als ganzes übergeben, sondern nur den "Zeiger" auf dem Objekt. Die Variable "schon_da" enthält nicht das Objekk, sondern eine Adresse, die sagt wo das Objekt (im Speicher) zu finden ist. Diese Zeiger werden immer mit Set gesetzt. Es ist auch damit verbunden, dass nicht "schon_da" auswertbar ist, sondern einen Eigenschaft davon: schon_da.Value oder schon_da.Address.
(wobei -Klugscheisser-Modus an- "Value" das Default-Eigenschaft eines Ranges ist, daher könnte man nur "schon_da" abfragen und eine Wert bekommen, aber es setzt voraus, dass diese Range eine einzige Zelle darstellt. Sonst bekommt man eine Fehler -Klugscheisser-Modus aus-)
Es ist übrigens gleichwertig zu

Set schon_da = Range("B:B").Find(Target.Value, xlValues, xlWhole)
Da Excel selber nur den "UsedRange" für die Suche in Betracht zieht.
VG
Yal
Anzeige
AW: Zellenwerte prüfen
06.07.2021 11:29:14
GerdL
Upps Yal,
ja, das war ein Schreibfehler im ungetesteten Code; das Wort "Set" fehlte.
Die ganze Spalte B zu durchsuchen, ist aber nur "gleichwertig", wenn in B1-B9 nicht zufällig schon der selbe Wert wie ab B10 abwärts eingetragen wird, zu finden ist.
Gruß Gerd
AW: Zellenwerte prüfen
06.07.2021 13:02:11
Chris
Vielen Dank euch beiden,
trotz SET davor immer noch "Typen unverträglich"
Gruß
Chris
AW: Zellenwerte prüfen
06.07.2021 13:15:25
GerdL
Ja, da fehlte auch noch ein Komma.
Set schon_da = Range("B10:B" & CStr(Target.Row - 1)).Find(Target.Value, , xlValues, xlWhole)
Gruß Gerd
AW: Zellenwerte prüfen
06.07.2021 16:20:29
Chris
Hallo Gerd,
folgendes Makro läuft jetzt

Private Sub Worksheet_Change(ByVal Target As Range)
Dim schon_da As Range
If Not Intersect(Target, Range("B11:B" & Rows.Count)) Is Nothing Then
If Not IsEmpty(Target) And Not IsArray(Target) Then
Set schon_da = Range("B10:B" & CStr(Target.Row - 1)).Find(Target.Value, , xlValues, xlWhole)
If Not schon_da Is Nothing Then
Target.Offset(0, 1).Value = schon_da.Offset(0, 1).Value
Target.Offset(0, 2).Value = schon_da.Offset(0, 2).Value
Target.Offset(0, 3).Value = schon_da.Offset(0, 3).Value
Target.Offset(0, 4).Activate
End If
Application.EnableEvents = True
Set schon_da = Nothing
End If
End If
End Sub
Was bedeutet oben ...not isArray(Target).
Danke für deine Hilfe
Gruß
Chris
Anzeige
AW: Zellenwerte prüfen
06.07.2021 17:05:09
Hajo_Zi
Hallo Chris,
Not nicht Nothing nicht vorhanden im vorgegebenen Bereich, also im Bereich enthalten
GrußformelHomepage
AW: Zellenwerte prüfen
06.07.2021 18:50:11
Yal
Hallo Chris,
der Event "Worksheet_Change" reagiert, wenn eine oder mehrere Zellen -auf einmal- geändert worden sind. Daher ist Target nicht zwangsläufig nur eine einzige Zelle.
Als Alternativ kann man die Anzahl von Zellen in Target zählen:

If Not IsEmpty(Target) And (Target.Cells.Count = 1) Then
Man kann die Aktion auf die erste Zelle von Target sicherstellen, wenn man anstatt Target eine separate Variable verwendet:

Set MyTarget = Target.Range("A1")
Dann ist MyTarget definitiv einzellig.
VG
Yal
Anzeige
AW: Zellenwerte prüfen
06.07.2021 18:23:12
Yal
tatsächlich nicht gleichwertig. Wenn, wie ich es angenommen hatte, die Eingabe vor Zeile 10 stattfindet, ja. Wenn danach, dann sollte bei Target.Row - 1 Ende sein. Sonst findet die Suche die Eingabe selbst.
Meine Bemerkung war auf Grund der

Range("B11:B" & Rows.Count)
das aber nicht innerhalb der Suche sondern der Intersect zu finden war:

If Not Intersect(Target, Range("B11:B" & Rows.Count)) Is Nothing Then
Da Rows.Count alle in der Excelblatt verfügbare Zeile annimmt, kann man gleich Range("B:B") nehmen.
VG
Yal
Anzeige

131 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige