読者です 読者をやめる 読者になる 読者になる

同人誌にバーコードを付ける。2

執筆 開発 プログラミング ExcelVBA


以前のエントリで書いた、フリーバーコードフォント用文字列書き出しプログラムの続きです。
JANコード標準13桁、短絡8桁とチェックディジット算出に対応まで。
まだExcelマクロの標準モジュールでしか動いていないので、次はVBSに対応させる予定です。


BarFont.bas

'
'   BarFont(JAN)補助モジュール
'
'   version 0.02
'   Jan 05, 2014
'
'   by REGEKATSU
'
'   release
'
'   version 0.02
'   JANコード標準なら12〜13桁、短絡なら7〜8桁での入力に対応しています
'   (チェックディジットの計算機能が備わっています。)。
'
'   version 0.01
'   JANコード13桁のみ対応しています。12桁での入力には対応していません
'   (チェックディジットの計算機能はありません。)。
'

'入力ボックスに指定されたJANコード標準13桁又は短絡8桁に対するバーコード表示用文字列を、
'同じく入力ボックスに出力します。
'入力無しかキャンセルボタンをクリックすることで、処理が終了します。
Public Sub JanCodeToFontChar()
    
    Const DEFAULT_PROMPT As String = "JANコード標準13桁又は短絡8桁を入力してください。"
    Dim prompt As String
    prompt = DEFAULT_PROMPT
    Dim promptNoUseLongBar As String
    Dim inputNoUseLongBar As Boolean
    Dim inputCode As String
    inputCode = ""
    
    Do
        inputCode = InputBox(prompt, "バーコードフォント、表示用変換マクロ", inputCode)
        If inputCode Like "############" Or inputCode Like "#############" Or _
            inputCode Like "#######" Or inputCode Like "########" Then
            prompt = DEFAULT_PROMPT & vbCrLf & vbCrLf & "前回入力JANコード: " & inputCode & vbCrLf
            If MsgBox("バーコードの高さを均一に揃えますか?" & vbCrLf & vbCrLf & _
                "はい(Y): 同サイズ, いいえ(N): ロング", vbYesNo Or vbQuestion, _
                "指定") = vbYes Then
                inputNoUseLongBar = True
                promptNoUseLongBar = "同サイズ"
            Else
                inputNoUseLongBar = False
                promptNoUseLongBar = "ロング"
            End If
            prompt = prompt & "前回バーコードサイズ: " & promptNoUseLongBar & vbCrLf
            inputCode = ConvertFontChar(inputCode, inputNoUseLongBar)
            prompt = prompt & "前回表示用文字列: " & inputCode
            MsgBox "変換が完了しました。", vbInformation, "完了"
        ElseIf inputCode <> "" Then
            MsgBox "入力に誤りがあります。", vbCritical, "エラー"
        End If
    Loop While inputCode <> ""
    
End Sub

'指定したJANコード標準13桁又は短絡8桁に対する、チェックディジットを返します。
'
'パラメータ janCode:        バーコードの文字列。
'                           標準なら12〜13桁、短絡なら7〜8桁で指定
'戻り値     チェックディジット1桁の文字列。
'           指定に誤りがあれば空白スペースを返す
'
Public Function CalcCheckDigit(janCode As String) As String
    Dim i, j As Integer
    Dim checkOdd As Integer
    Select Case Len(janCode)
        '短絡8桁の場合。
        Case 7, 8
            For i = 1 To 7
                '奇数桁が何文字目か調べる
                '(チェックデジットを除いた1番右側より奇数桁、右から2番目を偶数桁…と数える。)。
                If i Mod 2 = 1 Then
                    checkOdd = 1
                Else
                    checkOdd = 0
                End If
                '奇数桁の数を3倍に、偶数桁の数を1倍にして全てを合計する。
                j = j + (Asc(Mid(janCode, i, 1)) And &HF) * (1 + 2 * checkOdd)
            Next
            '合計の1の位を10から引いた数がチェックディジットなので、戻り値として返す。
            CalcCheckDigit = Chr$(48 + (10 - (j Mod 10)) Mod 10)
        '標準13桁の場合。
        Case 12, 13
            For i = 1 To 12
                '奇数桁が何文字目か調べる
                '(チェックデジットを除いた1番右側より奇数桁、右から2番目を偶数桁…と数える。)。
                If i Mod 2 = 0 Then
                    checkOdd = 1
                Else
                    checkOdd = 0
                End If
                '奇数桁の数を3倍に、偶数桁の数を1倍にして全てを合計する。
                j = j + (Asc(Mid(janCode, i, 1)) And &HF) * (1 + 2 * checkOdd)
            Next
            '合計の1の位を10から引いた数がチェックディジットなので、戻り値として返す。
            CalcCheckDigit = Chr$(48 + (10 - (j Mod 10)) Mod 10)
        '標準13桁又は短絡8桁以外の桁数だった場合。
        Case Else
            '指定に誤りがあるので空白スペースを、戻り値として返す。
            CalcCheckDigit = " "
    End Select
End Function

'BarFont(JAN)を利用した、バーコード描画関数です。
'指定したJANコード標準13桁又は短絡8桁、及びロングバーの有無に対する、
'バーコード表示用文字列を返します。
'
'JANコード標準なら12〜13桁、短絡なら7〜8桁での入力に対応しています
'(チェックディジットの計算機能が備わっています。)。
'
'パラメータ janCode:        バーコードの文字列。
'                           標準なら12〜13桁、短絡なら7〜8桁で指定
'           noUseLongBar:   ロングバーを使わない場合True
'戻り値     バーコードで表現される文字列
'           指定に誤りがあればNULL文字列を返す
'
Public Function ConvertFontChar(janCode As String, noUseLongBar As Boolean) As String
    
    '変換文字列用変数。
    Dim janConv As String
    janConv = ""
    
    'JANコード13桁用、パリティビット算出用テーブル。
    Dim combiTable(2 To 7) As Byte
    combiTable(2) = 32
    combiTable(3) = 16
    combiTable(4) = 8
    combiTable(5) = 4
    combiTable(6) = 2
    combiTable(7) = 1
    Dim prifixTable(9) As Byte
    prifixTable(0) = 0  '000000b
    prifixTable(1) = 11 '001011b
    prifixTable(2) = 13 '001101b
    prifixTable(3) = 14 '001110b
    prifixTable(4) = 19 '010011b
    prifixTable(5) = 25 '011001b
    prifixTable(6) = 28 '011100b
    prifixTable(7) = 21 '010101b
    prifixTable(8) = 22 '010110b
    prifixTable(9) = 26 '011010b
    
    '左ガイドバーをセットする。
    janConv = janConv & Chr$(&H29 - noUseLongBar - 1)
    Dim i As Integer
    Select Case Len(janCode)
    '短絡8桁の場合。
    Case 7, 8
        janCode = Mid(janCode, 1, 7) & CalcCheckDigit(janCode)
        '左側4桁に対する、キャラクタをセットしていく。
        For i = 1 To 4
            janConv = janConv + Chr$(Asc(Mid(janCode, i, 1)) + &H20)
        Next
        'センターバーをセットする。
        janConv = janConv & Chr$(&H2B - noUseLongBar - 1)
        '右側6桁に対するキャラクタをセットする。
        janConv = janConv & Mid(janCode, 5, 4)
    '標準13桁の場合。
    Case 12, 13
        janCode = Mid(janCode, 1, 12) & CalcCheckDigit(janCode)
        '左側7桁に対する、パリティビットに基づいたキャラクタをセットしていく。
        Dim parityCheck, x As Integer
        '左1文字目を取得して、使用するパリティテーブルを決定する。
        x = Asc(Mid(janCode, 1, 1)) And &HF
        '使用するパリティテーブルに基づいて2〜7文字目の、奇数または偶数パリティのキャラクタをセットしていく。
        For i = 2 To 7
            parityCheck = 0
            If (combiTable(i) And prifixTable(x)) = 0 Then parityCheck = 1
            janConv = janConv + Chr$(Asc(Mid(janCode, i, 1)) + &H10 + (&H10 * parityCheck))
        Next
        'センターバーをセットする。
        janConv = janConv & Chr$(&H2B - noUseLongBar - 1)
        '右側6桁に対するキャラクタをセットする。
        janConv = janConv & Mid(janCode, 8, 6)
    '指定に誤りがあった場合。
    Case Else
        janConv = ""
    End Select
    '右ガイドバーをセットする。
    If janConv <> "" Then janConv = janConv & Chr$(&H29 - noUseLongBar - 1)
    
    '変換文字列を返す。
    ConvertFontChar = janConv
    
End Function