同人誌にバーコードを付ける。2
以前のエントリで書いた、フリーバーコードフォント用文字列書き出しプログラムの続きです。
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