Komplexes zählverhalten
#1
Guten Tag allerseits

Ich habe ein Excel problem wo ich trotz tiefgründiger Suche in den Foren nicht weiterkomme.
Wir möchten Mitgliedernummern in einer Mitgliederliste generieren lassen.

In Spalte B haben wir den Namen, dann Telefonnummer usw.
In Spalte A möchten wir es gerne so haben, dass sich automatisch eine Nummer generiert wenn der Name in Spalte B eingetragen wird.
Sprich, wenn wir ein neues Mitglied hinzufügen füllt sich die Mitgliedernummer automatisch aus. Soweit so gut. das bekomme ich mit der WENN Funktion hin.

Jedoch ist jetzt die vorgabe das die Nummer wie folgt aufgebaut ist (Jahr zweistellig, Monat zweistellig, Nummerierung aufsteigend). Für heute also 2311001 (001 für das erste Mitglied).
Die Nummerierung soll sich unabhängig vom vorherigen Datum weiterzählen.

Kann mir da bitte jemand helfen wie ich das machen kann? Huh 

Vielen Dank euch und einen schönen Tag.

Cinderella
Antworten Top
#2
Hola,
ungetestet:
=text(heute();"JJMM")&text(Zeile(A1);"000")
Gruß,
steve1da
Antworten Top
#3
Hallo,

ein Ansatz mit VBA (im Code des Sheets)

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Pre As String, WSF As WorksheetFunction

Set WSF = Application.WorksheetFunction

Pre = Year(Date) & Month(Date)

If Target.Column = 2 Then
    Target.Offset(, -1) = IIf(WSF.Max(Columns("A:A")) > Pre & "000", WSF.Max(Columns("A:A")), Pre & "000") + 1
End If
End Sub

mfg
Antworten Top
#4
Hallo Fennek

Danke für die schnelle Antwort und die Hilfsbereitschaft. 

Das klappt ja wunderbar. 

Jedoch zeigt es mir nun das Jahr als vierstellig an. wir hätten es gerne zweistellig, also anstatt "2023" nur "23". kann man das auch?
genau so die monate. auch wenn ich da im januar was eintrage dann soll "01" stehen.

Danke für deine Antwort und einen schönen Nachmittag.

MFG

Hallo Steve1da

Der Ansatz klappt leider nicht. Danke aber trotzdem=)

MFG
Antworten Top
#5
ungeprüft:

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Pre As String, WSF As WorksheetFunction

Set WSF = Application.WorksheetFunction

Pre = format(Year(Date),"YY") & Month(Date)

If Target.Column = 2 Then
    if Target.offset (,-1) = "" then
        Target.Offset(, -1) = IIf(WSF.Max(Columns("A:A")) > Pre & "000", WSF.Max(Columns("A:A")), Pre & "000") + 1
    End If
end if
End Sub
Antworten Top
#6
Hallo Fennek

Jetzt wird ein Fehler ausgespielt. Findest du den fehler gerade?
Habe die zwei für mich unverständlichen Befehle verglichen.

Der Unterschied mit dem Datum habe ich gefunden.

Meiner Meinung nach müsste der Fehler im unteren Bereich sein. Kann das sein?


Code:
If Target.Column = 2 Then

    if Target.offset (,-1) = "" then

        Target.Offset(, -1) = IIf(WSF.Max(Columns("A:A")) > Pre & "000", WSF.Max(Columns("A:A")), Pre & "000") + 1

    End If

MFG
Antworten Top
#7
Hi

füge diesen Code in ein allg. Modul:
Code:
Function NeueID(t As Range) As String
    NeueID = Format(Date, "YYMM - ") & Format(t.Row,"0000") 'wenn mehr als 9999 Zeilen gebraucht werden, dann eine 0 mehr im Format angeben....
End Function

Und in die Zelle, in der die neue ID geschrieben werden soll, gibst Du ein (im Bsp. soll in B2 die ID geschrieben werden):

= NeueID(B2)

als Parameter kann auch A2 oder jede beliebige Spalte übergeben werden....


AAAABER!!! Empfehlenswert ist solch ein Vorgehen nicht. Zumindest dann nicht, wenn auf referentielle Integrität zu anderen Tabellen geachtet werden muss. Denn eine Nummer, die gelöscht wird, kann nochmal vergeben werden. Noch schlimmer, wenn eine Zeile gelöscht wird, dann ändern sich alle nachfolgenden ID's..... böööse Falle!

Besser wäre, weder die Zeilennummer noch Max zu verwenden, sondern einen Zählerwert zu verwenden, der sich immer bei Neuanlage um mindestens 1 erhöht. Unabhängig vom Maxwert der Spalte oder der Zeilennummer...
   Pre = Year(Date) & Month(Date)
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top
#8
Hallo Ralf

Danke für deine Antwort.

Das heisst, wenn wir das mit dem Code machen, dann werden die Mitgliedernummern, die eigentlich nur einmal vergeben werden sollen
und dann eigentlich fest bleiben sollen, verändert?

Hast du denn eine bessere idee wie ich das so darstellen kann das ich das jahr und den monat im format habe und hinten die nummern aufkalkuliert werden?

MFG
Antworten Top
#9
...hatte ich doch schon gesagt.... es geht ja im Wesentlichen nur um den letzten Teil. Also den, der hochgezählt werden soll. Für den solltest Du Dir eine Zelle reservieren, deren Wert bei Neuanlage immer um 1 erhöht wird. Am Besten natürlich noch in einem separaten und ausgeblendetem Adminblatt. In der Zelle soll immer der neu zu vergebende Wert  stehen.
Aber sagen wir, dieser Wert soll im gleichen Blatt in Zelle H1 stehen. 
Dann kannst Du im Modul des Blattes folgenden Code schreiben:

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 And Target.Column = 2 And Target <> "" Then
    Target.Offset(, -1) = Format(Date, "YYMM - ") & Format(Range("H1"), "000")
    Range("H1") = Range("H1") + 1
End If
End Sub

...also, immer wenn sich was in Spalte B ändert, dann soll in Spalte A eine neue ID geschrieben werden.
Der Code hat allerdings auch einen Haken. Denn wird ein bestehender Wert in B geändert (also nicht neu angelegt), dann wird ja trotzdem die ID generiert und geändert. Du solltest also noch eine entsprechende Sicherheitsabfrage einbauen oder prüfen, ob in Spalte A schon was steht und H1 sicherheitshalber auch vor unbefugtem Überschreiben schützen (Blattschutz).
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top
#10
Oha...  jetzt sind wir wieder an dem Punkt wo meine Excelkenntnisse überschritten werden.

Also ich kann das nicht auf einfache art und weise bauen? waren die ideen wieder grösser als meine kenntnisse=( schade.

Wie kann ich eine solche sicherheitsabfrage einbauen? Kann ich damit sagen, dass er eine bestehende nummer nicht überschreiben soll?

Sorry das blöde gefrage, komme mir selber doof vor

MFG
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 2 Gast/Gäste