こんにちは、Ryoです。
今回Excel-VBAでバーコードフォント(code39)を使った生成プログラムを作成しましたので、
ご紹介と解説をしていきたいと思います。
VBA命令文等の詳細な解説は今回割愛しますが、記事内のコードをそのまま使ってもらえれば
普通に動作すると思いますので、ご参考にしていただければ幸いです。
今後、普段よく使用するVBAコマンド等は追々ご紹介と解説の投稿していこうと思います。
1.概要
簡単な様式ですが「code」「Number」「Type」に入力された情報と日付データを統合して
バーコード用文字列を生成し、その文字をバーコードフォントで置換、画像化します。
画像化する理由は印刷様式に位置調整して貼り付ける記述が楽だからですね。
「バーコード種類」欄は今回code39のみで製作していますので、表示用みたいなものです。
上の入力画面で表示しきれていないのですが、バーコード生成後に印刷用ラベルに
合わせた様式へ貼付ける形にしています。
概要としては以上になりますので、これから解説していきたいと思います。
2.使用環境と準備事項
- OS:Windows7,Windows10は動作確認済みです。
- Excel :Office2010で作成しています。
- Excel Sheet:「バーコード出力」と「ラベル印刷用」の2Sheet
- 印刷ラベル:スリーエムジャパン株式会社(A-one)品番28388 44面 一片サイズ48.3*25.4mm レーザープリンタ用
- Font :Fonts2Uさんの「C39HrP48DhTt フォント」を今回使用します。
フォントのダウンロードはこちらになります。
では、先ずバーコードフォントのインストールについてご説明します。
リンク先で①「C39HrP48DhTt フォント」の②ダウンロードをクリックして、
③の保存を実施してください。
その後、保存先を確認するとzipファイルで「c39hr」というフォルダがありますので、
展開(解凍)してからフォルダ内にある①フォントファイル「c39hrp48dhtt」をPCの
②「コントロールパネル」⇒「フォント」内へドラッグすればインストールされます。
フォントのインストールが完了すれば準備完了です。
3.VBAコード構成
コードとしては以下のa~dの構成になっています。
今回のNo.1では全体の概要をざっとご紹介して、No.2以降の記事から各々解説します。
- バーコード文字生成
- バーコードフォント置換、画像化
- 印刷様式への貼付け
- 処理中の画像等クリア
a.バーコード文字生成パート
Sub Character_generation() Dim Bcode, CompType As String Dim Code As Variant Dim D As Long Dim rng As Range Range(Cells(13, 2), Cells(13, 4)).ClearContents Set rng = Range("B5:D5") If WorksheetFunction.CountA(rng) < 3 Then MsgBox "バーコード生成に必要な情報が入力されていません", vbCritical Exit Sub End If '//文字生成時に入力されている欄をクリアにする// Call Clear_bc code = Cells(5, 2) '//Typeの頭文字を抜き取る// CompType = Mid(Cells(5, 4), 1, 1) D = Format(Cells(8, 4), "yyyymd") '//各々読み込んだデータを連結// Bcode = CompType & code & D '//連結した文字列を指定セルに表示する// Cells(13, 2) = Bcode End Sub
ここではバーコード化したい文字を読み込み連結する処理を行っています。
今回はExcel表内のTypeの頭文字とcode、日付データをバーコード文字、Numberを
バーコード上部に表示させる情報としています。
b.バーコードフォント置換、画像化
Sub bcode_base() Dim i As Integer Dim barcode As String Dim barcode_type As String Dim strName(10) As Variant Application.ScreenUpdating = False If Cells(13, 2) = "" Then MsgBox "バーコード文字が生成されていません", vbCritical Exit Sub End If Call Clear_bc '//バーコード化する文字列の読み込み// barcode = ActiveSheet.Cells(13, 2).Value '//PartNumberはバーコード上部に表示する為、格納// p_name = ActiveSheet.Cells(5, 3).Value '//バーコード化するFontTypeを読み込み(code39)// barcode_type = ActiveSheet.Cells(7, 4).Value Cells(23, 3).Value = "No." & p_name Cells(23, 3).ShrinkToFit = True With Cells(24, 3) .Value = "*" & barcode & "*" '//インストールされたFontNameと合わせること// .Font.Name = "c39hrp48dhtt" .Font.Size = 42 .NumberFormat = "@" '入力された値をそのまま表示 .HorizontalAlignment = xlCenter .Select .CopyPicture Appearance:=xlScreen, Format:=xlPicture .ClearContents End With ActiveSheet.Paste '//貼り付けたバーコード画像情報を取得// For i = 1 To ActiveSheet.Shapes.Count strName(i) = ActiveSheet.Shapes(i).Name If InStr(strName(i), "Picture") = 1 _ Or InStr(strName(i), "図") = 1 Then '//バーコード画像のTop座標を取得// St = ActiveSheet.Shapes(strName(i)).Top With ActiveSheet.Shapes(strName(i)) '//縦横比のロック解除// .LockAspectRatio = False '//Font変換は縦が短い為、画像を引き延ばす// .Height = 55 '//引き延ばした画像を既定位置に移動する// .Top = St - 5 End With Cells(23, 3).Select '//貼り付けたバーコード画像とNumber, 'バーコード文字を併せて画像化する// Range(Cells(23, 3), Cells(24, 3)).CopyPicture _ Appearance:=xlScreen, Format:=xlPicture Cells(23, 3).ClearContents ActiveSheet.Shapes(strName(i)).Delete End If Next i '//Number、バーコード、文字が含まれた画像を貼り付ける// ActiveSheet.Paste Cells(13, 2).Select Application.ScreenUpdating = True End Sub
ここでは生成した文字列をバーコードフォントに置換し、「Number」に入力された情報と
合わせて画像化する処理を行っています。
画像化する目的はバーコードフォント置換後のバランス調整とNumber文字との合成です。
c.印刷様式への貼付けパート
Sub Label_print() '//画像化したバーコードを印刷用ラベルシートへ反映する// Dim strName(50) As Variant Dim Bn As Variant Dim Ct,b,e,nm As Integer Dim T,L As Double Range(Cells(13, 2), Cells(13, 4)).ClearContents Application.ScreenUpdating = False Ct = 0 '//バーコード生成画面で作成した画像情報の取得とコピー実行// For b = 1 To ActiveSheet.Shapes.Count strName(b) = ActiveSheet.Shapes(b).Name If InStr(strName(b), "Picture") = 1 _ Or InStr(strName(b), "図") = 1 Then ActiveSheet.Shapes(strName(b)).Copy Bn = strName(b) Ct = Ct + 1 End If Next b If Ct <> 1 Then MsgBox "バーコード画像が生成されていません", vbCritical Exit Sub End If Call Clear_bc Application.ScreenUpdating = False Erase strName Worksheets("ラベル印刷用").Activate '//初期に残データや画像をすべて除去する// Call Picture_Del Range("A1").Select L = 0 '//貼り付け位置(Left)補正用// nm = 100 '//貼り付け画像のリネーム管理用// For e = 1 To 4 '//ラベル4列// For i = 1 To 11 '//ラベル11行// Ct = Ct + 1 ActiveSheet.Paste Bn = Selection.Name '//貼り付けた画像はSelect状態にあり、画像名を取得// With ActiveSheet.Shapes(Bn) '//取得した画像名をReNameする(Copy画像は全てName同一の為)// .Name = "Picture" & nm + Ct End With '//ReNameした画像を指定する// With ActiveSheet.Shapes("Picture" & nm + Ct) '//貼り付け位置をラベル印字部に合わせてシフトする// .Top = T + 13.5 .Left = L + 13.75 End With T = T + 78.8 Next i '//Topは列完了後に初期位置に戻る// T = 0 L = L + 148 Next e Cells(1,1).select Application.ScreenUpdating = True End Sub
ここでは画像化したバーコードを印刷用ラベルシート様式へ貼付ける処理を行います。
画像を初期位置(セルA1)に貼り、コピーしながら移動して規定位置に貼付けする
処理としています。
d.処理中の画像クリア等
◆バーコード生成用シートの旧データや画像クリア
Sub Clear_bc() '//バーコード生成実行時の画面クリア用// Dim strName(10) As Variant Application.ScreenUpdating = False For i = 1 To ActiveSheet.Shapes.Count strName(i) = ActiveSheet.Shapes(i).Name If InStr(strName(i), "Picture") = 1 _ Or InStr(strName(i), "図") = 1Then ActiveSheet.Shapes(strName(i)).Delete End If Next i Range(Cells(23, 3), Cells(25, 3)).ClearContents Application.ScreenUpdating = True End Sub
◆ラベル様式側の旧画像クリア
Sub Picture_Del() '//ActiveSheet内のPicture画像をすべて削除する// Dim Shp As Shape For Each Shp In ActiveSheet.Shapes If Shp.Type = msoPicture Then Shp.Delete Next Shp End Sub
これらは一連の処理実行中に不要となるデータや画像を削除する為のものです。
以上がフォントを用いたVBAコード全体になります。
最初は本記事で全て解説まで書こうと思っていましたが、かなり長くなりそうなので
4記事に分けて書いていきますので、宜しくお願いします。
Ryo