5/16/2019

Excel。納品書のデータを納品書一覧に転記するならExcel VBAでやっちゃいましょう。【Posting】

Excel。納品書のデータを納品書一覧に転記するならExcel VBAでやっちゃいましょう。

<マクロ:Exce VBA>

納品書や請求書など、Excelで作成して印刷なんてことをしている会社も多いかと思います。

発行するたびに、シート別で保管するとか、ファイルごとで保管するなど様々な方法で保存をするのですが、例えば、次のような一覧表に発行したものを転記するような保存方法の場合、いちいち、コピー&ペーストするのは、非常に面倒ですし、効率も悪いと思います。

単純で面倒な処理こそ威力を発揮するのが、マクロ。
Excel VBAを使うことで、時短も効率も改善できる可能性が高くなります。

【Excel VBAの構文を確認してみよう】

次のような構文を作ってみました。
Sub シート転記()
    Dim last_row As Long
    Dim i As Integer
    last_row = Worksheets("納品一覧").Range("a1").CurrentRegion.Rows.Count
   
    For i = 1 To 6 '納品書の案件最大数が6件(6行)
        If Range("A" & i + 10).Value <> "" Then  '納品書の1件目がA11
            '受注番号
            Range("F3").Copy Worksheets("納品一覧").Range("A" & last_row + i)
           
            '発送日
            Range("F4").Copy Worksheets("納品一覧").Range("B" & last_row + i)
           
            '顧客名
            Range("A3").Copy
            Worksheets("納品一覧").Range("C" & last_row + i).PasteSpecial xlPasteValues
           
            '納品書1件
            Range("B" & i + 10).Resize(1, 5).Copy
            Worksheets("納品一覧").Range("D" & last_row + i).PasteSpecial xlPasteValues
            Application.CutCopyMode = False
           
        End If
    Next
End Sub

では、実行してみましょう。

このように、転記することができています。
まず、構文の内容を確認していきましょう。

Dim last_row As Long
Dim i As Integer
last_row = Worksheets("納品一覧").Range("a1").CurrentRegion.Rows.Count

変数宣言ですね。
納品一覧データの件数の下に貼り付けますので、データの件数が必要になります。その数値を、last_rowに格納します。
Range("a1").CurrentRegion.Rows.Count
で、納品一覧の表の行数を数えることができますね。

For i = 1 To 6~NEXT
納品書の案件最大数が6件です。
要するに、納品書は最大6件ですから、6回繰り返すように設定します。
もし、納品書の行数が10件記入できるようでしたら、10とします。

If Range("A" & i + 10).Value <> "" Then ~ End If
このIf文は、

納品書のデータがある間は、処理をさせるようにします。
納品書のデータが1件ならば1回という感じですね。

Range("A" & i + 10) は、納品書のデータの1件目がA11にある。
つまりA列が空白ならばデータはないということを判断させます。

'受注番号
Range("F3").Copy Worksheets("納品一覧").Range("A" & last_row + i)
納品書のF3にある受注番号を、納品一覧シートのA列の一番下の次に貼り付けます。

これを該当データごとに作っていきます。

'顧客名
Range("A3").Copy
Worksheets("納品一覧").Range("C" & last_row + i).PasteSpecial xlPasteValues

顧客名ですが、下線の書式が設定されています。
このままコピーして貼り付けると書式も張り付いてしまいます。
そこで、貼り付けの形式を、「値のみ」で貼り付ける処理をしています。
それが、『.PasteSpecial xlPasteValues』です。

'納品書1件
Range("B" & i + 10).Resize(1, 5).Copy
Worksheets("納品一覧").Range("D" & last_row + i).PasteSpecial xlPaste
個別のデータをひとつずつ、処理してもいいのですが、データの行をそのまま貼り付けることも可能です。

「Range("B" & i + 10).Resize(1, 5).Copy」は、B列からF列までの1行分のデータをまとめてコピーすると効率がいいわけです。

そこで、Resizeを使って、範囲をB列からF列まで範囲選択する方法を採用しています。

また、納品書には罫線が引かれていますので、こちらも、「値のみ」で貼り付ける作業をしています。

これで、完成しました。非常に簡単な内容になっていますが、これだけで作業効率が改善できるわけですね。