Solved

how do I find macro Excel formula to generate numbers per Luhn formula

Posted on 2011-09-08
4
2,862 Views
Last Modified: 2012-05-12
Hi, I'm looking for a macro in Excel to generate numbers per the luhn algorithm
0
Comment
Question by:Seidmich
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
4 Comments
 
LVL 50

Assisted Solution

by:barry houdini
barry houdini earned 62 total points
ID: 36507267
Not a macro.......buhis formula in B1 will give the required check digit given a number of any length in A1

=MOD(SUMPRODUCT(-MID(TEXT(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)*(MOD(ROW(INDIRECT("1:"&LEN(A1)))+LEN(A1)+1,2)+1),"00"),{1,2},1)),10)

If your numbers have a fixed specific length then that all-purpose formula could probably be shortened to suit your exact requirements

regards, barry
0
 
LVL 19

Accepted Solution

by:
Arno Koster earned 63 total points
ID: 36509214
For small numbers you could use
Sub generate_luhn_numbers()

Dim database()
Dim luhn_format As String

'-- initialise
luhn_length = 4
ReDim database(10 ^ (luhn_length), luhn_length)
luhn_format = ""
For pos = 1 To luhn_length
 luhn_format = luhn_format & "0"
Next pos

For candidate = 0 To 10 ^ (luhn_length) - 1
    Application.StatusBar = "Processing : " & Int(100 * candidate / (10 ^ luhn_length))

    '-- fill with all possible numbers
    rest = 0
    For digit = 0 To luhn_length - 1
        database(candidate, digit) = Val(Mid(Format(candidate, luhn_format), digit + 1, 1))
    Next digit
           
    '-- calculate
    luhn_value = 0
    For digit = 0 To luhn_length - 1
        If isOdd(digit) Then
            luhn_value = luhn_value + 2 * database(candidate, digit)
        Else
            luhn_value = luhn_value + database(candidate, digit)
        End If
    Next digit
    database(candidate, luhn_length) = Val(Right(10 - luhn_value Mod 10, 1))
    
    '-- export to excel
    Cells(candidate + 1, 1) = 0
    For digit = 0 To luhn_length
    Cells(candidate + 1, 1) = Cells(candidate + 1, 1) + database(candidate, digit) * 10 ^ (luhn_length - digit)
    Next digit
    
Next candidate

End Sub

Function isOdd(value) As Boolean
    isOdd = ((value Mod 2) = 1)
End Function

Open in new window

0
 
LVL 50
ID: 37087210
This question has been classified as abandoned and is closed as part of the Cleanup Program. See the recommendation for more details.
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

When you see single cell contains number and text, and you have to get any date out of it seems like cracking our heads.
You need to know the location of the Office templates folder, so that when you create new templates, they are saved to that location, and thus are available for selection when creating new documents.  The steps to find the Templates folder path are …
This Micro Tutorial demonstrates in Microsoft Excel how to consolidate your marketing data by creating an interactive charts using form controls. This creates cool drop-downs for viewers of your chart to choose from.
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…

623 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question