TOP > blog > バーコード CODE128を作成する
インデザイン
2016/10/03

バーコード CODE128を作成する

管理者用
blog

バリアブル印刷の依頼です。可変のバーコードをレイアウトする項目が含まれているようです。
また、バーコードの仕様は、、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


 

 

関連記事