"Die Prufziffer für den Code EAN 13 wird folgendermaßen berechnet. Die
Berechnung ist allerdings etwas komplizierter und nicht umbedingt leicht im
Kopf auszurechnen:
Nutzziffern 4 0 0 5 7 3 9 6 2 0 1 5
Gewichtung 1 3 1 3 1 3 1 3 1 3 1 3
Produkte 4 0 0 15 7 9 9 18 2 0 1 15
Summe 4 + 0 + 0 +15 + 7 + 9 + 9 + 18 + 2 + 0 +0 + 15 = 80
Modulo 10 80 Mod. 10 = 0 da 80 : 10 = 8 Rest 0
Differenz zu 10 10 - 0 =10 0 Prüfziffer
Die Rechnung kann man auch folgendermaßen erklären: Als erstes werden die
Nutzziffern (Länderpräfix und alle ziffern bis auf die letzte im
Klarschriftfeld; sie ist nämlich die Prüfziffer) mit 1 und 3 gewichtet. Das
heißt, das die erste Zahl mit 1, und die zweite mit 3, die dritte mit 1, und
die vierte mit 3, ... multipliziert werden. Dies geht bis jede Zahl einmal
mit 1 oder 3 multipliziert wurde. Aus den Produkten wird die Quersumme
berechnet (alle Produkte werden addiert). Jetzt wird Modulo 10 gerechnet das
heißt dass die Summe der Quersumme durch zehn geteilt wird. Zum Schluss wird
dieses Ergebnis von 10 abgezogen. Das Ergebnis dass man jetzt erhält, ist
die Prüfziffer, rechnet man aber wie im beispiel 10 - 0 = 10 ist die
Prüfziffer 0 und nicht zehn. Die Prüfziffer steht in der Zahlenreihnfolge
unter dem Strichcode im Klarschriftfeld an letzter Stelle. "
Ich bin leider kein VBA-Programmierer.
Dafür kann ich aber einen Code kopieren und übernehmen :-)
würde mich freuen, wenn mir wer hilft.
lg Kurt
--
> Ich möchte folgendes Problem lösen.
> In einer Zelle soll eine EAN Nr (nur die ersten 12 Stellen) eingegeben
> werden.
> Die Prüfziffer (13.stelle) soll automatisch anhand unten stehender
> Erklärung errechnet werden.
[...Erklärung gelöscht...)
Folgende Funktion gibt Dir für Zelle A1 die Prüfziffer zurück (geht
eventuell auch einfacher):
=WENN(REST(TEIL(A1;1;1)+TEIL(A1;2;1)*3+TEIL(A1;3;1)+TEIL(A1;4;1)*3+TEIL(
A1;5;1)+TEIL(A1;6;1)*3+TEIL(A1;7;1)+TEIL(A1;8;1)*3+TEIL(A1;9;1)+TEIL(A1;
10;1)*3+TEIL(A1;11;1)+TEIL(A1;12;1)*3;10)=0;10;REST(TEIL(A1;1;1)+TEIL(A1
;2;1)*3+TEIL(A1;3;1)+TEIL(A1;4;1)*3+TEIL(A1;5;1)+TEIL(A1;6;1)*3+TEIL(A1;
7;1)+TEIL(A1;8;1)*3+TEIL(A1;9;1)+TEIL(A1;10;1)*3+TEIL(A1;11;1)+TEIL(A1;1
2;1)*3;10))
> Ich bin leider kein VBA-Programmierer.
> Dafür kann ich aber einen Code kopieren und übernehmen :-)
Wenn Du´s in VBA haben willst, sieht´s so aus (ebenfalls beispielsweise
für A1):
Function fnPruefZiffer() As Byte
Dim vNutzziffer As String
Dim vCounter As Integer
Dim vMultiplikator As Byte
Dim vQuerSumme As Integer
vNutzziffer = ThisWorkbook.Sheets(1).Range("A1")
For vCounter = 1 To 12
vMultiplikator = IIf(Int(vCounter / 2) = vCounter / 2, 3, 1)
vQuerSumme = vQuerSumme + Mid(vNutzziffer, vCounter, 1) *
vMultiplikator
Next vCounter
If vQuerSumme Mod 10 = 0 Then
fnPruefZiffer = 10
Else
fnPruefZiffer = vQuerSumme Mod 10
End If
End Function
Hoffe, ich konnte Dir helfen.
Schönen Gruß
--
Michael
michael....@gmx.de
Hallo zusammen,
>
8<---------------------
>Function fnPruefZiffer() As Byte
Deine Funktion ist auf der Flucht, ich würde die Funktion so anlegen,
daß sie auch rechnet...
'PrüfzifferEANCode13
'400573962015 0
'978390184611 3
'123456789012 8
Function CheckEAN13(key As String) As Integer
Dim n As Integer, i As Integer
n = Len(key)
For i = 1 To n
If (i Mod 2) = 0 Then
CheckEAN13 = CheckEAN13 + Val(Mid(key, i, 1)) * 3
Else
CheckEAN13 = CheckEAN13 + Val(Mid(key, i, 1))
End If
Next
CheckEAN13 = (10 - (CheckEAN13 Mod 10)) Mod 10
End Function
Wolfgang Gerber schrieb:
>
> Die Gewichtung wird immer von rechts nach links beginnend mit "3"
> gerechnet. In deinem Fall bei 12 Stellen fängt das dann links auch mit
> "1" an bzw. hört es mit "1" auf.
>
> Vielleicht hilft dir dieser Code. Allerdings ist der ohne jede Prüfung
> auf die Eingangsbedingungen. D.h. es muss gegebenenfalls noch ein
> Syntaxcheck rein. Und wie du den Code aus der Excelzelle zur
> Weiterverarbeitung auslesen und woanders wieder reinschreiben kannst,
> habe ich mir erspart. Notfalls musst du das auch noch erfragen. Mein
> Beispiel ( sub ean() ) soll nur den Rechenweg klarmachen.
In Anlehnung an deine Erklärung und den Text sollte die folgende Funktin
die gewünschte Prüfziffer errechnen:
Public Function EANCode(Zelle As Range)
If Not IsNumeric(Zelle) Then GoTo Errorhandler
For n = Len(Zelle) To 1 Step -1
v = Val(Mid(Zelle, n, 1))
If n Mod 2 = 1 Then ' n = ungerade Stelle von rechts
p = v * 3 ' Gewichtung 3
Else
p = v * 1 ' Gewichtung 1
End If
summe = summe + p
Next n
EANCode = (10 - summe Mod 10) Mod 10
Exit Function
Errorhandler:
EANCode = "#WERT!"
End Function
--
Mit freundlichen Grüssen
Thomas Ramel
- MVP für Microsoft-Excel -
If n Mod 2 = 1 Then
p = v * 1 ' Gewichtung 1
Else
p = v * 3 ' Gewichtung 3
End If
Hier mein Makro zur Gegenkontrolle:
Function EAN13(rngZelle As Range) As Variant
Const strGewichtung As String = "131313131313"
Dim intI As Integer
Dim dblSumme As Double
If Len(rngZelle.Text) <> 12 Or Not IsNumeric(rngZelle.Text) Then
EAN13 = CVErr(xlErrNA)
Exit Function
End If
For intI = 12 To 1 Step -1
dblSumme = dblSumme + Mid(rngZelle.Text, intI, 1) _
* Mid(strGewichtung, intI, 1)
Next
'Ist die Differenz 10, so ist die Prüfziffer 0
If 10 - dblSumme Mod 10 = 10 Then
EAN13 = 0
Else
EAN13 = 10 - dblSumme Mod 10
End If
End Function
Unter der folgenden URL gibt es eine Check-Berechnung:
http://www.strichcodeservice.at/andere_check_digits.htm#EAN_PZ
MfG Frank
_________________________________________________
Frank Arendt-Theilen, Microsoft MVP für Excel, Hameln
eMail: Thei...@t-online.de, Homepage: http://www.xl-faq.de
Frank Arendt-Theilen schrieb:
> Hallo Thomas,
> in deinem Makro hast du die Gewichtungsberechnung vertauscht. Es
> sollte lauten:
>
> If n Mod 2 = 1 Then
> p = v * 1 ' Gewichtung 1
> Else
> p = v * 3 ' Gewichtung 3
> End If
Du hast recht, Frank. Danke für die Richtigstellung.
> Unter der folgenden URL gibt es eine Check-Berechnung:
> http://www.strichcodeservice.at/andere_check_digits.htm#EAN_PZ
Danke auch für den Link mit den Infos :-)
>Thomas Ramel schrieb:
>
>>In Anlehnung an deine Erklärung und den Text sollte die folgende Funktin
>>die gewünschte Prüfziffer errechnen:
>
>>Public Function EANCode(Zelle As Range)
>>If Not IsNumeric(Zelle) Then GoTo Errorhandler
>
>Das kann zu Fehlern führen. Genau genommen darf die Zelle nicht als
>"Numeric" deklariert sein, weil sonst Zahlen mit führenden Nullen
>nicht möglich wären. Die Zelle sollte also als Text deklariert sein.
Ajee,
wir sollten die Kuh doch vom Eis bringen, oder?
Function CheckEAN(key As String) As Integer
Dim n As Integer, i As Integer
n = Len(key)
For i = 1 To n
If (i Mod 2) = 1 Then
CheckEAN = CheckEAN + Val(Mid(key, n + 1 - i, 1)) * 3
Else
CheckEAN = CheckEAN + Val(Mid(key, n + 1 - i, 1))
End If
Next
CheckEAN = (10 - (CheckEAN Mod 10)) Mod 10
End Function
Wolfgang Gerber schrieb:
>
>>Public Function EANCode(Zelle As Range)
>>If Not IsNumeric(Zelle) Then GoTo Errorhandler
>
> Das kann zu Fehlern führen. Genau genommen darf die Zelle nicht als
> "Numeric" deklariert sein, weil sonst Zahlen mit führenden Nullen
> nicht möglich wären. Die Zelle sollte also als Text deklariert sein.
So, nachdem das Weekend nun vorüber ist; hier meine Rekapitulation.
Das ist richtig; trotzdem wollte ich die Isnumeric()-Prüfung drin haben, um
Texteingaben abzufangen.
>>For n = Len(Zelle) To 1 Step -1
>> v = Val(Mid(Zelle, n, 1))
>>
>> If n Mod 2 = 1 Then ' n = ungerade Stelle von rechts
>> p = v * 3 ' Gewichtung 3
>> Else
>> p = v * 1 ' Gewichtung 1
>> End If
>>
>> summe = summe + p
>>Next n
>
>
> Das funktioniert so aber nur bei bekannter Stellenzahl! Da "n" zu
> Beginn je nach Stellenzahl bei deiner Schleife gerade oder ungerade
> sein kann, die Gewichtung aber immer rechts mit "3" beginnen muss.
Auch hier liegt der Fehler bei mir (ich sollte wohl die Thematik das
nächstemal noch etwas besser verinnerlichen).
Hier eine (nochmals) überarbeitete Version für beliebig viele Stellen:
Public Function EANCode(Zelle As String) As Variant
If Not IsNumeric(Zelle) Then
EANCode = CVErr(xlErrNA)
Exit Function
End If
Dim i As Integer, n As Integer
i = 3
For n = Len(Zelle) To 1 Step -1
EANCode = EANCode + Val(Mid(Zelle, n, 1)) * i
If i = 3 Then
i = 1
Else
i = 3
End If
Next n
EANCode = (10 - EANCode Mod 10) Mod 10
Frank Arendt-Theilen schrieb:
> Hallo Thomas,
> kleine Korrektur noch einbauen:
>
>
>>EANCode = (10 - EANCode Mod 10) Mod 10
>
> 'Ist die Differenz 10, so ist die Prüfziffer 0
Als Formel ungesetzt wäre das folgendes:
=REST(10-REST(A1;10);10)
in A1 die Prüfziffer.
Wenn ich mich nun nicht schon wieder vertan habe, kömmt das Richtige heraus.
>EANCode = (10 - EANCode Mod 10) Mod 10
'Ist die Differenz 10, so ist die Prüfziffer 0
MfG Frank
Frank Arendt-Theilen schrieb:
>
> Asche auf mein Haupt, nehme alles zurück. Dein Code ist in Ordnung!
Da bin ich aber froh; ich hatte ihn kopiert, da mir die Lösung sehr elegant
schien.
> Sorry!!
Kein Problem, Frank!
Ich bin froh, dass meine Postings nicht einfach als 'bare Münze' genommen
werden. Das fordert mich immer wieder dazu heraus, wirklich geprüfte Codes
und Formeln zu 'veröffentlichen' (was bei der ersten Funktion ja leider
nicht ganz der Fall war).
> Deine Funktion ist auf der Flucht, ich würde die Funktion so anlegen,
> daß sie auch rechnet...
Stimmt. Meine Funktion macht Unsinn.
Ist normalerweise in der Tat besser, wenn eine Funktion auch ein
verwertbares Ergebnis auswirft. Vielen Dank also für diesen klugen
Hinweis. ;->
Ernsthafte Frage:
Was bedeutet "auf der Flucht"?
>Hallo Hans,
>
>> Deine Funktion ist auf der Flucht, ich würde die Funktion so anlegen,
>> daß sie auch rechnet...
>
>Stimmt. Meine Funktion macht Unsinn.
>Ist normalerweise in der Tat besser, wenn eine Funktion auch ein
>verwertbares Ergebnis auswirft. Vielen Dank also für diesen klugen
>Hinweis. ;->
>
>Ernsthafte Frage:
>Was bedeutet "auf der Flucht"?
Das ist MS Terminologie, flüchtige Funktionen, so werden Funktionen
ohne Übergabeargumente bezeichnet, z.B. =PI()
Jeder Input von Funktionen MUSS über den Funktionskopf laufen...
Gruß HW
>Grüezi Wolfgang
>
>Wolfgang Gerber schrieb:
>>
>>>Public Function EANCode(Zelle As Range)
>>>If Not IsNumeric(Zelle) Then GoTo Errorhandler
>>
Macht aber keinen Sinn, da z.B: EAN 18 aus 18 stelligen Nummbers
besteht und das ist nur noch in String machbar...
Gruß HW
Hans Hofmann schrieb:
>>
>>>>Public Function EANCode(Zelle As Range)
>>>>If Not IsNumeric(Zelle) Then GoTo Errorhandler
>>>
> Macht aber keinen Sinn, da z.B: EAN 18 aus 18 stelligen Nummbers
> besteht und das ist nur noch in String machbar...
Da gehen mir doch glatt die Argumente aus.... :-)
Danke für die 'Nahchilfe'; EAN war (bisher) kein vertrautes Gebiet.
Ok, danke für die Erklärung.