VBAでデータ移動と計算を行う。ヒューマンエラーを減らす

santenden_tyoueyecatch

セルデータの移動と計算は、エクセルの基本操作で普段より普通に行われています。けれどもここで操作ミスのエラーも多く発生します。対策としてVBAでコード処理しましょう。

こんにちは、じゅんぱ店長(@junpa33)です。

販売の帳票(見積書、納品書、請求書)を自動で作成するエクセルソフトを作っていますが、今回は記事第2回で、必要なデータを計算し、テンプレートに値をはめ込んで帳票を仕上げていきます。

間違いは許されない作業部分ですので、出来るだけ手作業のヒューマンエラーを無くせるようにします。

第1回目の記事を参考にするには、こちらです。

santenden_tempeyecatch 見積・納品・請求書テンプレートをVBAコードだけで作る

見積書納品書請求書作成の記事編成

VBAでセルの値の移動と計算や表示形式変更を行う

tyouhyousakup003

エクセルで頻繁に行うデータ移動

エクセルでは、セルデータの移動と計算は当たり前の基本機能です。

例えば

  • 同じ数字を数段下のセルでも使いたい。
  • 同じ文章を印刷2ページ目でも使いたい。
  • ほかのシートの内容を丸々こちらに移したい。

などなど、普段から行っている操作内容は挙げれば切りがないほどです。

その中には多くの定型作業(パターン作業)が含まれていますので、シート上に記述できる「エクセルワークシート関数」は非常に重宝なツールになっています。

そこで結構おられるのが、ゴリゴリに「何が何でもエクセル関数」、関数一本やりの方です。

使い慣れれば慣れるほど、移動先のセルは「=関数式」の大名行列になっているのではないでしょうか。

データの移動は、コピペとLookupメインですか

データの移動についてはコピーペースト、データ取出しはLookupが合言葉のようになっている方もいます。

皆さんは、少なからず何回かは、「あっ!ミスッた」と思うことがあるでしょう。

カーソルを十字にして上から下へと「スルスル」と動かしたとき、関数の数式のセル位置指定がおかしくなっていたとか。

で、「LookUpの参照範囲が・・・」

VBAを使えば、ヒューマンエラーを減らせる

悩める君
悩める君

ここは簡単に、でも間違いなくやっていきたいです。

間違ってセルの数式を消してしまったらどうしようと、セルにカーソルを乗せることすら怖くなる場合もありますよね。

この「ありゃー」を上手く解決するには、

最後はやはりコードをモジュールに打ち込んで、VBA化するしかありません。(自分もそれに行き着きました)

今回作成している請求納品見積書の帳票などは表示のデータが何十行になる事もありますので、これは必須のスキルになります。

「エクセルを使いだした人」、「使い慣れてきた人」、「他の人にレクチャーできるような人」

それぞれ皆さんの利用レベルの違いも有りますが、それぞれの立場で「こう出来たらうれしい」という ” 願望的希望 ” を持っているでしょう。

実は、VBAを使うと、このようなことも実に簡単に解決してしまいます。

「移し元」と「移し先」のBOOK名とシート名とセル位置同士を「=」で繋ぐだけです。

しかもセル位置一つずつ行うのではなくて、移動の範囲指定など「位置を変数化」して記述するだけです。

じゅんぱ店長
じゅんぱ店長

食わず嫌いにならずにこれからVBAにチャレンジしてみましょう。

VBAコードで簡潔にデータを移します

tyouhyousakup004

それでは、帳票にデータを移すVBAコードを組み立てていきます。

コード記述はModule2で行います。新たにモジュールを挿入してください。

vbavbekidoeyecatch VBA初めての起動。VBEの立ち上げ、保存と終了

帳票作成プロシージャー

VBAコードの全体を通してこのようになります。

vbalastcelleyecatch データ入力済セルの最終行番号を取得する
VBA
Option Explicit

Sub 帳票作成()
    Dim a, m, N As Long
    Dim GS As Long
    Dim SaRow, KeRow As Long
    Dim Fsa, Fsb As Variant
        Worksheets("作業シート").Select
        SaRow = Cells(Rows.Count, 2).End(xlUp).Row
'金額合計を計算
        GS = WorksheetFunction.Sum(Range(Cells(2, 6), _
                    Cells(SaRow, 6)))
