Avatar billede htm Nybegynder
27. februar 2003 - 09:34 Der er 47 kommentarer og
2 løsninger

Udregning i Excel

Hej

Jeg har lavet et lille script i PHP der udregner kontroltallet i en EAN13 stregkode udfra et 12 cifret tal!

http://www.velvaeret.dk/test/ean13.php?ean=571234567890

Det er bygget udfra specifikationerne fra http://www.ean.dk/EAN_Sys/helpdesk/faq/kntrlcif.htm#EAN-13

Det jeg nu ønsker er en makro eller anden form for funktion der udregner kontroltallet udfra en anden celle.

Det skal virke sådan at jeg markerer cellen med det 12 cifrede nummer og så skal kontroltallet genereres i cellen ved siden af.

Måden kontroltallet bliver udregnet på står tydeligt beskrevet i linket fra ean.dk

Håber på hurtig hjælp, da det haster :-)
Avatar billede janvogt Praktikant
27. februar 2003 - 09:57 #1
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
Avatar billede htm Nybegynder
27. februar 2003 - 10:10 #2
Jeg har sendt en mail til dig med min mailadresse
Ser frem til at modtage noget fra dig!

Ville du have noget i mod at jeg smed det op på min server hvis det virker? Så andre også kan få glæde af den?
Avatar billede janvogt Praktikant
27. februar 2003 - 10:11 #3
Testede lige min beregning med eksemplet i dit link.
Jeg fik også kontrolcifret til at blive 9, så den ser god nok ud :-)
Avatar billede janvogt Praktikant
27. februar 2003 - 10:12 #4
Næ, helt fint med mig :-)
Avatar billede sjap Praktikant
27. februar 2003 - 10:14 #5
Nedenstående virker vist også. Det har den lille fordel at andre også kan have glæde af det - uden hele tiden at skulle mail janvogt :-)

Function KontrolCiffer(Nummer As String) as Integer

Faktor = 3
KontrolCiffer = 0
For i = 1 To 12
    KontrolCiffer = KontrolCiffer  Faktor * Mid(Nummer, 13 - i, 1)
    If Faktor = 1 Then
        Faktor = 3
    Else
        Faktor = 1
    End If
Next
KontrolCiffer = Abs(Int(-KontrolCiffer / 10) * 10) - KontrolCiffer

End Function
Avatar billede htm Nybegynder
27. februar 2003 - 10:22 #6
superjap>> Jeg kan ikke få dit eksempel til at virke :-(

Janvogt>> Jeg kigger lige på det og vender tilbage
Avatar billede janvogt Praktikant
27. februar 2003 - 10:24 #7
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 :-)
Avatar billede janvogt Praktikant
27. februar 2003 - 10:25 #8
Superjap, der må være en fejl i denne linie:
KontrolCiffer = KontrolCiffer  Faktor * Mid(Nummer, 13 - i, 1)
Avatar billede sjap Praktikant
27. februar 2003 - 10:27 #9
janvogt
Ok. Jeg troede faktisk det var noget VBA du sendte rundt.

htm
Er du opmærksom på at nummeret, der skal kontrolleres, skal indlæses som en streng (kan evt. klares med TEKST(A5;"0")).
Avatar billede sjap Praktikant
27. februar 2003 - 10:28 #10
janvogt
Hvad er det, du mener, der er forkert?
Avatar billede sjap Praktikant
27. februar 2003 - 10:31 #11
htm

Hvis du bruger nedenstående kan du nummeret både som tekst og som et tal.


Function KontrolCiffer(Nummer As Variant) As Integer

Faktor = 3
KontrolCiffer = 0
For i = 1 To 12
    KontrolCiffer = KontrolCiffer + Faktor * Mid(Nummer, 13 - i, 1)
    If Faktor = 1 Then
        Faktor = 3
    Else
        Faktor = 1
    End If
Next
KontrolCiffer = Abs(Int(-KontrolCiffer / 10) * 10) - KontrolCiffer

