Option Explicit
Public Function CodeBarreEAN128(SourceString As String) As String
Dim Counter As Integer
Dim CheckSum As Long
Dim Mini As Integer
Dim Dummy As Integer
Dim UseTableB As Boolean
Dim Code128_Barcode As String
If Len(SourceString) = 0 Then Exit Function
For Counter = 1 To Len(SourceString)
Select Case Asc(Mid(SourceString, Counter, 1))
Case 32 To 126, 203
Case Else
MsgBox "Invalid character in barcode string." & vbCrLf & vbCrLf & "Please only use standard ASCII characters", vbCritical
Exit Function
End Select
Next
Code128_Barcode = ""
UseTableB = True
Counter = 1
Do While Counter <= Len(SourceString)
If UseTableB Then
Mini = IIf(Counter = 1 Or Counter + 3 = Len(SourceString), 4, 6)
GoSub Testnum
If Mini < 0 Then
If Counter = 1 Then
Code128_Barcode = Chr(205)
Else
Code128_Barcode = Code128_Barcode & Chr(199)
End If
UseTableB = False
Else
If Counter = 1 Then Code128_Barcode = Chr(204)
End If
End If
If Not UseTableB Then
Mini = 2
GoSub Testnum
If Mini < 0 Then
Dummy = Val(Mid(SourceString, Counter, 2))
Dummy = IIf(Dummy < 95, Dummy + 32, Dummy + 100)
Code128_Barcode = Code128_Barcode & Chr(Dummy)
Counter = Counter + 2
Else
Code128_Barcode = Code128_Barcode & Chr(200)
UseTableB = True
End If
End If
If UseTableB Then
Code128_Barcode = Code128_Barcode & Mid(SourceString, Counter, 1)
Counter = Counter + 1
End If
Loop
For Counter = 1 To Len(Code128_Barcode)
Dummy = Asc(Mid(Code128_Barcode, Counter, 1))
Dummy = IIf(Dummy < 127, Dummy - 32, Dummy - 100)
If Counter = 1 Then CheckSum = Dummy
CheckSum = (CheckSum + (Counter - 1) * Dummy) Mod 103
Next
CheckSum = IIf(CheckSum < 95, CheckSum + 32, CheckSum + 100)
Code128_Barcode = Code128_Barcode & Chr(CheckSum) & Chr$(206)
CodeBarreEAN128 = Code128_Barcode
Exit Function
Testnum:
Mini = Mini - 1
If Counter + Mini <= Len(SourceString) Then
Do While Mini >= 0
If Asc(Mid(SourceString, Counter + Mini, 1)) < 48 Or Asc(Mid(SourceString, Counter + Mini, 1)) > 57 Then Exit Do
Mini = Mini - 1
Loop
End If
Return
End Function