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

Prüfziffer erstellen

Prüfziffer erstellen
25.07.2023 23:23:29
mumpel
Hallo!

Public Function AI(cZelle As String) As String
Select Case cZelle

Case "A"
AI = "10"
Case "B"
AI = "11"
Case "C"
AI = "12"
Case "D"
AI = "13"
Case "E"
AI = "14"
Case "F"
AI = "15"
Case "G"
AI = "16"
Case "H"
AI = "17"
Case "I"
AI = "18"
Case "J"
AI = "19"
Case "K"
AI = "20"
Case "L"
AI = "21"
Case "M"
AI = "22"
Case "N"
AI = "23"
Case "O"
AI = "24"
Case "P"
AI = "25"
Case "Q"
AI = "26"
Case "R"
AI = "27"
Case "S"
AI = "28"
Case "T"
AI = "29"
Case "U"
AI = "30"
Case "V"
AI = "31"
Case "W"
AI = "32"
Case "X"
AI = "33"
Case "Y"
AI = "34"
Case "Z"
AI = "35"
Case Else
AI = cZelle
End Select
End Function


=RECHTS((AI(TEIL(D5;1;1))*7)+(AI(TEIL(D5;2;1))*3)+(AI(TEIL(D5;3;1))*1)+(AI(TEIL(D5;4;1))*7)+(AI(TEIL(D5;5;1))*3)+(AI(TEIL(D5;6;1))*1)+(AI(TEIL(D5;7;1))*7)+(AI(TEIL(D5;8;1))*3)+(AI(TEIL(D5;9;1))*1);1)


Mit diesen Funktionen generiere ich eine Prüfziffer. Nun erscheint mir das nicht gerade elegant. Das geht doch sicher besser? Z.B. per Schleife. Nur kenne ich mich mit Schleifen nicht. aus. Den Anfang habe ich schon mal geschrieben. Die Zeichenlänge kann unterschiedlich sein (6, 7, 8, 10. Mindestlänge ist 6), daher "Optional lngLänge As Long = 6".

Public Function CreateCheckDigit(cZelle As String, Optional lngLänge As Long = 6) As String

Dim c1, c2, c3, lnGC, test

test = 645

' Zu tauschende Zeichen
c1 = Array(A, B, C, D, E, F, G, H, I, J, K, L, _
M, N, O, P, Q, R, S, T, U, V, W, X, _
Y, Z, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

' Zeichen mit denen "c1" getauscht werden soll
c2 = Array(10, 11, 12, 13, 14, 15, 16, 17, 18, _
19, 20, 21, 22, 23, 24, 25, 26, 27, _
28, 29, 30, 31, 32, 33, 34, 35, 0, _
1, 2, 3, 4, 5, 6, 7, 8, 9)

' Erstes Zeichen mit 7 multiplizieren, zweites Zeichen mit 3, drittes Zeiche mit 1, _
ab dem nächsten Zeichen wieder von vorn.
c3 = Array(7, 3, 1)

For lnGC = 0 To UBound(c1)
CreateCheckDigit = CreateCheckDigit & "?" 'Right(test, 1)
Next lnGC

CreateCheckDigit = Right(test, 1)

End Function


Danke!

Gruß, René

52
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Danke an alle Helfer - Problem gelöst (owT)
27.07.2023 23:31:52
mumpel
AW: Prüfziffer erstellen
26.07.2023 09:50:16
daniel
Hi

hier mal deine Prüfziffernerstellung als Funktion mit Schleife:
der Text kann beliebig lang sein.
Function Prüfziffer(txt As String) As Long
Dim Summe As Long
Dim Faktor
Dim i As Long
Dim T As String

Faktor = Array(1, 7, 3)
Dim F As Long

For i = 1 To Len(txt)
F = Faktor(i Mod 3)
T = Mid(txt, i, 1)
If T Like "#" Then
Summe = Summe + CLng(T) * F
Else
Summe = Summe + (Asc(T) - Asc("A") + 10) * F
End If
Next

Prüfziffer = Summe Mod 10

End Function
Anzeige
AW: Prüfziffer erstellen
27.07.2023 09:48:52
mumpel
Danke! Aber die UDF rechnet leider falsch.
AW: Prüfziffer erstellen
27.07.2023 09:55:06
daniel
es steht dir frei, die UDF so umzugestalten, dass sie richtig rechnet.
AW: Prüfziffer erstellen
27.07.2023 10:00:43
mumpel
Das mache ich mal in der nächsten Nachtschicht. ;)
AW: Prüfziffer erstellen
27.07.2023 10:57:56
daniel
beziehungsweise, gegen welche von dir beschriebene Bildungregel verstößt denn meine UDF?
ist die Wertzuordnung zu den Zeichen falsch oder wurde die Anforderung, welche Werte mit 7, 3 und 1 zu multipliizieren sind, falsch umgesetzt?
AW: Prüfziffer erstellen
27.07.2023 13:20:06
mumpel
Nur Buchstaben dürfen durch Zahlen ersetzt werden. Die Zahlen müssen bleiben wie sie sind. Aber wie gesagt, ich probiere das am Sonntag mal selber. Sonst lerne ich Schleifen nie. ;)
AW: Prüfziffer erstellen
27.07.2023 13:42:33
Daniel
Hi
Ja genau das macht der Code doch: Summe = Summe + Clng(T)

