Excel-VBAによるバーコード生成プログラム-No.4

こんにちは、Ryoです。

さて、今回はNo.3に続き、code39フォントに置換し画像化した
バーコードをラベル様式に反映する「c.印刷様式への貼付け」
「d.処理中の画像等クリア」について解説していきます。

ちなみに記事のNo.1はここから、No.2はこちらから、No.3はこの辺りから行けます。



1.Excel画面

【印刷ボタン】を画像の下に設置し、これから作成するコードを登録します。

別Sheetの名前をここでは「ラベル印刷用」として作っています。
セル幅等は以下の通りです。

  • 列幅:24.13
  • 行の高さ:79.25
  • 余白上、下:0.9
  • 余白右、左:0.8
  • 用紙サイズ:A4

ラベルシールはスリーエムジャパン株式会社(A-one)品番28388 44面 一片サイズ48.3*25.4mm レーザープリンタ用を使用しています。

2.コード全体

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

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), "図") = 1 Then
                  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

では、各コードについて解説していきます。

3.コード解説

ここでは画像化したバーコードを印刷用ラベルシート様式へ貼付ける処理を行います。

先ず生成された文字情報をクリアして画面を固定化し、バーコード画像の情報
(名前)取得とコピーを行います。

   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

ここからラベル様式に合わせた位置に画像の貼付けを行っていきます。
先ずSheet内に残された画像を削除し、初期位置を選択します。

   Call Picture_Del
     
   Cells(1,1).Select

貼付け位置と画像のリネーム用変数を指定します。
Lは貼り付け位置(Left)の補正用、nmは画像リネーム管理用です。

   L = 0  

    nm = 100  

今回使用するラベルは4列×11行となっていますので、位置をシフトしながら
貼付けを行っていきます。
必要回数の繰り返し処理と開始位置に画像を貼付けて、名前情報を取得します。

   For e = 1 To 4 '//ラベル4列//

        For i = 1 To 11  '//ラベル11行//

           Ct = Ct + 1

           ActiveSheet.Paste

           Bn = Selection.Name

貼付けの処理を行った画像は選択された状態になっていますので、取得した
画像名に対しリネームを行います。

    With ActiveSheet.Shapes(Bn)
        
               .Name = "Picture" & nm + Ct
        
       End With

リネームした画像を改めて指定し印字部に合わせて位置調整を行います

リネーム理由ですが、最初に生成したにバーコード画像を元にして
コピーし貼付けていきますので、画像名が貼付け処理する度に
「同じ名前」となることから処理上変更する必要がある為です。

初期位置に貼付けた画像を.Topと.Leftで位置を指定します。
その後、次の行(この場合+78.8)位置をシフトし11行分繰り返します。

     With ActiveSheet.Shapes("Picture" & nm + Ct)
        
              .Top = T + 13.5
        
           .Left = L + 13.75
      
         End With

            T = T + 78.8

       Next i

1列分11行の貼付けが完了したら、Top位置を0とし、Left位置をシフト
(この場合+148)し、次行の処理を開始するという繰り返し処理になります。

     
      T = 0
     
   L = L + 148
   
  Next e

貼付け処理完了後、画面固定化解除を行って処理終了となります。

 Range("A1").Select

  Application.ScreenUpdating = True
    
End Sub  

ここまでの処理を「印刷ラベル反映」ボタンに登録してありますので、
押すと様式に4×11枚分のバーコード画像が貼り付けられます。

次にクリア処理部分について解説します。

バーコード生成~ラベル様式貼付けまでのコード内で見かける
Call Clear_bcとCall Picture_Delについて簡単にご説明します。

当処理はそれぞれのコード内で実行すれば済むのですが、実行したい箇所で
何度も同じコードを記述するのは手間ですし、修正があると面倒なことに
なりますので、単純動作で完結する処理は分けた方が後々楽になります。

先ずClear_bcの目的は、バーコード生成する際に以前のデータが残っていると
間違いやすいことと紛らわしい為、必要なくなった情報を消しています。

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), "図") = 1 Then

                  ActiveSheet.Shapes(strName(i)).Delete

               End If
      Next i
    
    Range(Cells(23, 3), Cells(25, 3)).ClearContents

    Application.ScreenUpdating = True

End Sub

次にPicture_Delですが、ラベル様式側に以前生成した画像が残っていると
手動で消去する手間があったり、そのまま実行すると画像に画像が重なって
いきますので、いつしか異常に重いファイルになったりします。

その為、印刷ラベル反映処理実行時に対象シートに存在するpictureファイル
全てを抽出して削除を実行するものです。

この処理を単独で完結しておくと「画像消去」等のボタンを作って登録すれば
手動で全てクリアすることも出来ます。

Sub Picture_Del()

  Dim Shp As Shape
  
  For Each Shp In ActiveSheet.Shapes

    If Shp.Type = msoPicture Then Shp.Delete

  Next Shp
  
End Sub

以上になります。




取り扱う製品やバーコード化したい目的によって形や表示は様々なので、
ピンポイントでニーズにマッチするものではないと思いますが、ご検討の
一助や何かのお役に立てれば幸いです。

Ryo

スポンサーリンク
スポンサーリンク

楽天トラベル

シェアする

フォローする

スポンサーリンク

楽天トラベル