Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.04.2024 18:57:33
17.04.2024 16:56:58
Anzeige
Archiv - Navigation
1240to1244
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

Doppelte Werte per VBA verhindern

Doppelte Werte per VBA verhindern
Dietmar
Hallo in die Runde,
habe für meine Bedürfnisse trotz Recherche leider nichts geeignetes gefunden.
Beispiel-Sachverhalt:
Im Bereich Tabelle1!A2:A10 generiere ich per Gültigkeitsprüfung eines Namens 'Produkte' (Milch, Kaffee, Butter usw).
Die Gültigkeits-Daten stammen aus einem ausgeblendeten Sheet 'Tabelle2!A2:B10'. Im Bereich 'B2:B10' stehen dort 4-stellige ProduktCodes
Auf diese Art und Weise bin ich in der Lage mir die Zusammenstellung in Tabelle1 individuell zu gestalten. Den ProduktCode in Tabelle1!B2:10' generiere ich über einen SVerweis zu Tabelle2.
Soweit so gut. Das klappt auch alles gut.
Frage:
Nun möchte ich per VAB (wahrscheinlich Worksheet-Change ...) verhindern, dass in Tabelle!1 ein Produkt doppelt dargestellt wird.
Wenn also zB das Produkt 'Milch' in 'A2' mit dem Code 1234 in 'B2' per Gültigkeits-DropDown aufgerufen wird, soll der Code (nicht der Produktname) in Zelle 'B2' mit den restlichen Zellen 'B3:B10' abgeglichen werden.
Wenn der Code bereits vorkommt, soll eine a) msgbox erscheinen und und b) das Vorhaben neutralisiert werden.
Ich hoffe es ist nicht zu kompliziert und bin sehr gespannt.
Viele Dank vorab für jede Hilfe!
Viele Grüße
Dietmar aus Aachen
AW: Doppelte Werte per VBA verhindern
01.12.2011 15:00:31
Rudi
Hallo,
reicht nicht das Hervorheben per bedingter Formatierung?
Gruß
Rudi
AW: Doppelte Werte per VBA verhindern
01.12.2011 15:59:50
Dietmar
Hallo Rudi,
vielen Dank für Dein Feedback.
Nein eine bedingte Formatierung reicht leider nicht, da ich in meiner O-Datei an diesen Stellen schon genügend bedingte Formatierungen verwende. (Mein geschildertes Konstrukt diente ja nur der Erläuterung).
Außerdem MUSS verhindert werden, dass ein Doppeleintrag stattfindet, da "meine Endeanwender" auf bed. Format. reagieren müssten, dies aber nach meinen Erfahrungen nicht zuverlässig unterstellt werden darf.
Hoffe daher auf eine VBA-Lösung.
Viele Grüße
Dietmar
Anzeige
AW: Doppelte Werte per VBA verhindern
01.12.2011 17:20:31
serge
Hallo Dietmar
mit der gültigkeit in a1: Daten Gültigkeit benutzerdefiniert/ Formel =ZÄHLENWENN($A$1:A14;A1)=1
und herunterkopieren
Serge
Beispielmappe ?
01.12.2011 19:22:33
Erich
Hi Dietmar,
bei dieser Frage möchte ich dir empfehlen, eine BeiSpielMappe hochzuladen,
mit den bisherigen Gültigkeitsprüfungen, Produktcodes und SVERWEISen.
Das erleichtert uns die Arbeit und beschert dir eher eine passende Lösung,
ob per VBA oder erweiterter Gültigkeitsprüfung.
Ich sehe aus deiner Beschreibung nicht, ob derzeit die Produktcodes in der Gültigkeitsprüfung eine Rolle spielen.
Da werden doch jetzt nur die Produktnamen geprüft, oder?
(ass künftig auch geprüft werden soll, dass kein Produktcodes doppelt ist, ist klar.)
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich
Anzeige
Hier die Beispielmappe
01.12.2011 23:10:41
Dietmar
Hallo Ericht,
vielen Dank. Du hast natürlich recht, so geht es besser.
Nachfolgend die Beispieldei
Im VBA-Bereich findest Du auch meinen untauglichen Versuch (da hatte ich noch alles in Tabelle 1 liegen).
Herzlichen Dank
Dietmar aus Aachen
https://www.herber.de/bbs/user/77779.xls
Rückfrage
02.12.2011 08:43:20
Erich
Hi Dietmar,
in deiner Mappe kommt die Komplikation, derentwegen du die Frage stellst, nicht vor, oder habe ich das übersehen?
Zur Klärung diese Tabelle:
 ABC
1PreislisteCodePreis
2Kuhmilch1111,00 €
3Milch1111,00 €
4Milch1231,00 €
5Zucker2222,00 €
6Brot3333,00 €
7Butter4444,00 €
8Bohnen5555,00 €
9Erbsen6666,00 €
10Tomaten7777,00 €
11Bananen8888,00 €
12unbelegt19910,00 €
13unbelegt29920,00 €

Was kommt in deinen Daten vor:
a) es gibt zumindest einen Code (hier 111) mit mehreren Produktbezeichungen (Milch + Kuhmilch)
b) es gibt zumindest ein Produkt (hier Milch) mit mehreren Codes (111 + 123)
c) oder gibt es sogar beides, a) und b) ?
Wie auch immer, lässt sich das nicht generell bereinigen, so dass dein Problem gar nicht erst entsteht?
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich
Anzeige
Klarstellung ausführlich, wie es gemeint ist
02.12.2011 10:28:14
Dietmar
Hallo Erich,
vielen Dank für Dein ausführliches und tolles Feedback.
Folgendes zur Klarstellung:
a) Die Basis-Daten befindet sich im Tabellenblatt 2, das normalerweise ausgeblendet ist,
Hier sollen alle verfügbaren Produkte erfasst werden.
Damit dort keine doppelten Codes erfasst werden, werde ich das DORT mit der benutzer-
definierten Gültigkeitsprüfung 'Zählenwenn($B$2:B12;B2)=1' für meine Datenpflege ab-
sichern.
Der Bereich Tabelle2!A2:A11 hat den Namen 'Produkte'
_
b) So, und nun soll Tabelle 1wie folgt funktionieren:
1.) A2:A11 greift über die Gültigkeitsprüfung auf den Namen 'Produkte' zu, so dass dort nur die
auf Tabelle2 aufgeführten Produkte abgreifbar sind. Z.B. Milch.
2.) B2 (z.B.) generiert aufgrund den gewähten Produktes A2 den Code per SVerweis.
3.) Wenn ich jetzt in (z.B.) A3 auch das Produkte von A2 (Milch) auswählen würde, wurde ja in B3 der
gleiche Code genierte wie in B2.
Und genau DAS soll per VBA verhindert werden, d.h. der Vorgang soll nach Warnhinweis neutralisiert
werden.
_
c) Führend ist immer der Code, ich werde in der (eigentlich) ausgeblendeten Tabelle 2 dafür sorgen,
dass kein Produkt und kein Code dopptelt erscheint.
Mein Absicherungsbedürfnis liegt in Tabelle 1.
Ich hoffe, dass ich der Vorgang etwas transparenter machen konnte.
Bis total gespannt, ob es eine Lösung gibt :-)
Viele Grüße
Dietmar aus Aachen
Anzeige
nochmals Klarstellung
02.12.2011 10:45:13
Dietmar
Hallo Erich,
eine kleine Ergänzung noch zu meiner Erläuterung von eben:
Codes dürfen deshalb nicht doppelt vorkommen, weil meine recht komplexe Originaldatei diese Daten 'in der Tiefe' für die Lagerhaltung verwendet. Ich möchte dies durch diese neue Idee weiterentwickeln.
Ein Doppelter Artikel-Code wurde dort durcheinander produzieren.
Viele Grüße
Dietmar aus Aachen
Lösungsvorschlag
02.12.2011 11:03:57
Rudi
Hallo,
ins Modul der Tabelle:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then 'Änderung in A
On Error GoTo ERRHANDLER
Application.EnableEvents = False
If Target  "" Then  'nicht leer
If Application.CountIf(Columns(1), Target) > 1 Then
'doppelt --> löschen
Target.Resize(, 2) = ""
Target.Activate
Else
'einfach --> B eintragen
Target.Offset(, 1) = _
Application.VLookup(Target, Sheets("Basis").Range("A:B"), 2, 0)
End If
Else
'leer --> B löschen
Target.Offset(, 1) = ""
End If
End If
ERRHANDLER:
Application.EnableEvents = True
End Sub

Gruß
Rudi
Anzeige
guter Ansatz, aber ...
02.12.2011 11:49:06
Dietmar
Hallo Rudi,
Herzlichen Dank!
vom Ansatz her klasse!
Erkenne es leider immer erst, wenn ich den Code sehe; d.h. proaktives Erstellen fällt mir noch schwer :-)
Leider zerstört der VBA-Code mir den SVerweis in Spalte B
Bei der Feststellung, dass der Code schon vorkommt, müsste der Vorgang neutralisisert werden. Also zurücksetzen in der vorigen erlaubten Zustand.
Mit dem Löschvorgang in der Spalte B gehts leider nicht.
Aber ich glaube, dass Du ganz nah dran bist.
Viele Grüße aus Aachen
Dietmar
Mein Gott, jetzt hat er's wahrscheinlich :-)
02.12.2011 12:01:34
Dietmar
Hallo Rudi,
mein Vorschlag, Deinen Code etwas zu ändern:
Habe in 'doppelt löschen' Target.Resize(, 1) anstatt (, 2) genommen.
Jetzt geht es :-)
Ich glaube, dass das die Lösung ist, oder?
1000 Dank für kurzes Feedback, denn dann würde ich das in meine O-Datei einarbeiten.
Viele Grüße
Dietmar
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then 'Änderung in A
On Error GoTo ERRHANDLER
Application.EnableEvents = False
If Target  "" Then  'nicht leer
If Application.CountIf(Columns(1), Target) > 1 Then
'doppelt --> löschen
Target.Resize(, 1) = ""
Target.Activate
Else
'einfach --> B eintragen
Target.Offset(, 1) = _
Application.VLookup(Target, Sheets("Basis").Range("A:B"), 2, 0)
End If
Else
'leer --> B löschen
'Target.Offset(, 1) = ""
End If
End If
ERRHANDLER:
Application.EnableEvents = True
End Sub

Anzeige
AW: Mein Gott, jetzt hat er's wahrscheinlich :-)
02.12.2011 12:25:35
Rudi
Hallo,
.resize(, 1) kannst du ganz löschen.
Mein Ansatz war, dass du, wenn du ohnehin VBA einsetzt, ja auch auf die Formel verzichten kannst und statt dessen den Wert in B per VBA einfügst.
Kleine Verfeinerung, mit der B nicht mehr angerührt wird:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then 'Änderung in A
On Error GoTo ERRHANDLER
Application.EnableEvents = False
If Target  "" Then  'nicht leer
If Application.CountIf(Columns(1), Target) > 1 Then
'doppelt --> rückgängig
Application.Undo
Target.Activate
End If
End If
ERRHANDLER:
Application.EnableEvents = True
End Sub

Gruß
Rudi
Anzeige
Das ist elegant :-) Danke ...
02.12.2011 13:28:22
Dietmar
Hallo Rudi,
mit dem 'undo' ist cool! (irgendsowas schwebe mir auch vor)
Jetzt ist es PERFEKT!
Mal was für die Verantwortlichen dieses Forums:
Ich fühle mich hier im Forum total wohl und habe immer tolle Lösungen bekommen.
Das schöne ist auch, dass man das Gefühl hat, hier richtig ernst genommen zu werden und dass sich
immer jemand intenisv kümmert.
Gib's mal irgendwie weiter, denn Du scheinst doch zum engeren Kreis zu gehören :-)
Besten Dank jedenfalls und eine schöne Vorweihnachtszeit!
Viele Grüße
Dietmar
doch noch ein kleiner Ergänzungswunsch
02.12.2011 13:36:19
Dietmar
Hallo Rudi,
wie müsste der Code lauten, wenn NUR der Begriff 'unbelegt' in Spalte A wiederholt vorkommen dürfte.
Danke.
Gruß Dietmar
Anzeige
ich glaube ich hab's, schau mal bitte
02.12.2011 13:42:55
Dietmar
Hallo Rudi,
ich glaube ich hab's:
If Target  "" And Target  "unbelegt" Then  'nicht leer oder 'unbelegt'
Oder doch noch anders?
Jedenfalls läut's
Gruß Dietmar
schau mal bitte
02.12.2011 13:56:38
Rudi
Hallo,
wenn's läuft, ist doch gut.
Gruß
Rudi

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige