Jeg har tilfældigvis lavet et ark på et tidligere tidspunkt, som netop beregner kontroltallet. Interesseret så send en mail eller opgiv mail-adresse. janvogt@esenet.dk
superjap> Det er fordi VBA ikke er min allerstærkeste side, og jeg har endnu ikke fundet en smart metode, at paste hele Excel-filer ind her på Eksperten :-)
superjap> hvad er det man logisk skal finde for at beregne kontrolcifferet, skal man fx tage det mindst betydende ciffer, for det gør du ikke. For at gøre det: ciffer=kontrolCiffer-int(kontrolCiffer/10)*10
Nå ja og då finder den lige forskellen mellem dette tal og det oprindelige tal. Der er flere måder at gøre det på. Det her er blot lige den jeg kunne komme i tanke om.
Følgende formel vil så beregnes kontrolcifferet: =10-MOD(((MID(B3;2;1)+MID(B3;4;1)+MID(B3;6;1)+MID(B3;8;1)+MID(B3;10;1)+MID(B3;12;1))*3)+(MID(B3;1;1)+MID(B3;3;1)+MID(B3;5;1)+MID(B3;7;1)+MID(B3;9;1)+MID(B3;11;1));10)
Checkciffer kan jo aldrig bliver mere end 9, da man jo runder af opad til nærmeste tal som kan divideres med 10, fx giver 10, 10, 11 skal give 20. Og ja så er mit forslag jo nærmeste tal dividerbar med 10, og dermed forkert. Så det her skal ind i funktionen til sidste i stedet for den ene linje:
div10=int(kontrolCiffer/10)*10 if kontrolCiffer <> div10 then div10=div10+10 ean13=nummer*10+div10-kontrolCiffer
Din funktion giver stadig nogen mærkelige tal. For det første var htm kun ude efter kontrolcifferet. Ser vi bort fra det, så giver din funktion stadig ikke det rigtige resultat
men i din funktion bliver det til: EAN13(571234567890) = 5712345678899
Det du jo slet ikke, da de 12 første cifre skal være det samme som de oprindelige. Du skal lægge 10 til dit resultat, så skulle det være korrekt. Når du har gjort det, har du fundet endnu måde at komme frem til det korekte resultat på.
Denne "smøre" skulle så tage højde for alt: =IF(10-MOD(((MID(B3;2;1)+MID(B3;4;1)+MID(B3;6;1)+MID(B3;8;1)+MID(B3;10;1)+MID(B3;12;1))*3)+(MID(B3;1;1)+MID(B3;3;1)+MID(B3;5;1)+MID(B3;7;1)+MID(B3;9;1)+MID(B3;11;1));10)=10;0;10-MOD(((MID(B3;2;1)+MID(B3;4;1)+MID(B3;6;1)+MID(B3;8;1)+MID(B3;10;1)+MID(B3;12;1))*3)+(MID(B3;1;1)+MID(B3;3;1)+MID(B3;5;1)+MID(B3;7;1)+MID(B3;9;1)+MID(B3;11;1));10))
Function ean13(Number As String) As String Dim Chksum As Long Dim x As Long Const chk As Long = 12 On Error GoTo Fejl If Len(Number) <> chk Then GoTo Fejl Chksum = 0 For x = 1 To chk Chksum = Chksum + CInt(Mid(Number, x, 1)) * (1 + (2 * ((x + 1) Mod 2))) Next Chksum = Chksum Mod 10 If Chksum <> 0 Then Chksum = 10 - Chksum ean13 = Number & Chksum Exit Function Fejl: ean13 = "Fejl" End Function
samt en alm array funktion =IF(MOD((SUM(IF(EVEN(ROW(1:12))<>ROW(1:12);MID(A1;ROW(1:12);1)*1;MID(A1;ROW(1:12);1)*3)));10)=0;0;10-MOD((SUM(IF(EVEN(ROW(1:12))<>ROW(1:12);MID(A1;ROW(1:12);1)*1;MID(A1;ROW(1:12);1)*3)));10))
Jan-> det kan jeg da. Jeg har lige testet på XL97. Får du en excelfejl eller bare "fejl". hvis du fjerner Number i sætningen ean13 = Number & Chksum vil du kun få kontrolcifferet. Vil du have et eksempel ?
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.