View Single Post
  #3   Report Post  
Posted to microsoft.public.excel.programming
Henry[_8_] Henry[_8_] is offline
external usenet poster
 
Posts: 11
Default Excel VBA: calculating checksums

Thanks, Leith- that was fast.

Unfortunately, I don't know the math for the 32-bit version, and also
unfortunately, I don't have the luxury of being able to do a lot of
research, either. I've just had a project assigned to me that has a
very short deadline, and I have to pull a lot of things together to
enable different modules to draw info from each other. It now seems
that I'll have to resort to another plan - one that I can easily
implement in VBA that can be trusted to accurately decrypt VBA input so
I know that it matches the similarly encrypted data, coming from FoxPro.

Thanks again. I appreciate it.


Henry


Leith Ross wrote:
Hello Henry,

Here is the code for Luhn CRC. I know it isn't the 32 bit CRC
alogrithm. If you lnow the math for the 32 bit CRC then you can use the
Luhn CRC algorithm as a VBA model to construct the 32 bit CRC. Hope this
helps some.


Code:
--------------------
'This is the Luhn Formula as described in ISO/IEC 7812-1:1993.
'Its primary purpose is to ensure accurate entries of the credit card number
'during transactions. You can apply the same technique to other applications
'such as employee numbers or patient numbers. Using check digits for these
'numbers also ensures more accurate data entries.

Public Function CheckDigit(strNum As String) As Integer

Dim i As Integer
Dim iEven As Integer
Dim iOdd As Integer
Dim iTotal As Integer
Dim strOneChar As String
Dim iTemp As Integer

' Add digits in even ordinal positions
' starting from rightmost
For i = Len(strNum) - 1 To 2 Step -2

strOneChar = Mid$(strNum, i, 1)
If IsNumeric(strOneChar) Then
iEven = iEven + CInt(strOneChar)
End If
Next i

' Process digits in odd ordinal positions
' starting from rightmost
For i = Len(strNum) To 1 Step -2
strOneChar = Mid$(strNum, i, 1)
If IsNumeric(strOneChar) Then
' Double it
iTemp = CInt(strOneChar) * 2
If iTemp 9 Then
' Break the digits (e.g., 19 becomes 1+9)
iOdd = iOdd + (iTemp \ 10) + (iTemp - 10)
Else
iOdd = iOdd + iTemp
End If
End If
Next i

' Add even and odd
iTotal = iEven + iOdd

' Return the 10's complement
CheckDigit = 10 - (iTotal Mod 10)

End Function

--------------------

Sincerely,
Leith Ross