'罫線を引く範囲
        If SaRow < 27 Then
            KeRow = 39
        Else
            KeRow = 39 + Application.WorksheetFunction _
                        .RoundUp((SaRow - 26) / 35, 0) * 35
        End If
'請求納品見積へテンプレート再構築
        For a = 2 To 4
            Worksheets(a).Select
            With Worksheets(a)
                .Range("A13:G" & KeRow).Borders.LineStyle _
                            = xlContinuous
                .Range("B14:B" & KeRow).Font.Size = 10
                .Range("B13:B" & KeRow).WrapText = True
                .Range("C13:D" & KeRow).HorizontalAlignment = xlCenter
                .Range("E13:F" & KeRow).NumberFormatLocal = "\ #,##0"
'品名のフォントサイズ
                Fsa = 操作パネル.品名F.Value
                If Fsa = "" Then
                    Fsa = 10
                Else
                    Fsa = Val(Fsa)
                End If
                .Range(Cells(14, 2), Cells(KeRow, 2)) _
                            .Font.Size = Fsa
'顧客名のフォントサイズ
                Fsb = 操作パネル.顧客F.Value
                If Fsb = "" Then
                    Fsb = 13
                Else
                    Fsb = Val(Fsb)
                End If
                .Range("B6").Font.Size = Fsb
'発行年月日のテンプレ転記
                With .Range("F3")
                    If 操作パネル.発行年月日.Value = "" Then
                        .Value = "令和  年  月  日"
                    Else
                        .Value = 操作パネル.発行年月日.Value
                    End If
                    .Font.Size = 10
                End With
            End With
        Next a
'請求納品見積シートへデータ転記
        For N = 2 To SaRow
            For m = 1 To 7
                For a = 2 To 4
                    With Worksheets(a)
                        .Cells(N + 12, m) = Worksheets("作業シート") _
                                    .Cells(N, m)
                        .Cells(SaRow + 13, 2) = "税込合計"
                        If SaRow + 13 <> 39 And ((SaRow + 13) - 39) _
                                    Mod 35 <> 0 Then
                            .Cells(SaRow + 14, 2) = "以下余白"
                        End If
                        .Cells(SaRow + 13, 6) = GS
                        .Cells(11, 2) = GS
                    End With
                Next a
            Next m
        Next N
'別のプロシージャー呼び出し
        Call Module2.宛名設定
End Sub

合計金額を計算

ワークシート関数をVBAで利用します。

合計関数SUMはこのようにコード化できます。

vbasumeyecatch SUM関数で合計計算!実務で使えるVBAコード作成

罫線を引く範囲

デフォルトのテンプレートは、1ページ分を準備していました。これの使用行数は39行です。

当然、使用場面ではこれが2ページ3ページ必要になりますので、行数を増やさなければいけません。

つまり、このコードによってデータ項目数に合わせて罫線を引く範囲の確定を行います。追加ページの1ページは35行になります。

vbaroundupdowneyecatch RoundUpとRoundDown関数の使い方。数値の切り方に注意 vbaifjyokeneyecatch If条件文のVBAコードの組み方。条件の絞り方を最速理解

請求納品見積書シートへテンプレートの再構築

請求書、納品書、見積書シートでテンプレートを再作成します。

同じVBAコードを3回繰り返して、それぞれのシートに作成するように記述しても良いのですが、

「請求書シート=Worksheets(2)」・「納品書シート=Worksheets(3)」・「見積書シート=Worksheets(4)」ということを使って

その(2)と(3)と(4)を変数化して「For ~ Next」のループ処理を行っています。

vbawithstateeyecatch With~End Withの使い方。VBAコードを簡潔に記述する vbacellsbordereyecatch 「罫線」のVBAを最速理解 vbacellsfonteyecatch 「フォント」の操作を最速理解する エクセルVBA vbacellsplacementeyecatch 「配置」を最速理解する エクセルVBA vbacellssyoshikieyecatch 「表示形式」をVBAコード的に最速理解する

請求納品見積書シートへデータ転記

VBAコードでのデータ移動の一つの方法(コード組み立て)です。

何十何百のデータ項目数があってもこれですべてOKです。

先ほどの「For ~ Next」のループ処理の方法を使って、そのWorksheetの方法と、

