コードの解説_2(Excelでバーコード_7)

Excelでバーコード表示に挑戦する連載の7回目です。前回の記事はコチラです。

hirocom777.hatenadiary.org

前回はコード128のバーコードを作成表示するツールついてご紹介しました。

今回は、このツールのコードの解説です。コードは基本的にシートモジュールに記述されています。

入力更新時のコード

まずはシートの入力変更時の処理です。

'設定変更時の処理をします
Private Sub Worksheet_Change(ByVal Target As Range)
  Select Case Target.Address
  Case Me.Range("TEXT_BLOCK").Address, Me.Range("FONT").Address, Me.Range("TEXT").Address
  Case Me.Range("HEIGHT").Address
    '高さ指定なしの場合は200とします
    If Me.Range("HEIGHT").Value = "" Then
      Me.Range("HEIGHT").Value = 200
      Exit Sub
    End If
  Case Else
    Exit Sub
  End Select
  If Not MakeCode128(Me.Range("TEXT").Text) And Me.Range("TEXT").Text <> "" Then
    MsgBox "バーコード作成できませんでした"
  End If
End Sub

画面で操作するセルには名前が付いています。バーコードにする文字(TEXT,TEXT_BLOCK)や文字のフォントサイズ(FONT)が変更になった場合はバーコードを再描画します。再描画は下にご紹介するファンクションプロシージャMakeCode128にて実行します。また、バーコードの高さ(HEIGHT)が変更されて値が未指定になった場合はデフォルト値に変更されます。

コード128のバーコード作成

つづいてコード128のバーコード作成部分をご紹介します。

'入力変更時の処理をします
Public Function MakeCode128(ByVal textData As String) As Boolean
Dim i As Long, j As Long
  '22文字以上はバーコード作成できません。
  '入力がない場合は表示をクリアします。
   ClearBarCode
  If 22 < Len(textData) Or textData = "" Then
    If 22 < Len(textData) Then MsgBox "22文字以下にしてください"
    Exit Function
  End If
  Application.ScreenUpdating = False
  '表示サイズを調整します。
  If Me.Range("FONT").Value <> "" Then Me.Range("CHAR").Font.Size = Me.Range("FONT").Value
  Me.Range("TEXT_HEIGHT").RowHeight = Me.Range("FONT").Value
  Me.Range("BAR_HEIGHT").RowHeight = Me.Range("HEIGHT").Value
  Me.Range("TEXT").Font.Size = Me.Range("HEIGHT").Value
  Me.Range("MARGIN").RowHeight = Me.Range("HEIGHT").Value / 10
  Me.Range("QUIET_ZONE").ColumnWidth = 0.23 * 15
  '入力を半角文字にします。
  textData = StrConv(textData, vbNarrow)
  '表示するバーをすべて細く設定します。
  Me.Range("BAR_1_1", "BAR_24_6").ColumnWidth = 0.23 ' 1
  If Len(textData) + 2 < 24 Then Me.Range("BAR_" & (Len(textData) + 3) & "_1", "BAR_24_6").Columns.Hidden = True
  'スタートコード(CODE-B)
  Dim barData(24) As String
  barData(0) = GetBarCodePattern("104") 'STARTCODE-B
  Dim checkDigit As Long
  checkDigit = 104
  '入力文字に対応したバーコードを設定します。
  For i = 1 To Len(textData)
    barData(i) = GetBarCodePattern(Mid$(textData, i, 1))
    'バーコード表示できない文字がある場合はバーコード表示をクリアします。
    If barData(i) = "Error" Then
      MsgBox "バーコード表示できません"
      ClearBarCode
      Exit Function
    End If
    checkDigit = checkDigit + CInt(Split(barData(i), ",")(1)) * i
  Next i
  'バーコード情報を表示
  Me.Range("CHAR").UnMerge
  Me.Range("CHAR").Resize(, 6 * (Len(textData) + 1)).Merge
  Me.Range("CHAR").Value = "'" & StrConv(textData, vbWide)
  'チェックデジットを設定します。
  barData(i) = GetBarCodePattern(Format$(checkDigit Mod 103, "000"))
  For i = 0 To Len(textData) + 1
    '太いバーの表示幅を広げます。
    For j = 1 To 6
      Select Case Mid$(barData(i), j, 1)
      Case "1"
      Case "2"
        Me.Range("BAR_" & i + 1 & "_" & j).ColumnWidth = 0.46
      Case "3"
        Me.Range("BAR_" & i + 1 & "_" & j).ColumnWidth = 0.69
      Case "4"
        Me.Range("BAR_" & i + 1 & "_" & j).ColumnWidth = 0.92
      End Select
    Next j
  Next i
  'ストップコードを設定します。2331112
  Me.Range("STOP_1").ColumnWidth = 0.46
  Me.Range("STOP_7").ColumnWidth = 0.46
  Me.Range("STOP_2", "STOP_3").ColumnWidth = 0.69
  Me.Range("STOP_4", "STOP_6").ColumnWidth = 0.23
  Application.ScreenUpdating = True
  'ビットマップデータをクリップボードにコピーします。
  If Me.Range("CLIP_BOARD").Value = "する" Then Me.Range("BAR_CODE").CopyPicture , xlBitmap
  MakeCode128 = True
