バーコード CODE128を作成する
管理者用
バリアブル印刷の依頼です。可変のバーコードをレイアウトする項目が含まれているようです。
また、バーコードの仕様は、、CODE128規格を使う事になりました。
CODE128は、英数字が扱える規格となっています。
仕様としての、説明は割愛しますが、知りたい方は、ネットで検索してみてください。
以前から、何度かバーコードの仕事は受けているのですが、
NW-7やITFコードは、フォント化されたバーコードが使用できます。
CODE128もフォント化で対応出来そうなのですが、ネットに出回っているものでは、チェックビットが使用出来ません。
チェックビットを使用しないで使うのであれば可能なのです。
また、ヨーロッパのサイトで、完全フォント化がされたものが見つかりました。
細かな話は割愛しますが、スタート/ストップコードなど、どうしても表示させる事ができないのです。
たぶん、今回の仕事は、チェックコード無しで、対応出来そうですが、どの様な要求が来るかわかりません。
対応できるようにしておきたいと、準備開始しました。
バーコードは、図形にして作成する事としたのです。
エクセルVBAからインデザイン上に書き出す事とします。
<追記>この NAVIブログを紹介後、 CODE128 フォントを自作しました。
合わせて、参照してください。
⇒ バーコード CODE128 のフォント作ってしまいました。
バーコードの構成について
まず、バーコード作成の前に、バーコードの構成についてお話しします。
バーコードの種類は結構あるように思うのですが、わかりにくく思います。
バーコードの規格とそのバーコードを使用したフォーマットの規格。
そして、いくつかあるチェックビットの計算方法も入って来ます。
しかし、バーコードを作るという、観点から見ると単純に思えてきます。
バーコードのモジュール
バーコードは、最小の幅を1モジュールとして見ます。
黒のバーの太さを1モジュールを基準に幾つ束ねた幅にするか、
また、スペース(白)の幅を何モジュールにするか?
この組み合わせで作られているのです。
例えば
”1”と言う文字を表すのに 黒のバーの幅を2モジュール、スペースを1モジュール、黒のバーを3モジュール・・・・
等と組み合わさって表現されるのです。
多くのバーコード規格は、このようにバーの太さと、スペースの組み合わせの仕様が異なるわけです。
スタート/ストップコード
バーコードのスタート位置、どこからデータになっているのか、
ストップ位置、どこで終わりになっているのか、と言う事で、スタート/ストップコードが必要になります。
チェックビット(デジットコード)
そして、チェックビットです。(一般的なは、チェックデジットと呼んでいるようです。)
チェックビットは、データをもとに計算アルゴリズムによって、コードを生成して、データの最後に書き込みます。
リーダーにより、バーコードを読み取った時に、このアルゴリズムで正確に読めたか確認できます。
CODE128 バーコードの作成
今回、CODE128 のバーコード作成スクリプトを書いてみました。
エクセルVBAでインデザインに図形を書く要領でバーコードを書く事としました。
手順1 文字に対するパターン
まずコード表を探しましょう。
ネット上から、見つける事が出来るでしょう。
文字に対する ”1”/”0” の パターン ’10011100110’ が記載されているものがひつようです。
上記は、数字の 0~3 までのキャラクターの表です。
右側の、Patternは、黒とスペースのモジュールを表しています
CODE128の場合、1文字を11モジュールで表わします。
手順2 モジュール幅を収集します。
文字 1 の場合 10011100110
左から、墨1+空白00+墨111+空白00+墨11+空白0
123221
手順3 描画
インデザインで矩形を並べて行くだけです。
最後にスクリプトを紹介しておきます。
タイプBの仕様で書いています。
手順4 評価テスト
実際に、プリントしたバーコードを確認したいですよね。
バーコード読み取り装置が必要ですが、今はスマホのアプリで、読み取り出来る無料ソフトが入手できます。
数多くのアプリが有ります。私は、タブレットとスマホに異なるアプリを入れてます。
この方法を使用して、他の規格のバーコード作成も容易になるとおもいます。
ぜひ参考にしてみてください。
使用にあたって」の不具合につきましては、責任負いかねません。
自己責任で使用してください。
CODE128 作成スクリプト
今回は、エクセルVBAにて実行するようにしてます。
フォームにボタンを設置し、スクリプトを起動してます。
Private Sub CommandButton1_Click()
Set myIndesign = CreateObject("InDesign.Application")
faill_mei = "ファイルバスに変えてください"
Set myDocument = myIndesign.Open(faill_mei)
'この場合シート3にバーコードにしたいデータが書かれています。
Sheets("sheet3").Select
Range("A1").Select
Selection.End(xlDown).Select
cuntA = ActiveCell
cuntC = 0
A1stFlg = 0
For cuntB = 2 To cuntA Step 1
cuntC = cuntC + 1
If A1stFlg = 1 Then
myDocument.Pages.Add 'ページ追加
Else
A1stFlg = 1
End If
'===============ここから==============================================
'CerNo = Sheet3.Cells(cuntB, 1)
BCODE_IN = Sheet3.Cells(cuntB, 2) 'バーコードに変換のデータを持ってくる
CheckBitPuls = 0
haichi_1_YS = 5 '配置位置
haichi_1_XS = 5 '配置位置
haichi_1_XW = 0.33 '1モジュールバーの太さ
haichi_1_YH = haichi_1_XW * 35.5 'バーの太さを基準に高さを算出
'================-スタートBコード=========="Start B"================
moji2 = ber128_bit("Start B") '"11010010000" モジュール構成の取得
moji = moji2(0)
aa = PatternCode(moji) '"11010010000" ⇒ 211214 黒ー白 モジュール数のカウント
CheckBitPuls = moji2(1) 'CheckBitPuls = 104
For Bea_bit_kuro = 1 To aa(0) Step 1
bb = aa(Bea_bit_kuro)
Set mysikakuBox = myDocument.Pages.Item(cuntC).Rectangles.Add
bc_modori = bcKaKu(mysikakuBox, haichi_1_YS, haichi_1_XS, haichi_1_YH, haichi_1_XW, bb)
Bea_bit_kuro = Bea_bit_kuro + 1
haichi_1_XS = bc_modori(3) + haichi_1_XW * aa(Bea_bit_kuro)
Next
'=======================-バーコードに変換文字=================================
'MsgBox BCODE_IN
BC_DaLen = Len(BCODE_IN)
For BC_DaLenAA = 1 To BC_DaLen Step 1
sumiq1 = Mid(BCODE_IN, BC_DaLenAA, 1)
moji2 = ber128_bit(sumiq1)
moji = moji2(0)
CheckBitPuls = CheckBitPuls + moji2(1) * BC_DaLenAA
'ASK_CODE = Asc(sumiq1)
'If ASK_CODE <= 126 Then
' CheckBitPuls = CheckBitPuls + (ASK_CODE - 32) * BC_DaLenAA
'End If
aa = PatternCode(moji)
For Bea_bit_kuro = 1 To aa(0) Step 1
bb = aa(Bea_bit_kuro)
Set mysikakuBox = myDocument.Pages.Item(cuntC).Rectangles.Add
bc_modori = bcKaKu(mysikakuBox, haichi_1_YS, haichi_1_XS, haichi_1_YH, haichi_1_XW, bb)
Bea_bit_kuro = Bea_bit_kuro + 1
haichi_1_XS = bc_modori(3) + haichi_1_XW * aa(Bea_bit_kuro)
Next
Next
'=======================================--
'===============--------デジットコードチェック デジット無しに変更して利
CheckBitPuls = CheckBitPuls Mod 103
CHNGEASCmoji = ber_wat128(CheckBitPuls)
moji = CHNGEASCmoji
aa = PatternCode(moji)
'MsgBox aa(0) & aa(1) & aa(2) & aa(3) & aa(4) & aa(5) & aa(6) & aa(7)
For Bea_bit_kuro = 1 To aa(0) Step 1
bb = aa(Bea_bit_kuro)
Set mysikakuBox = myDocument.Pages.Item(cuntC).Rectangles.Add
bc_modori = bcKaKu(mysikakuBox, haichi_1_YS, haichi_1_XS, haichi_1_YH, haichi_1_XW, bb)
Bea_bit_kuro = Bea_bit_kuro + 1
haichi_1_XS = bc_modori(3) + haichi_1_XW * aa(Bea_bit_kuro)
Next
'========================"Stop"============ストップコード
moji2 = ber128_bit("Stop")
moji = moji2(0)
aa = PatternCode(moji)
'aa = PatternCode("1100011101011")
'MsgBox aa(0) & aa(1) & aa(2) & aa(3) & aa(4) & aa(5) & aa(6) & aa(7)
For Bea_bit_kuro = 1 To aa(0) Step 1
bb = aa(Bea_bit_kuro)
Set mysikakuBox = myDocument.Pages.Item(cuntC).Rectangles.Add
bc_modori = bcKaKu(mysikakuBox, haichi_1_YS, haichi_1_XS, haichi_1_YH, haichi_1_XW, bb)
Bea_bit_kuro = Bea_bit_kuro + 1
haichi_1_XS = bc_modori(3) + haichi_1_XW * aa(Bea_bit_kuro)
Next
'====================================================
Next
End Sub
Public Function bcKaKu(mysikakuBox, haichi_1_YS, haichi_1_XS, haichi_1_YH, haichi_1_XW, Bea_bit_kuro)
haichi_1_YE = haichi_1_YS + haichi_1_YH
haichi_1_XE = haichi_1_XS + haichi_1_XW * Bea_bit_kuro
mysikakuBox.GeometricBounds = Array(CStr(haichi_1_YS) + "mm", CStr(haichi_1_XS) + "mm", CStr(haichi_1_YE) + "mm", CStr(haichi_1_XE) + "mm")
bcKaKu = Array(haichi_1_YS, haichi_1_XS, haichi_1_YE, haichi_1_XE)
End Function
Public Function PatternCode(moji)
patLen = Len(moji)
'MsgBox patLen
TB_BCODE = Array(0, 0, 0, 0, 0, 0, 0, 0, 0)
tbl_cunt = 1
Sumi = 1
For aa = 1 To patLen Step 1
sumiq1 = Mid(moji, aa, 1)
'MsgBox sumiq1
If Sumi = 1 Then
If sumiq1 = 1 Then
TB_BCODE(tbl_cunt) = TB_BCODE(tbl_cunt) + 1
Else
tbl_cunt = tbl_cunt + 1
Sumi = 0
TB_BCODE(tbl_cunt) = TB_BCODE(tbl_cunt) + 1
End If
Else
If sumiq1 = 0 Then
TB_BCODE(tbl_cunt) = TB_BCODE(tbl_cunt) + 1
Else
tbl_cunt = tbl_cunt + 1
Sumi = 1
TB_BCODE(tbl_cunt) = TB_BCODE(tbl_cunt) + 1
End If
End If
Next
TB_BCODE(0) = tbl_cunt
PatternCode = TB_BCODE
End Function
Public Function ber128_bit(moji)
Select Case moji
Case " "
moji = "11011001100"
BC_Value = 0
Case "!"
moji = "11001101100"
BC_Value = 1
Case """"
moji = "11001100110"
BC_Value = 2
Case "#"
moji = "10010011000"
BC_Value = 3
Case "$"
moji = "10010001100"
BC_Value = 4
Case "%"
moji = "10001001100"
BC_Value = 5
Case "&"
moji = "10011001000"
BC_Value = 6
Case "'"
moji = "10011000100"
BC_Value = 7
Case "("
moji = "10001100100"
BC_Value = 8
Case ")"
moji = "11001001000"
BC_Value = 9
Case "*"
moji = "11001000100"
BC_Value = 10
Case "+"
moji = "11000100100"
BC_Value = 11
Case ","
moji = "10110011100"
BC_Value = 12
Case "-"
moji = "10011011100"
BC_Value = 13
Case "."
moji = "10011001110"
BC_Value = 14
Case "/"
moji = "10111001100"
BC_Value = 15
Case "0"
moji = "10011101100"
BC_Value = 16
Case "1"
moji = "10011100110"
BC_Value = 17
Case "2"
moji = "11001110010"
BC_Value = 18
Case "3"
moji = "11001011100"
BC_Value = 19
Case "4"
moji = "11001001110"
BC_Value = 20
Case "5"
moji = "11011100100"
BC_Value = 21
Case "6"
moji = "11001110100"
BC_Value = 22
Case "7"
moji = "11101101110"
BC_Value = 23
Case "8"
moji = "11101001100"
BC_Value = 24
Case "9"
moji = "11100101100"
BC_Value = 25
Case ":"
moji = "11100100110"
BC_Value = 26
Case ";"
moji = "11101100100"
BC_Value = 27
Case "<"
moji = "11100110100"
BC_Value = 28
Case "="
moji = "11100110010"
BC_Value = 29
Case ">"
moji = "11011011000"
BC_Value = 30
Case "?"
moji = "11011000110"
BC_Value = 31
Case "@"
moji = "11000110110"
BC_Value = 32
Case "A"
moji = "10100011000"
BC_Value = 33
Case "B"
moji = "10001011000"
BC_Value = 34
Case "C"
moji = "10001000110"
BC_Value = 35
Case "D"
moji = "10110001000"
BC_Value = 36
Case "E"
moji = "10001101000"
BC_Value = 37
Case "F"
moji = "10001100010"
BC_Value = 38
Case "G"
moji = "11010001000"
BC_Value = 39
Case "H"
moji = "11000101000"
BC_Value = 40
Case "I"
moji = "11000100010"
BC_Value = 41
Case "J"
moji = "10110111000"
BC_Value = 42
Case "K"
moji = "10110001110"
BC_Value = 43
Case "L"
moji = "10001101110"
BC_Value = 44
Case "M"
moji = "10111011000"
BC_Value = 45
Case "N"
moji = "10111000110"
BC_Value = 46
Case "O"
moji = "10001110110"
BC_Value = 47
Case "P"
moji = "11101110110"
BC_Value = 48
Case "Q"
moji = "11010001110"
BC_Value = 49
Case "R"
moji = "11000101110"
BC_Value = 50
Case "S"
moji = "11011101000"
BC_Value = 51
Case "T"
moji = "11011100010"
BC_Value = 52
Case "U"
moji = "11011101110"
BC_Value = 53
Case "V"
moji = "11101011000"
BC_Value = 54
Case "W"
moji = "11101000110"
BC_Value = 55
Case "X"
moji = "11100010110"
BC_Value = 56
Case "Y"
moji = "11101101000"
BC_Value = 57
Case "Z"
moji = "11101100010"
BC_Value = 58
Case "["
moji = "11100011010"
BC_Value = 59
Case "\"
moji = "11101111010"
BC_Value = 60
Case "]"
moji = "11001000010"
BC_Value = 61
Case "^"
moji = "11110001010"
BC_Value = 62
Case "_"
moji = "10100110000"
BC_Value = 63
Case "`"
moji = "10100001100"
BC_Value = 64
Case "a"
moji = "10010110000"
BC_Value = 65
Case "b"
moji = "10010000110"
BC_Value = 66
Case "c"
moji = "10000101100"
BC_Value = 67
Case "d"
moji = "10000100110"
BC_Value = 68
Case "e"
moji = "10110010000"
BC_Value = 69
Case "f"
moji = "10110000100"
BC_Value = 70
Case "g"
moji = "10011010000"
BC_Value = 71
Case "h"
moji = "10011000010"
BC_Value = 72
Case "i"
moji = "10000110100"
BC_Value = 73
Case "j"
moji = "10000110010"
BC_Value = 74
Case "k"
moji = "11000010010"
BC_Value = 75
Case "l"
moji = "11001010000"
BC_Value = 76
Case "m"
moji = "11110111010"
BC_Value = 77
Case "n"
moji = "11000010100"
BC_Value = 78
Case "o"
moji = "10001111010"
BC_Value = 79
Case "p"
moji = "10100111100"
BC_Value = 80
Case "q"
moji = "10010111100"
BC_Value = 81
Case "r"
moji = "10010011110"
BC_Value = 82
Case "s"
moji = "10111100100"
BC_Value = 83
Case "t"
moji = "10011110100"
BC_Value = 84
Case "u"
moji = "10011110010"
BC_Value = 85
Case "v"
moji = "11110100100"
BC_Value = 86
Case "w"
moji = "11110010100"
BC_Value = 87
Case "x"
moji = "11110010010"
BC_Value = 88
Case "y"
moji = "11011011110"
BC_Value = 89
Case "z"
moji = "11011110110"
BC_Value = 90
Case "{"
moji = "11110110110"
BC_Value = 91
Case "|"
moji = "10101111000"
BC_Value = 92
Case "}"
moji = "10100011110"
BC_Value = 93
Case "~"
moji = "10001011110"
BC_Value = 94
Case "del"
moji = "10111101000"
BC_Value = 95
Case "Fnc 3"
moji = "10111100010"
BC_Value = 96
Case "Fnc2"
moji = "11110101000"
BC_Value = 97
Case "Shift"
moji = "11110100010"
BC_Value = 98
Case "Code C"
moji = "10111011110"
BC_Value = 99
Case "Fnc 4"
moji = "10111101110"
BC_Value = 100
Case "Code A"
moji = "11101011110"
BC_Value = 101
Case "Fnc 1"
moji = "11110101110"
BC_Value = 102
Case "Start A"
moji = "11010000100"
BC_Value = 103
Case "Start B"
moji = "11010010000"
BC_Value = 104
Case "Start C"
moji = "11010011100"
BC_Value = 105
Case "Stop"
moji = "1100011101011"
BC_Value = 106
Case Else
moji = "1100011101011"
BC_Value = 106
End Select
ber128_bit = Array(moji, BC_Value)
End Function
Public Function ber_wat128(moji)
Select Case moji
Case 0
moji = "11011001100"
Case 1
moji = "11001101100"
Case 2
moji = "11001100110"
Case 3
moji = "10010011000"
Case 4
moji = "10010001100"
Case 5
moji = "10001001100"
Case 6
moji = "10011001000"
Case 7
moji = "10011000100"
Case 8
moji = "10001100100"
Case 9
moji = "11001001000"
Case 10
moji = "11001000100"
Case 11
moji = "11000100100"
Case 12
moji = "10110011100"
Case 13
moji = "10011011100"
Case 14
moji = "10011001110"
Case 15
moji = "10111001100"
Case 16
moji = "10011101100"
Case 17
moji = "10011100110"
Case 18
moji = "11001110010"
Case 19
moji = "11001011100"
Case 20
moji = "11001001110"
Case 21
moji = "11011100100"
Case 22
moji = "11001110100"
Case 23
moji = "11101101110"
Case 24
moji = "11101001100"
Case 25
moji = "11100101100"
Case 26
moji = "11100100110"
Case 27
moji = "11101100100"
Case 28
moji = "11100110100"
Case 29
moji = "11100110010"
Case 30
moji = "11011011000"
Case 31
moji = "11011000110"
Case 32
moji = "11000110110"
Case 33
moji = "10100011000"
Case 34
moji = "10001011000"
Case 35
moji = "10001000110"
Case 36
moji = "10110001000"
Case 37
moji = "10001101000"
Case 38
moji = "10001100010"
Case 39
moji = "11010001000"
Case 40
moji = "11000101000"
Case 41
moji = "11000100010"
Case 42
moji = "10110111000"
Case 43
moji = "10110001110"
Case 44
moji = "10001101110"
Case 45
moji = "10111011000"
Case 46
moji = "10111000110"
Case 47
moji = "10001110110"
Case 48
moji = "11101110110"
Case 49
moji = "11010001110"
Case 50
moji = "11000101110"
Case 51
moji = "11011101000"
Case 52
moji = "11011100010"
Case 53
moji = "11011101110"
Case 54
moji = "11101011000"
Case 55
moji = "11101000110"
Case 56
moji = "11100010110"
Case 57
moji = "11101101000"
Case 58
moji = "11101100010"
Case 59
moji = "11100011010"
Case 60
moji = "11101111010"
Case 61
moji = "11001000010"
Case 62
moji = "11110001010"
Case 63
moji = "10100110000"
Case 64
moji = "10100001100"
Case 65
moji = "10010110000"
Case 66
moji = "10010000110"
Case 67
moji = "10000101100"
Case 68
moji = "10000100110"
Case 69
moji = "10110010000"
Case 70
moji = "10110000100"
Case 71
moji = "10011010000"
Case 72
moji = "10011000010"
Case 73
moji = "10000110100"
Case 74
moji = "10000110010"
Case 75
moji = "11000010010"
Case 76
moji = "11001010000"
Case 77
moji = "11110111010"
Case 78
moji = "11000010100"
Case 79
moji = "10001111010"
Case 80
moji = "10100111100"
Case 81
moji = "10010111100"
Case 82
moji = "10010011110"
Case 83
moji = "10111100100"
Case 84
moji = "10011110100"
Case 85
moji = "10011110010"
Case 86
moji = "11110100100"
Case 87
moji = "11110010100"
Case 88
moji = "11110010010"
Case 89
moji = "11011011110"
Case 90
moji = "11011110110"
Case 91
moji = "11110110110"
Case 92
moji = "10101111000"
Case 93
moji = "10100011110"
Case 94
moji = "10001011110"
Case 95
moji = "10111101000"
Case 96
moji = "10111100010"
Case 97
moji = "11110101000"
Case 98
moji = "11110100010"
Case 99
moji = "10111011110"
Case 100
moji = "10111101110"
Case 101
moji = "11101011110"
Case 102
moji = "11110101110"
Case 103
moji = "11010000100"
Case 104
moji = "11010010000"
Case 105
moji = "11010011100"
Case 106
moji = "1100011101011"
End Select
ber_wat128 = moji
End Function