リストからタックシールを作成

ラボ

リストからタックシールを作成

 シート上のリストからタックシールの並びにデータを転記するプログラムです。今回は1シート6枚のタックシールのフォーマット用にデータを配置したいと思います。

 実際には、タックシールごとの位置調整が必要になったりしますが、ここでは、データの切り出しや配置に注目したプログラミングを示します。

ソースコード

Sub makeTacSeal()

    Dim i As Long, pos As Long, cnt As Long
    Dim ds As Worksheet
    Dim ws As Worksheet
    Dim lastRow As Long

    Set ds = Worksheets("data")
    lastRow = ds.Cells(Rows.Count, 1).End(xlUp).Row
    cnt = 1
    For i = 2 To lastRow
        pos = (i - 2) Mod 6       'pos -> 0,1,2,3,4,5
        Select Case pos
            Case 0
                '新しいシートを原本からコピー
                Worksheets("原本").Copy After:=Sheets(Sheets.Count)
                ActiveSheet.Name = "タックシール" & cnt
                cnt = cnt + 1
                Set ws = Worksheets(ActiveSheet.Name)
                
                ws.Cells(3, "B") = ds.Cells(i, "B") '郵便番号
                ws.Cells(4, "B") = ds.Cells(i, "C") '住所1
                ws.Cells(5, "B") = ds.Cells(i, "D") '住所2
                ws.Cells(7, "B") = ds.Cells(i, "A") & " 様" '氏名
            
            Case 1
                ws.Cells(3, "D") = ds.Cells(i, "B") '郵便番号
                ws.Cells(4, "D") = ds.Cells(i, "C") '住所1
                ws.Cells(5, "D") = ds.Cells(i, "D") '住所2
                ws.Cells(7, "D") = ds.Cells(i, "A") & " 様" '氏名
            
            Case 2
                ws.Cells(9, "B") = ds.Cells(i, "B") '郵便番号
                ws.Cells(10, "B") = ds.Cells(i, "C") '住所1
                ws.Cells(11, "B") = ds.Cells(i, "D") '住所2
                ws.Cells(13, "B") = ds.Cells(i, "A") & " 様" '氏名
            
            Case 3
                ws.Cells(9, "D") = ds.Cells(i, "B") '郵便番号
                ws.Cells(10, "D") = ds.Cells(i, "C") '住所1
                ws.Cells(11, "D") = ds.Cells(i, "D") '住所2
                ws.Cells(13, "D") = ds.Cells(i, "A") & " 様" '氏名
            
            Case 4
                ws.Cells(15, "B") = ds.Cells(i, "B") '郵便番号
                ws.Cells(16, "B") = ds.Cells(i, "C") '住所1
                ws.Cells(17, "B") = ds.Cells(i, "D") '住所2
                ws.Cells(19, "B") = ds.Cells(i, "A") & " 様" '氏名
            
            Case 5
                ws.Cells(15, "D") = ds.Cells(i, "B") '郵便番号
                ws.Cells(16, "D") = ds.Cells(i, "C") '住所1
                ws.Cells(17, "D") = ds.Cells(i, "D") '住所2
                ws.Cells(19, "D") = ds.Cells(i, "A") & " 様" '氏名
            
        End Select
    Next i
End Sub

 まずはデータシート用のワークシート変数を用意します。次にデータリストの行数分ループさせるために、最終行を取得します。
 最終行の取得は、常套句である以下のものを使います。 
   Cells(Rows.Count, 1).End(xlUp).Row
1は列番号ですから今回はAの最終行を取得しています。

 カウンタ変数 i を2行目から最終行までループさせ、Cellsの行数として使う事にします。

 posという変数は、タックシールの場所を示す値です。posは 0,1,2,3,4,5 と変化していくようにプログラムします。

 pos = (i – 2) Mod 6

 式は上記のようにしました。Modというのは割り算の余りを返す演算子ですが、今回のようにだんだん増えていく値に対して、0から5までというような区間を繰り返したい時にはよく使います。
 i – 2 としているのは、i が2行目から始まっているためです。括弧を忘れると計算値は全く違うものになりますので注意しましょう。
 あとは Select Case文で分岐させていきます。Case文はいちいち位置を指定しているため少々単調な感じがしますが、わかりやすいのでこのままにしています。

 尚、Case 0 の初回は、タックシールの入った原本シートをコピーして新たなシートを作成して値を転記していきます。コピーメソッドを実行した直後はコピーで生成されたシートがアクティブになるので、そのタイミングでシートに名前を付けています。

シートでの書式設定

 タックシール一枚一枚の書式設定は、原本シートで行っておけば、そのままコピーされますので便利です。

 住所の部分は、左詰めインデントで1として、書き始めをずらしています。

タックシール印刷プログラムで苦労した事

 タックシールプログラムで苦労するのは、印刷時に位置がずれてしまう所です。Excelのバージョンにもよりますが、ファイルを渡した先で上手く印刷できなかったりと印刷のずれには悩まされた記憶があります。
解決策としては、ある程度できた状態でPDFファイルにして渡すのが良いと思います。

 今回はCSVファイルからのデータ読込や、別データを読み込む際に以前のシートを削除するなどの機能は割愛しましたが、使い勝手の良いツールにするためには他にも工夫が必要になります。

コメント

タイトルとURLをコピーしました