End Function

バーコード化できる文字数は22文字までです。 バーコードを構成するセルにも名前が付いています。バーコード下の文字表記(CHAR)と文字表記全体の高さ(TEXT_HEIGHT)、バーの高さ(BAR_HEIGHT)、バーコード上下のマージン(MARGIN)を入力内容を基に設定します。バーコード前後のクワイエットゾーン(QUIET_ZONE)は3.45(細いバーの太さ0.23の15本分)で固定です。

1文字を構成するバーの数は6本になります。24文字分(22文字 + スタートコード + チェックデジット)のバーはBAR_1_1~BAR_24_6と名前が付いていて、あらかじめ白黒に着色されています。これらバーの太さを入力された文字にしたがって調整します。実際の変換は次にご紹介するファンクションプロシージャGetBarCodePatternで実施します。

コードの変換

バーコードで表記する文字、または3桁の整数値を表す文字列から、からコードと割り当てられている場番号への変換を実行するファンクションプロシージャです。引数で渡された文字、または3桁の数字から割り当てられている1~4までで構成されるバーコードパターンと番号をコンマ区切りの文字列で返します。このリストは長くなりますので途中は省略します。

Private Function GetBarCodePattern(ByVal textData As String) As String
  Select Case textData
  Case "000", " ": GetBarCodePattern = "212222,0"
  Case "001", "!": GetBarCodePattern = "222122,1"
  Case "002", Chr$(&H22): GetBarCodePattern = "222221,2"
  Case "003", "#": GetBarCodePattern = "121223,3"
  Case "004", "$": GetBarCodePattern = "121322,4"
  Case "005", "%": GetBarCodePattern = "131222,5"
  Case "006", "&": GetBarCodePattern = "122213,6"
  Case "007", "'": GetBarCodePattern = "122312,7"
  Case "008", "(": GetBarCodePattern = "132212,8"
  Case "009", ")": GetBarCodePattern = "221213,9"
  Case "010", "*": GetBarCodePattern = "221312,10"
  Case "011", "+": GetBarCodePattern = "231212,11"
                      ・
                      ・
                      ・
  Case "098":      GetBarCodePattern = "411311,98"
  Case "099":      GetBarCodePattern = "113141,99"
  Case "100":      GetBarCodePattern = "114131,100"
  Case "101":      GetBarCodePattern = "311141,101"
  Case "102":      GetBarCodePattern = "411131,102"
  Case "103":      GetBarCodePattern = "211412,103" 'STARTCODE-A
  Case "104":      GetBarCodePattern = "211214,104" 'STARTCODE-B
  Case "105":      GetBarCodePattern = "211232,105" 'STARTCODE-C
  Case Else 'エラー
    GetBarCodePattern = "Error"
  End Select
End Function

Excelでバーコードを表示してました

いかがでしょうか。なかなか便利なツールに仕上がったと自負しています。Excelでバーコード表示に挑戦する連載はこれで終了です。ありがとうございました!!

Excelでバーコード表示に挑戦する連載はコチラから