Oto moje kolejne makro z rodziny BARcode.
Tym razem Code39, kod 3 z 9 + mod43.
Aby kod wyświetlał się poprawnie potrzeba całkowicie darmową
czcionkę barcode którą sam zrobiłem: http://user.services.openoffice.org/pl/ ... php?id=429
Ta czcionka jest kompatybilna z moim makrem code25i i EAN.
Makro specjalnie dostosowane do czcionki barcode.
Tablica znaków nie znajduje się w czcionce lecz w makro.
Skrypt testowałem u siebie i działa 100% (OOo3.2,win7) ewentualne błędy będę starał się poprawić.
Generowane kody odczytywane były bez problemu przez czytnik PSC QuickScan 1000.
Makro instalujemy metodą "kopiuj wklej" w menadżerze makr OpenOffice .
Działa polecenie CODE39("TEST";0;0) .
Pierwszy argument to zawartość kodu liczba lub znaki " A-Z 0-9 -. space $/+% "
Drugi opcjonalny to stała wymuszona długość kodu pomocna przy np numerach seryjnych, dodaje zera wiodące
lub przycina od lewej za długi ciąg. Zero lub brak oznacza automatyczną długość .
Trzeci opcjonalny ustawiony na 1 powoduje dodanie sumy kontrolnej mod43.
Generator wraz z czcionką generuje kody typu slim (niskie),
bez cyfr czytelnych dla człowieka, tylko kod kreskowy.
Kod: Zaznacz cały
REM ***** BASIC *****
REM V1.4 14-11-2012
REM Barcode creator code39 by TN
REM Funkcja generuje kod code39 + mod43
REM
REM GNU GPL General Public Licence
REM Free to commercial and private use.
REM
REM code39(znaki ASCII, cyfry, liczba ; staly wymuszony rozmiar 0=auto size, max=50 ; mod43 0=disable 1=enable)
REM
REM ! UWAGA !
REM Do poprawnego działania wymagana jest odpowiednia czcionka barcode.ttf
REM http://user.services.openoffice.org/pl/forum/download/file.php?id=429
REM -----------------------------------------------------------------------------------
Function code39(Optional data$, Optional size%, Optional check%) As String
code39 = ""
if IsMissing(data) or data="" then goto errend
if IsMissing(check) then check=0 'checksum mod43
if IsMissing(size) then size=0
DIM size2 As Integer
DIM count As Integer 'licznik do petli
DIM codebar As String
codebar = ""
if data="0" and size=0 then goto errend
size2 = Len(data)
if size2=0 or size2>50 or size>50 then goto errend
if size>0 then 'dostosowuje dlugosc
if size>size2 then 'gdy za krotki
for count=1 to size-size2
data = "0" & data
Next count
end if
if size<size2 then 'gdy za dlugi
data = Mid(data,(size2-size)+1,size)
end if
end if
data = UCase(data)
if check=1 then data = data & checkc39(data) 'add checksum
size2 = Len(data)
for count=1 to size2 'drukowanie kodu
if znakc39(Asc(Mid(data,count,1))) = "none" then goto errend
barcode = barcode & znakc39(Asc(Mid(data,count,1))) & "n"
Next count
code39 = "wNwNnWnWnNn" & barcode & "NwNnWnWnNw"
errend:
End Function
Function checkc39(checkdata As String) As String
Const character = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%"
DIM count2 As Integer
DIM count3 As Integer
DIM c As long
checkc39 = ""
c = 0
for count2=1 to Len(checkdata)
for count3=1 to Len(character)
if Mid(checkdata,count2,1)=Mid(character,count3,1) then
c = c + (count3 - 1)
Exit For
End if
Next count3
Next count2
c = c mod 43
checkc39 = Mid(character,c+1,1)
End Function
Function znakc39(cnr39 As Integer) As String
Select Case cnr39
Case 48
znakc39 = "NnNwWnWnN" ' znak "0"
Case 49
znakc39 = "WnNwNnNnW" ' znak "1"
Case 50
znakc39 = "NnWwNnNnW" ' znak "2"
Case 51
znakc39 = "WnWwNnNnN" ' znak "3"
Case 52
znakc39 = "NnNwWnNnW" ' znak "4"
Case 53
znakc39 = "WnNwWnNnN" ' znak "5"
Case 54
znakc39 = "NnWwWnNnN" ' znak "6"
Case 55
znakc39 = "NnNwNnWnW" ' znak "7"
Case 56
znakc39 = "WnNwNnWnN" ' znak "8"
Case 57
znakc39 = "NnWwNnWnN" ' znak "9"
Case 65
znakc39 = "WnNnNwNnW" ' znak "A"
Case 66
znakc39 = "NnWnNwNnW" ' znak "B"
Case 67
znakc39 = "WnWnNwNnN" ' znak "C"
Case 68
znakc39 = "NnNnWwNnW" ' znak "D"
Case 69
znakc39 = "WnNnWwNnN" ' znak "E"
Case 70
znakc39 = "NnWnWwNnN" ' znak "F"
Case 71
znakc39 = "NnNnNwWnW" ' znak "G"
Case 72
znakc39 = "WnNnNwWnN" ' znak "H"
Case 73
znakc39 = "NnWnNwWnN" ' znak "I"
Case 74
znakc39 = "NnNnWwWnN" ' znak "J"
Case 75
znakc39 = "WnNnNnNwW" ' znak "K"
Case 76
znakc39 = "NnWnNnNwW" ' znak "L"
Case 77
znakc39 = "WnWnNnNwN" ' znak "M"
Case 78
znakc39 = "NnNnWnNwW" ' znak "N"
Case 79
znakc39 = "WnNnWnNwN" ' znak "O"
Case 80
znakc39 = "NnWnWnNwN" ' znak "P"
Case 81
znakc39 = "NnNnNnWwW" ' znak "Q"
Case 82
znakc39 = "WnNnNnWwN" ' znak "R"
Case 83
znakc39 = "NnWnNnWwN" ' znak "S"
Case 84
znakc39 = "NnNnWnWwN" ' znak "T"
Case 85
znakc39 = "WwNnNnNnW" ' znak "U"
Case 86
znakc39 = "NwWnNnNnW" ' znak "V"
Case 87
znakc39 = "WwWnNnNnN" ' znak "W"
Case 88
znakc39 = "NwNnWnNnW" ' znak "X"
Case 89
znakc39 = "WwNnWnNnN" ' znak "Y"
Case 90
znakc39 = "NwWnWnNnN" ' znak "Z"
Case 45
znakc39 = "NwNnNnWnW" ' znak "-"
Case 46
znakc39 = "WwNnNnWnN" ' znak "."
Case 32
znakc39 = "NwWnNnWnN" ' znak "(spacja)"
Case 36
znakc39 = "NwNwNwNnN" ' znak "$"
Case 47
znakc39 = "NwNwNnNwN" ' znak "/"
Case 43
znakc39 = "NwNnNwNwN" ' znak "+"
Case 37
znakc39 = "NnNwNwNwN" ' znak "%"
Case Else
znakc39 = "none" 'character not supported
End Select
End Function