36歳からの、ぼうけんのしょ

自分が後で見返したくなるようなブログ

【VBAで業務改善ツール】顧客リストから宛名シールを簡単に印刷する!

うちの会社では、年始になるとほとんどのお客さんに資料を送付する、という業務が発生します。
具体的な数はわからないんですが、全顧客が900社ぐらいですので、
少なく見積もっても半分の450社には送ってますね。

資料を送るときにめんどくさいのが
「宛名を書く」
ということなのですが、非IT企業であるからか、みんなそこは根性で書ききってます。

たまに宛名シールをうまく活用している人もいるのですが、
宛名シールを印刷するエクセルやワードにひたすらコピペを繰り返してるとのことでした。

めっちゃめんどくさいことしてるなーと思いつつ、今まではそのままにしてたんですが、
ちょっと僕も手伝うことになってきたので思い切ってツールを作りました。

とは言えそんなに仰々しいものではなく、
顧客リストに新たに列を作り、
そこに数字が入ってたら印刷シートにコピペする、
そして印刷!という簡単なものです。

全体のコードはこんな感じ。

Sub printLabel()
    
    '変数定義===========
    Dim ws_main As Worksheet
    Dim ws_print As Worksheet
    Dim last_row As Variant
    Dim print_row As Variant
    Dim print_column As Variant
    Dim page_count As Variant
    Dim cnt As Variant
    Dim i As Integer
    '===================
    
    '変数設定===========
    Set ws_main = Worksheets("顧問先")
    Set ws_print = Worksheets("印刷")
    last_row = ws_main.Range("A1048576").End(xlUp).Row
    print_row = 1
    print_column = 1
    
    cnt = 0
    
    '===================
    
    '1. 印刷シートのデータを削除
    ws_print.Range("A:G").ClearContents

    
    '2. 顧問先シートから必要な情報を印刷シートへコピー&ペースト
    For i = 2 To last_row
        page_count = ws_main.Cells(i, 11).Value
        If page_count <> 0 Then
            ws_print.Cells(print_row, print_column).Value = ws_main.Cells(i, 2).Value                                           '郵便番号
            ws_print.Cells(print_row + 1, print_column).Value = ws_main.Cells(i, 3).Value & ws_main.Cells(i, 4).Value           '都道府県+市区町村名等
            ws_print.Cells(print_row + 2, print_column).Value = ws_main.Cells(i, 5).Value                                       'ビル名等
            ws_print.Cells(print_row + 4, print_column).Value = ws_main.Cells(i, 6).Value & " " & ws_main.Cells(i, 7).Value    '会社名+敬称
            
            '印刷する対象列を移動
            print_column = print_column + 2
            
            '宛名ラベルの4列目まで終わったら1列目へ移動
            If print_column = 9 Then
                print_column = 1
                cnt = cnt + 1
                
                '郵便番号行は6行ごとにペーストするが、印刷ページをまたぐとき(=宛名の4列目から次のページへいくとき)は5行下にペーストする
                If cnt = 5 Then
                    print_row = print_row + 5
                    cnt = 0
                Else
                    print_row = print_row + 6
                End If
            End If
            
        End If
    Next


    '3. 印刷シートを印刷
    ws_print.PrintOut
    
End Sub


一番ややこしかったのが、
「宛名シールのサイズに合わせて出力する」
ということであり、コードより見た目の調整にめっちゃ時間かかりました(笑)

ただ、その調整があまりにも難しかったので完璧に宛名シールと一致はしておらず、
そのせいか微調整のための列を入れたり、
宛名シールの1枚目から2枚目に印刷範囲が移動するあたりの行を設定する、
というコードがややこしかった…

ちなみにエクセルはこんな感じ。


f:id:ryota_biz:20210121180828p:plain
これが顧客リスト。


f:id:ryota_biz:20210121180822p:plain
これが印刷されるシート。


この、印刷されるシートの29行目から30行目(宛名シールの1枚目から2枚目)にいくとき、
通常は6行で1会社なんですが、宛名シールの最後だけ5行で1会社なんですよね。

それがややこしかった…

宛名シールのサイズにちょうど合うように設定してからやればいいんでしょうけど、
その時間がなかったので暫定ということで…

業務改善のためのツール作りが一番楽しいな~