Function GetSerial(gs_firstname As String, gs_surname As String, gs_productid As Long) As Long
'GetSerial function (c) Neil Pearson, 1998
'neil@chilli.net.au
Dim gs_firstnamevalue As Double, gs_surnamevalue As Double, gs_serialnum As Double, gs_prvalue As Double
If Int(gs_productid) <> gs_productid Or gs_productid < 1000000000 or gs_productid > 2147483648 Then Exit Function
If gs_firstname = "" Then Exit Function
If gs_surname = "" Then Exit Function
For gs_letter = 1 To Len(gs_firstname)
gs_firstnamevalue = Sin(Asc(Mid(gs_firstname, gs_letter, 1))) + gs_firstnamevalue
Next gs_letter
gs_firstnamevalue = Format(gs_firstnamevalue / Len(gs_firstname), "0.0000000000")
If gs_firstnamevalue < 0 Then gs_firstnamevalue = gs_firstnamevalue * -1
For gs_letter = 1 To Len(gs_surname)
gs_surnamevalue = Cos(Asc(Mid(gs_surname, gs_letter, 1))) + gs_surnamevalue
Next gs_letter
gs_surnamevalue = Format(gs_surnamevalue / Len(gs_surname), "0.0000000000")
If gs_surnamevalue < 0 Then gs_surnamevalue = gs_surnamevalue * -1
gs_prvalue = gs_productid / 10 ^ (Len(Format(gs_productid)) - 1)
gs_serialnum = Format(gs_prvalue + gs_surnamevalue + gs_firstnamevalue, "0.00000000")
getserial = gs_serialnum * 10 ^ (Len(serialnum))
End Function