End Function
Avatar billede janvogt Praktikant
27. februar 2003 - 10:33 #12
Der manglede vist et "+" i din formel.
Jeg kan dog stadig ikke få fuktionen til at virke .....
Avatar billede nop Nybegynder
27. februar 2003 - 10:33 #13
Prøv at skrive:
KontrolCiffer = KontrolCiffer + Faktor * Mid(Nummer, 13 - i, 1)
Der manglede "+". (har dog ikke afprøvet funktionen)
Avatar billede sjap Praktikant
27. februar 2003 - 10:35 #14
janvogt
Det har du da ret i. Det var da mærkeligt - for det er kopieret direkte fra Excel - ligesom det andet eksempel. Mystisk.
Avatar billede nop Nybegynder
27. februar 2003 - 10:36 #15
Ja, man skal være hurtig.

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
Avatar billede sjap Praktikant
27. februar 2003 - 10:39 #16
nop
Beregningen fremgår af specifikationen i htm's andet link i spørgsmålet.

Den sidste linie er blot en funktion, der runder op til nærmeste tal, der kan divideres med 10.
Avatar billede sjap Praktikant
27. februar 2003 - 10:41 #17
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.
Avatar billede janvogt Praktikant
27. februar 2003 - 10:41 #18
Nop> Jeg har brugt følgende formel i mit Excel-ark:

=10-MOD(((B11+B13+B15+B17+B19+B21)*3)+(B10+B12+B14+B16+B18+B20);10)

B10 er det første ciffer, B11 er det andet o.s.v.

I praksis vil det sige, at de lige cifre skal ganges med 3.
Avatar billede janvogt Praktikant
27. februar 2003 - 10:43 #19
Hvordan går det mon htm?
Avatar billede nop Nybegynder
27. februar 2003 - 10:46 #20
superjap>oprundet=int((kontrolCiffer+5)/10)*10 - kontrolCiffer

Er det ikke det at der står !
Avatar billede nop Nybegynder
27. februar 2003 - 10:47 #21
oprundet skal være ciffer !
Avatar billede htm Nybegynder
27. februar 2003 - 10:47 #22
Jeg har prøvet at lege lidt med janvogts eksempel og fik det til at virke med nedenstående:

Felt A2:  12 cifret nummer (571234567890)
felt B2:   
=MIDT(A2;12;1)*3+MIDT(A2;11;1)*1+MIDT(A2;10;1)*3+MIDT(A2;9;1)*1+MIDT(A2;8;1)*3+MIDT(A2;7;1)*1+MIDT(A2;6;1)*3+MIDT(A2;5;1)*1+MIDT(A2;4;1)*3+MIDT(A2;3;1)*1+MIDT(A2;2;1)*3+MIDT(A2;1;1)*1

felt C2:
=AFRUND.LOFT(B2;10)-B2

Felt D2:
=A2&C2

Janvogt jeg lavede om i dit eksempel fordi jeg ville have det i et felt (Blev så to :-))

Superjap>> Jeg kan altså stadig ikke få dit eksempel til at virke - ville helst have det i en makro.
Kan du forklare hvordan jeg skal gøre?
Avatar billede janvogt Praktikant
27. februar 2003 - 10:49 #23
htm> Jeg kan da godt lægge det hele ind i én formel ......?
Avatar billede sjap Praktikant
27. februar 2003 - 10:51 #24
htm
Jeg forstår ikke, hvor det går galt. Kan du fortælle mig hvilken fejl du får?

Jeg går ud fra du har kopieret funktionen (den sidste) over i VBA i dit regneark. Når du har gjort det, skal du i celle blot skrive

=kontrolciffer(A5)

Hvis dit nummer altså står i celle A5.
Avatar billede htm Nybegynder
27. februar 2003 - 10:52 #25
superjap>> Tak så virkede det - kaldte funktionen forkert :-)
Vil du ligge et svar?

janvogt>> Det må du meget gerne
Avatar billede sjap Praktikant
27. februar 2003 - 10:53 #26
Ok. :-)
Avatar billede sjap Praktikant
27. februar 2003 - 10:55 #27
nop
Det er ikke helt det der står. Prøv med begge funktioner, så vil du se, at de giver forskelligt resultat.
Avatar billede janvogt Praktikant
27. februar 2003 - 10:59 #28
Skriv den 12-cifrede kode i celle B3

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)
Avatar billede janvogt Praktikant
27. februar 2003 - 11:01 #29
På dansk:
MOD = REST
MID = MIDT
Avatar billede nop Nybegynder
27. februar 2003 - 11:03 #30
Måske har du ret men den her er vist ok, har ikke prøvet (undskyld!):

Function ean13(Nummer As String) as real

Faktor = 3
KontrolCiffer = 0
For i = 1 To 12
    KontrolCiffer = KontrolCiffer + Faktor * Mid(Nummer, 13 - i, 1)
    If Faktor = 1 Then
        Faktor = 3
    Else
        Faktor = 1
    End If
Next
ean13 = kontrolCiffer * 10 + (int((kontrolCiffer+5)/10)*10 - kontrolCiffer)

End Function
Avatar billede nop Nybegynder
27. februar 2003 - 11:05 #31
nej !!!!!!

ean13=nummer*10+int((kontolCiffer+5)/10)*10-kontrolCiffer
Avatar billede janvogt Praktikant
27. februar 2003 - 11:18 #32
nop, jeg kan ikke få funktionen til at virke ...
Avatar billede sjap Praktikant
27. februar 2003 - 11:23 #33
janvogt
Giver din formel ikke en fejl hvis kontrolcifferet bliver 0 (f.eks. 555555555555)?
Avatar billede bak Forsker
27. februar 2003 - 11:25 #34
Baseret på jans formel er her en array-formel:
=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)
Avatar billede sjap Praktikant
27. februar 2003 - 11:30 #35
janvogt
Du skal lige sikre dig at hvis resten er 0, så er kontrolcifferet 0 (det gælder jo så også bak's forslag).

nop
Når dit forslag er rettet, så det kan køre, så giver det nogen meget mærkelige tal.
Avatar billede janvogt Praktikant
27. februar 2003 - 11:35 #36
bak> jeg overvejede faktisk selv at inddrage noget med row() - godt set :-)

superjap> Jo, det kan der vist være noget om. Min vil vist give checkciffer 10.
Om denne kombination eksisterer i virkeligheden ved jeg dog ikke.
Avatar billede janvogt Praktikant
27. februar 2003 - 11:40 #37
superjap, kan du eller andre få koden til at fungere?
Avatar billede nop Nybegynder
27. februar 2003 - 11:49 #38
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
Avatar billede sjap Praktikant
27. februar 2003 - 11:56 #39
janvogt
htm kan få den til at fungere :-)
Avatar billede sjap Praktikant
27. februar 2003 - 12:12 #40
nop

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

EAN13(571234567890) = 5712345678909 (dvs. kontrolciffer: 9)

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å.
Avatar billede janvogt Praktikant
27. februar 2003 - 12:14 #41
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))
Avatar billede sjap Praktikant
27. februar 2003 - 12:17 #42
Flot! :-)
Avatar billede nop Nybegynder
27. februar 2003 - 12:31 #43
Godt, jeg går ned og skyder mig ved affaldskontaineren, for ikke at belaste system mere end højst nødvendigt. Farvel.
Avatar billede bak Forsker
27. februar 2003 - 15:02 #44
Lige en brugerdefineret funktion der virker


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))
Avatar billede bak Forsker
27. februar 2003 - 15:06 #45
Jan, vore regnearkfunktioner tager ikke højde for alt :-)
fx. tekst i tallet, eller for mange cifre.
Avatar billede janvogt Praktikant
27. februar 2003 - 15:14 #46
Jo, jeg har brugt datavalidering :-)

Men nej, nogle gange må man give op og overgive sig til lidt VBA .... selvom jeg nødigt vil indrømme det :-)
Avatar billede bak Forsker
27. februar 2003 - 15:20 #47
Nej, nej Jan, du skal ikke give op, for så kan jeg jo ikke lære af dine erfaringer. Bare klø på med at det til at funke :-)
Avatar billede janvogt Praktikant
27. februar 2003 - 15:26 #48
Ok så .... :-)

Hvorfor kan jeg ikke få din kode til at virke i XL97?
Avatar billede bak Forsker
27. februar 2003 - 21:24 #49
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 ?
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Excel-kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester