ISBN Prüfziffer berechnen

  • Excel

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Mad Andy.

    ISBN Prüfziffer berechnen

    Hallo,
    ich bin neu hier, und habe auch schon eine Frage.
    Ich möchte mit VB eine function erstellen mit der ich von ISBN-Nummern die Prüfziffer berechnen kann, da ich nicht das Genie bin und noch in den anfängen von VB bin würde ich gerne wissen wie Ihr diese Aufgabe lösen würdet. Oder könnt ihr mir etwas helfen?

    MFG
    Hemtoni
    Wie wird diese Prüfsumme berechnet und wo ist dein bisheriger Lösungsansatz? Eine Quersumme zu, Beispiel kannst du errechnen, indem du eine Zahl in eine Zeichenkette umwandelst (CStr-Funktion) und diesen String zeichenweise durchläuftst (For-Scheife mit Mid-Funktion) und die einzelnen Ziffern wieder in eine Zahl umwandelst (CInt-Funktion) und summierst.
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    Wie ich bereits oben beschrieben habe, die Ziffer mit Mid in Integer umwandeln:

    Visual Basic-Quellcode

    1. Function Prüfzifferberechnen(Wert As String) As Double
    2. Dim x As Integer, Summe As Integer, Lang As Integer, Ziffer as Byte
    3. Lang = Len(Wert)
    4. For x = 1 To Lang
    5. Ziffer = cint(mid(Wert,x,1))
    6. Summe = Summe + Ziffer
    7. next x
    8. Prüfzifferberechnen = Summe
    9. end function
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    hey ;)

    da es mich auch interessiert hat, hab ich mich mal hingesetzt und das ganze gecodet, wahrscheinlich geht es viel einfacher und besser, aber jeder fängt mal klein an, bei fragen, frag mich einfach :)

    zur Berechnung hab ich diese Page herangezogen :)
    german-isbn.org/isbn_merkblatt.html


    Visual Basic-Quellcode

    1. Option Explicit
    2. Private sISBNNr As String
    3. Private sISBNNr1 As String
    4. Private iErgebnis As String
    5. Private iCounter As Integer
    6. Private iMultiplicator As Integer
    7. Private izwischenspeicher As Long
    8. Private bgefunden As Boolean
    9. Private ipruefziffer As Integer
    10. Private Sub cmdCheck_Click()
    11. Reset ' Werte zurücksetzen
    12. sISBNNr = Me.txtISBN
    13. sISBNNr1 = Replace(sISBNNr, "-", "")
    14. For iCounter = 1 To 9
    15. iMultiplicator = iMultiplicator - 1
    16. iErgebnis = Mid(sISBNNr1, iCounter, 1) * iMultiplicator
    17. Debug.Print iErgebnis
    18. izwischenspeicher = izwischenspeicher + iErgebnis
    19. Next
    20. While bgefunden = False
    21. If izwischenspeicher Mod 11 = 0 Then
    22. bgefunden = True
    23. Me.txtprfchar = CStr(ipruefziffer - 1)
    24. Else
    25. izwischenspeicher = izwischenspeicher + 1
    26. ipruefziffer = ipruefziffer + 1
    27. End If
    28. Wend
    29. End Sub
    30. Private Function Reset()
    31. iMultiplicator = 11
    32. ipruefziffer = 1
    33. Me.txtprfchar = ""
    34. izwischenspeicher = 0
    35. iCounter = 1
    36. bgefunden = False
    37. End Function


    habe das ganze noch als gezippte exe mal angehängt :)

    HIER


    PS:
    Da ich selbst nicht der beste bin bin ich offen für Anregungen / Verbesserungen oder auch falls doch etwas falsch sein sollte auf den hinweis :)
    Hallo zusammen,

    hier mal meine Variante:

    Visual Basic-Quellcode

    1. Private Sub Command1_Click()
    2. Dim strISBN As String
    3. strISBN = "3-7609-4012-9"
    4. MsgBox getCheckDigit(strISBN)
    5. End Sub
    6. Private Function getCheckDigit(strISBN As String) As String
    7. Dim i As Long, lngSum As Long
    8. strISBN = Replace(strISBN, "-", "")
    9. For i = 1 To 9
    10. lngSum = lngSum + (11 - i) * CLng(Mid(strISBN, i, 1))
    11. Next i
    12. getCheckDigit = (11 - (lngSum Mod 11)) Mod 11
    13. If getCheckDigit = 10 Then getCheckDigit = "X"
    14. End Function


    Gruß Markus
    immer wieder schön mehrere Versionen zu sehen um seine eigene Denkweise evtl. doch noch zu verbessern :) weiter so *daumen hoch*

    PS:
    Hätte da mal eine Frage, eigentlich ist es bei meinem beispiel ja egal (auser dem Reset) ob die Variablen als DIM oder Private deklariert sind, GLobal macht es mit der Übergabe halt einfacher bei so "kleinen" funktionen, was sagt denn der gute programmierstil dazu ?

    Private wirklich nur die Globalen oder bei solchen anwendungen egal ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Realy?“ ()

    Hi!

    Wenn du ne funktion verwendest, bei möglichkeit immer nur den Rückgabewert verwenden.

    Und global ist sowieso tot ;)
    Public ist das neue Schlüsselwort dafür, mit der gleichen wirkung.


    mfG Andy

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mad Andy“ ()