Ziffern gehen mit ihrem Zahlenwert in die Summe ein.

Ich bin davon ausgegangen, dass die Faktoren 7, 3, 1 auch hier angewendet werden.

Gruß Daniel
Anzeige
AW: Prüfziffer erstellen
27.07.2023 16:00:12
mumpel
Ah jetzt hab ich verstanden. War irritiert, weil in Deinem Code im Array "1, 7, 3" steht, anstatt "7, 3, 1". Weshalb bei Dir eine andere Reihenfolge? Wie muss ich das richtig verstehen.
AW: Prüfziffer erstellen
27.07.2023 16:11:34
daniel
naja, wenn dich das Array irrtiert hat, warum fragst du dann nicht gleich danach?
naja, ist ja auch einfacher erstmal ein "dein Code funktioniert nicht" rauszuhauen, obwohl du das warscheinlich nicht einmal ausprobiert hast.
Sorry, aber das ist einfach unhöflich und lässt mich drüber nachdenken, ob kostenlose Hilfe wirklich das richtige ist.
aber seis drum.
das prinzip ist einfach (Rest = Mod):
Rest(1;3) =1
Rest(2;3) = 2
RestI(3;3) =0
Rest(4;3) = 1
Rest(5;3) = 2
Rest(6;3) = 0

also die Rest-Funktion spuckt beim jedem dritten Element nicht 3, sondern 0 als Ergebnis aus.

das nächste was man wissen muss, dass in VBA bei Arrays normalerweise der erste Index immer der Index 0 ist und nicht 1.
Also mit
x = Array("a", "b", "c")
ist
x(0) = "a"
x(1) = "b"
x(2) ="c"
x(3) = Fehler!

damit sollte sich die Reihenfolge erklären.

und in Zukunft bitte erste prüfen, dann meckern.
Danke.
Anzeige
AW: Prüfziffer erstellen
27.07.2023 20:23:45
mumpel
obwohl du das warscheinlich nicht einmal ausprobiert hast. obwohl du das warscheinlich nicht einmal ausprobiert hast. 

Doch, atte ich. Allerdings irriger Weise die Reihenfolge in "7, 3, 1" geändert.
AW: Prüfziffer erstellen
27.07.2023 20:48:42
daniel
dann hast du nicht meinen Code ausprobiert, sondern deinen und die Behauptung, der Code den ich geschrieben habe würde nicht funktionieren ist eine Lüge.
AW: Prüfziffer erstellen
27.07.2023 21:34:56
mumpel
Sorry, mein Fehler!
AW: Prüfziffer erstellen
27.07.2023 22:54:13
Daniel
Naja, vorher hast du dir ja auch noch das andere ausgedacht.
Bedenke, das positives Feedback der einzige Lohn ist, den ihr Fragesteller den Helfern zukommen lasst.
Dann ist eine negative Rückmeldung, die dazu noch falsch ist, so als würdest du mir noch was wegnehmen.
"Sorry mein Fehler" ist mir da ein bisschen dünn.
Anzeige
AW: Prüfziffer erstellen
27.07.2023 23:23:27
mumpel
Dann entschuldige bitte. Deine Funktion ist jedenfalls "schön klein". Gefällt mir. Eine "Danke-Funktion" gibt es hier ja (noch?) nicht.

