Anzeige

 Mit VBA Dopplung vermeiden


josef24

Erfahrenes Mitglied
#1
Hallo und guten Tag. Ich gebe in einer Text Box neue Datensätze ein, und möchte vermeiden, das es doppelte Datensätze geben kann. Z. B. wenn ich einen Datensatz eingebe nimmt er die ZeilenNr. dazu, was aber, wenn ein anderer Datensatz gelöscht wird, dazu führen kann, das die noch aktive ZeilenNr. wiederum als neu Zeile erkannt wird. Frage: Wie könnte man so etwas umgehen. Füge meinen Kode mal hier an. Danke und Gruß Josef

Code:
Private Sub cmdNew_Click()
   Dim lZeile As Long
     lZeile = 1
     Do While Trim(CStr(wsAt.Cells(lZeile, 3).Value)) <> ""
         lZeile = lZeile + 1
     Loop
      actnumber = CStr("NeuNR" & lZeile)
     wsAt.Cells(lZeile, 1) = actnumber  ' CStr("NeuNR " & lZeile)
     lstData.AddItem actnumber  '  CStr("NeuNR " & lZeile)
     lstData.ListIndex = lstData.ListCount - 1
    ActiveWorkbook.Save
    End Sub
 

Yaslaw

n/a
Moderator
#2
Hä?
Also. Ich denke, es könnte sich um Excel handeln. Gut zu wissen bevor man sich den Wirren des Textes ausliefert.
Der unkommentierte VBA-Code hilft leider auch nicht wirklich weiter.
Ich gebe in einer Text Box neue Datensätze ein
Eine TextBox gibt ganze Datensätze? Ein Datensatz ist eine Ansammlung von mehreren Feldern. Alle zusammen in einer TextBox? Naja, wenn der Datensatz nur ein Feld hat. geht das.

wenn ich einen Datensatz eingebe nimmt er die ZeilenNr. dazu
Woher? Ausgewürfelt?
Oh, ich glaube, dein Code sollte die erste Zeile finden, in der die Spalte 3 leer ist und nimmt dann diese Zeilennummer

Willst du wirklich die Datensatznummer mit der Excel-Zeilennummer gleichsetzen? Da handelst du dir in Zukunft noch viel Probleme ein.

Besser:
Eine Spalte mit der Datensatznummer. Beim anlegen eines neuen Datensatzes mit MAX() die grösste Nummer auslesen und diese +1 verwenden.
 

Yaslaw

n/a
Moderator
#4
Du musst die ID als Zahl speichern. Felder mit Text (zb. Kopfzeile) wird ignoriert
Hier ist die ID in Spalte C
Visual Basic:
newID = WorksheetFunction.Max(wsAt.Range("C:C")) + 1
 

josef24

Erfahrenes Mitglied
#5
Danke für die Lösung, funktioniert natürlich. Habe damit eine Fehlerquelle ausgeschlossen. Ich hätte es mit meiner Kenntnis nicht hin bekommen. Gruß Josef
 

josef24

Erfahrenes Mitglied
#7
Ich möchte noch eine Idee von mir anmerken. Ginge es auch wenn man anstelle von der lfd. Nr. z. B. & Time anfügen könnte. Damit wäre man jegliche Doppelung los. Weiterhin wäre es sehr unwahrscheinlich die Zeitangabe mehfach zu haben. Wie würde das für diese Zeile aussehen? Wenn ich einfach "& Time" anhänge, überträgt sich das auch auf andere Datenfelder. Danke für entsprechende Tipps. Gruß Josef
 

Yaslaw

n/a
Moderator
#8
Das Excelsheet kommt mir bekannt vor. Hatte ich glaub auch schon mal offen.
Aber es ist dein Projekt - ich merke mir nicht auswendig, wie das funktionieren soll. Wo sehe ich jetzt das Ding mit der neuen ID?
Schreib in Zukunft jedes mal dazu, wo wie was.
 

josef24

Erfahrenes Mitglied
#9
Danke erst mal für die Nachricht. Ja, die Datei hatte ich bereits als Beispiel mal hoch geladen. Mein Problem mal näher erläutert: Ich gebe in der USERFORM
(User Klick) unter Button (Rosa) neuer Datensatz in einem erzeugten leeren Datensatz, neue Daten ein. Dabei wird in Spalte "A" ein neuer Text plus Nr. der Zeile eingetragen. Dabei kann es Vorkommen, das die Nr. der Zeile mehrmals verwendet werden kann, wenn die Datensätze nach gewissem Modus sortiert werden.
Somit könnten gleiche Datensätze (Nr. der Zeile) mehrmals möglich sein. Für mich ist weder die "Zeilen- Nr. noch sonstiges zwingend erforderlich. Mir geht es nur darum wie jede Zeile eine Kennung erhält, ohne Dopplung usw. Dies sollte mit der Eingabe möglich sein. Danke und Gruß Josef
 

josef24

Erfahrenes Mitglied
#11
Danke, es könnte z. B. so aussehen. Neu_Tag, Tag, Stunde, Stunde, Minute, Minute. Man würde hieran den neuen Datensatz am "NEU" zuzüglich Tag und Uhrzeit erkennen. Ich bin ansonsten für alles offen, was eine Eingabe ohne Doppelung ermöglicht. Nur das ist mir wichtig. Danke und Gruß Josef
 

Yaslaw

n/a
Moderator
#12
Das musst du wissen. Kein "Es könnte" Mach konkrete Vorschläge. Wie soll man etwas umsetzen, wenn man nicht weiss, was man will.

Neu_Tag, Tag, Stunde, Stunde, Minute, Minute.
Also sollen die ID so aussehen
Neu_22, 22, 12, 12, 20, 20
Neu_22, 22, 12, 12, 21, 21

Unpraktisch, aber kann so umgesetzt werden. Dann brauchst du dein MAX nicht.
Beachte aber, dass du ohne Jahr und Montat eine Dopplung haben kannst.
 

josef24

Erfahrenes Mitglied
#13
So würde es für mich passen: Neu_TT.MM.hh.mm.ss.

Mein Idee dabei, mit Angabe der Sekunde würde eine Doppelung weitestgehend ausgeschlossen. Danke bis dahin, Josef
 

Yaslaw

n/a
Moderator
#14
weitestgehend, aber nicht ganz.
zudem ist es keine sortierbare ID.

Aber siehst du. Jetzt noch den Format-Befehl anwenden und du hasst deine ID ohne dass ich dir helfen muss.

Test im Direktfenster
Visual Basic:
'Achtung, ggf Format noch ins deutsche übersetzen
?"New_" & format(now, "DD.MM.HH.NN.SS")
New_22.01.13.56.10
 
Anzeige

Neue Beiträge

Anzeige