セル位置の指定方法「Cells(行番号、列番号)」についても変数化しています。

行番号・・・「作業シート」の2行目からデータの最終行SaRow

列番号・・・「作業シート」の1列目から7列目

ページの最終行が「税込合計」の場合は、「以下余白」を表示しないようにします。

ここではFor~Nextの入れ子構造にしています。

この入れ子の構造の考え方については、この記事が参考になります。

fornextirekoeyecatch For~Nextのループと入れ子構造をVBA最速理解

シートのコピーについては、この記事が参考になります。

VBACopyeyecatch シートのコピーを最速に理解!VBAコードで異なる結果

別のプロシージャー呼び出し

Module2で、別に記述している「宛名設定」というプロシージャーを呼び出して実行します。

vbacalleyecatch 部品化プロシージャーでCallステートメントは必須

宛名設定プロシージャー

「宛名の登録」シートに入力した発行相手先のデータを調べて移してきます。

調べ方は、「顧客番号」を利用して、「宛名の登録」シートでリストマッチングでピックアップします。

リストにない場合は「ありませんでした。」メッセージを表示します。

vbainputboxeyecatch 2つのインプットボックス。関数とメソッド、特徴を生かした使い分け vbamatcheyecatch001 VBAで使うMatch関数 活用度アップでテッパン関数に!
VBA
Sub 宛名設定()
    Dim a, ans As Long
    Dim CosNo As Variant
    Dim Res, Ybn, Jus, Ate As Variant
        Res = 0
        Workbooks("見納請3点伝票作成.xlsm").Activate
        Worksheets("宛名の登録").Select
'操作パネルのデータより
        CosNo = 操作パネル.顧客番号.Value
stepB:
        If CosNo = "" And MRK <> 2 Then
            MsgBox "顧客番号が入力されていません。", vbExclamation, _
                        "見納請3点伝票作成"
            GoTo stepA
        Else
            CosNo = Val(CosNo)
            On Error GoTo 0
            On Error Resume Next
            Res = WorksheetFunction.Match(CosNo, Range("B:B"), 0)
            If Res = 0 Then GoTo stepA
        End If
        Ybn = Range("D" & Res).Value     '郵便番号
        Jus = Range("E" & Res).Value     '住所
        Ate = Range("C" & Res).Value     '宛名
        For a = 2 To 4
            With Worksheets(a)
                    .Range("B3") = Ybn
                    .Range("B4") = Jus
                    .Range("B6") = Ate & "  様"
            End With
        Next a
stepA:
        If Res = 0 Then
            ans = MsgBox("一致する顧客番号はありません。" & vbCrLf & _
                        "正しい番号を入力しますか?", vbYesNo + _
                        vbQuestion, "見納請3点伝票作成")
            If ans = vbYes Then
                CosNo = InputBox(Prompt:="半角数字で顧客番号を" & _
                        vbCrLf & "入力してください。", Title:= _
                        "見納請3点伝票作成")
                操作パネル.顧客番号.Value = CosNo
                GoTo stepB
            Else
                MsgBox "宛名空欄で終了します", vbInformation, _
                        "見納請3点伝票作成"
                Worksheets("請求書").Select
                Range("A1").Select
                Exit Sub
            End If
        End If
        Worksheets("請求書").Select
        Range("A1").Select
        MsgBox "3点伝票の作成が完了しました。", vbInformation, _
            "見積書納品書請求書作成エクセル"
End Sub

また、この「顧客番号」ですでにお使いの販売管理ソフトと連携させることも可能です。

この「顧客番号」でのマッチングは、後の記事で紹介しますが、日々の販売取引を管理する販売管理ソフトと連携させるために必要な事項になります。

この記事では、「ソリマチ 販売王」の顧客IDとリンクさせています。

VBAコードでデータの移動と計算のまとめ

tyouhyousakup005

この記事で仕上がった帳票

1ページ目

tyouhyousaku001

2ページ目

tyouhyousaku002

データ移動と合計計算のVBAコードは、それほど難しくないコードだと思います。

移動するデータが、何個何百個あってもこれで対応できるということです。

いろんな部分に応用が利くと思います。使ってみてください。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。

アンケートでポイ活しよう!!

アンケートに答えれば答えるほど ”使える” ポイントがたまります。

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min