Die Lösung von "onur" ist etwas umfangreicher. Dafür kann ich versuchen, sie so umzubauen, dass die Buchstaben keiner "Zahlenfolge" folgen müssen, sondern unterschiedliche Zahlen haben können (z.B. A =10, B=22, C=31). Falls ich sie mal für ein anderes Projekt brauche.
AW: Prüfziffer erstellen
27.07.2023 23:46:36
Daniel
Wozu brauchst du eine Dankeschön-Funktion?
Mir ist das geschriebene Wort lieber als ein Daumen-Hoch-Klick.
Es sei denn, mit der Dankeschön-Funktion ist eine PayPal-Transaktion verknüpft.
Anzeige
AW: Prüfziffer erstellen
28.07.2023 00:18:34
mumpel
Man könnte mit der Danke-Funktion auch einen Text verknüpfen. ;)
AW: Prüfziffer erstellen
28.07.2023 00:27:01
Daniel
Unnötig.
Text kann man auch schreiben.
Bist du zu faul für ein "Danke, funktioniert wie gewünscht"?
AW: Prüfziffer erstellen
28.07.2023 00:38:01
mumpel
Hab ich ja gemacht. ;)
AW: Prüfziffer erstellen
28.07.2023 01:58:56
Daniel
Es wäre aber schön, wenn das gleich komnen würde, ohne das der tread so elendslang werden muss.
Es sollte von dir freiwillig kommen und nicht, weil ichves einfordere.

Ich frage mich immer noch, warum du nicht erwähnt hast, dass du meinen Code abgeändert hast, bevor du ihn getestet hast.
AW: Prüfziffer erstellen
27.07.2023 11:48:16
onur
Sie muss die Prüfziffer und Länderkennung in der Regel ignorieren. Das muss aber ausschaltbar sein.
AW: Prüfziffer erstellen
27.07.2023 12:13:44
daniel
das war keine Anforderung.
wenn man eine allgemeingültige Prüfzifferformel schreibt, dann regelt man das über den Text, den man der Funktion übergibt.
Gruß Daniel
Anzeige
AW: Prüfziffer erstellen
26.07.2023 10:10:21
daniel
oder ganz kompakt:

Function Prüfziffer(txt As String) As Long
Dim i As Long
For i = 1 To Len(txt)
Prüfziffer = Prüfziffer + InStr("123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", Mid(txt, i, 1)) * Array(1, 7, 3)(i Mod 3)
Next
Prüfziffer = Prüfziffer Mod 10
End Function


gruß Daniel
AW: Prüfziffer erstellen
25.07.2023 23:58:48
onur
   c1 = Array(A, B, C, D, E, F, G, H, I, J, K, L, _
M, N, O, P, Q, R, S, T, U, V, W, X, _
Y, Z, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

kann schon mal nicht funktionieren, da die Buchstaben NICHT in Gänsefüsschen stehen.
Anzeige
AW: Prüfziffer erstellen
26.07.2023 00:13:07
onur
Ausserdem meinst du doch "Prüfsumme" und nicht "Prüfziffer" - oder ?
AW: Prüfziffer erstellen
26.07.2023 08:11:24
Fennek
Hallo René,

ohne alle Beiträge gelesen zu haben:

Der Ascii-Code von "A" ist 65, also ergibt

Asc("A") -55

die gesuchte 10, für "B" 11 usw.

mfg
AW: Prüfziffer erstellen
27.07.2023 16:13:05
mumpel
Das ist logisch. Nützt aber nichts wenn man keine Schleifen kann (Ich meine die in VBA, nicht die an den Schuhen. 🤣 Kleiner Scherz).
AW: Prüfziffer erstellen
26.07.2023 09:31:42
Charles
Hallo mumpel,
vielleicht hilft Dir ein kleines Programm, aber leider kann ich das hier nicht hochladen. Geht einfach nicht.
Wäre eine private Nachricht möglich? post4wa (at) yahoo.de
Gruß
AW: Prüfziffer erstellen
26.07.2023 11:30:08
mumpel
Danke! Aber es soll ja in Excel laufen. Damit ich nicht aus der Übung komme. ;)
Anzeige
AW: Prüfziffer erstellen
26.07.2023 00:28:37
onur
AI in deiner Funktion ist doch ein String. Wieso multplizierst du Strings mit Zahlen?
AW: Prüfziffer erstellen
26.07.2023 01:10:36
onur
In C4 soll man PA-Nummer eingeben? Da steht doch der Text "Ablaufdatum".
In C2 soll man Geburtsdatum eingeben? Da steht doch der Text "Art".
https://www.herber.de/bbs/user/162041.png" border="0" width="700" height="222" alt="Userbild">
AW: Prüfziffer erstellen
26.07.2023 01:26:03
mumpel
Der Erklärungstext ist älter als die Änderungen. Kennwort steht im VBA-Code. Wie immer ein kleines a. Ich arbeite im Moment daran. Aber seit ich am VBA-Code etwas geändert habe, schmiert mir Excel immer ab. Bin gerade am Notebook (Windows 11 22H2). Mal schauen was morgen mein Desktop-Rechner sagt (Auch Windows 11 22H2).

Die Änderung (Ergänzung) in der Tabellen-Ereignis-Prozedur:
 If Left(Range("D4"), 2)  Format(Now, "YY") Then
Range("D15").Value = "Der Personalausweis ist abgelaufen"
Range("D15").Font.Color = vbRed
Else
Range("D15").Value = "Personalausweis ist gültig"
Range("D15").Font.Color = vbGreen
End If


Jetzt wäre es schön, wenn es einen Lösungsvorschlag für meine Eingangsfrage gäbe. 😉
Anzeige
AW: Prüfziffer erstellen
26.07.2023 01:46:15
onur
Es wäre auch schön gewesen, wenn du die Datei nicht passwortgeschützt hättest!
Aber trotzdem - SO geht das:
Public Function CreateCheckDigit(txt As String) As Long
Dim le, i, co, pos, a, fa
le = Len(txt)
If Not IsNumeric(Right(txt, 1)) Then txt = Left(txt, le - 1): le = le - 1
txt = Left(txt, le - 1): le = le - 1
fa = 1
For i = 1 To le
fa = Int(fa / 2): If fa 1 Then fa = 7
a = Mid(txt, i, 1): co = Asc(a)
If (co >= 48 And co = 57) Then
co = co - 48
ElseIf (co >= 65 And co = 90) Then
co = co - 55
End If
CreateCheckDigit = CreateCheckDigit + fa * co
Next i
End Function

AW: Prüfziffer erstellen
26.07.2023 02:04:59
mumpel
Danke! Werde es mal ausgibig testen, auch mit der Userform.

Ein Problem habe ich, welches ich mir nicht erklären kann. Wenn ich z.B. in D14 etwas an der Formel ändere, wird nurnoch der Formeltext angezeigt. Passiert das bei Dir auch? Gibt es einen bekannten Bug? Oder weshalb macht Excel das? Nutze Microsoft 365, aktuelle Version.
AW: Prüfziffer erstellen
26.07.2023 02:14:16
onur
Wie bereits 2 mal gesagt: Ich kann nix in deiner Datei prüfen, da passwortgeschützt.....
AW: Prüfziffer erstellen
26.07.2023 02:24:27
mumpel
Ohne Kennwort: https://www.herber.de/bbs/user/162042.xlsm

Hinweis: Bei "Prüfcode" darf nichts abgeschnitten werden. Da werden alle Angaben inklusive Prüfziffern in die Berechnung eingezogen. Ich schau schon mal ob ich Deine Funktion nachvollziehen kann.
AW: Prüfziffer erstellen
26.07.2023 01:49:43
onur
Aber du wolltest ja nur die letzte Ziffer statt der Prüfsumme:
Public Function CreateCheckDigit(txt As String) As Long
Dim le, i, co, pos, a, fa As Integer
le = Len(txt)
If Not IsNumeric(Right(txt, 1)) Then txt = Left(txt, le - 1): le = le - 1
txt = Left(txt, le - 1): le = le - 1
fa = 1
For i = 1 To le
fa = Int(fa / 2): If fa 1 Then fa = 7
a = Mid(txt, i, 1): co = Asc(a)
If (co >= 48 And co = 57) Then
co = co - 48
ElseIf (co >= 65 And co = 90) Then
co = co - 55
End If
CreateCheckDigit = CreateCheckDigit + fa * co
Next i
CreateCheckDigit = CreateCheckDigit - (Int(CreateCheckDigit / 10)) * 10
End Function

AW: Prüfziffer erstellen
26.07.2023 02:14:05
mumpel
Danke! Aber das kann man ja auch mit "Rechts" abschneiden. ;)
AW: Prüfziffer erstellen
26.07.2023 02:21:23
onur
Und wie kommt jetzt die 437 zustande? Ich hab nämlich absolut keine Lust eine 617-Zeichen lange Formel zu analysieren.....
AW: Prüfziffer erstellen
26.07.2023 02:27:57
mumpel
Die entsteht aus PA-Nummer, Geburtsdatum, Ablaufdatum und Versionsnummer. Man fängt also beim ersten Zeichen der PA-Nummer an und hört beim letzen Zeichen der Versionsnummer auf. Die Prüfziffern werden mitgerechnet. Quasi das was bei "Prüfcode" steht.
AW: Prüfziffer erstellen
26.07.2023 03:11:22
onur
Aber DEINE Formel nimmt das "D" von "2010315D" NICHT mit.
AW: Prüfziffer erstellen
26.07.2023 04:05:38
mumpel
Ach ja, die Länderkennung lässt man weg. Rechnet aber trotzdem irgendwie falsch. Mit den Beispieldaten in der Beispieldatei kommt bei der Gesamtprüfsumme etwas anderes raus als mit meiner Formel. Nutze ich aber die Daten von meinem PA, rechnet die Funktion richtig. Das verstehe wer will. ;)
AW: Prüfziffer erstellen
26.07.2023 04:18:47
onur
Weil deine Formel zwar das Länderkürzel weglässt, aber im Prüfcode ist das "D" drin.
AW: Prüfziffer erstellen
26.07.2023 04:49:05
mumpel
Genau. Jetzt nicht mehr.

Aber mein Excel spinnt eh. Der Datumsvergleich stimmt nicht. Egal was ich eingebe. Excel meint immer, dass Ausgangsdatum sei größer als das Enddatum. Excel scheint mal wieder verbugt zu sein. Aber jetzt bereite ich erstmal den Feierabend vor. 05:30 kommt die Ablösung. Dann schlafe ich bis 12, dusche, und dann gehe ich Kindereisenbahn fahren (Wir vom Modellbahnclub sind auf dem Kinderfest mit unserer Kindereisenbahn). Hoffentlich ist die Wiese nicht zu naß, sonst fällt es ins Wasser.
AW: Prüfziffer erstellen
26.07.2023 03:22:28
onur
Deine Kilometer-Formel ist falsch und dein Change-Event-Makro verursacht Endlosschleife.
Ich habe meine Funktion erweitert (um Partameter "komplett"), so dass man sie jetzt auch für die Gesamtprüfung nehmen kann.
https://www.herber.de/bbs/user/162043.xlsm
AW: Prüfziffer erstellen
26.07.2023 04:07:21
mumpel
Das Event habe ich wieder zurückgebaut, und nutze dafür Formeln. Nur das Einfärben mache ich noch per Event, bis mir die bedingten Formatierungen gelingen.
AW: Prüfziffer erstellen
26.07.2023 02:12:23
mumpel
Bei "Prüfcode" rechnet er aber falsch. Da rechnet die Funktion 462 aus, richtig wäre aber 437.
AW: Prüfziffer erstellen
26.07.2023 00:57:02
onur
Zum Testen? Mit Passwort?
AW: Prüfziffer erstellen
26.07.2023 00:45:11
mumpel
Es funktioniert doch wie es soll.
AW: Prüfziffer erstellen
26.07.2023 01:01:17
onur
Aber nur, weil Excel manchmal auch extreme Fehler kompensiert (Manche würden "idiotensicher" dazu sagen). :)
AW: Prüfziffer erstellen
26.07.2023 00:21:42
mumpel
Na gut. Summe ist das Ergebnis. Prüfziffer passt aber, weil nur die letzte Ziffer der Summe gebraucht wird. Ich experimentiere gerade mit dem Personalausweis. Wenn Du auf die Rückseite in Zeile 2 des Maschinencodes schaust, siehst Du im ersten Block das invertierte Geburtsdatum, welchem eine 7 Ziffer folgt, das ist die Prüfziffer. Das selbe auch für PA-Nummer (erste Zeile, zweiter Block) und Ablaufdatum (zweite Zeile, zweiter Block).

An die Gänsefüßchen habe ich nicht gedacht. ;)

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige