セルデータの移動と計算は、エクセルの基本操作で普段より普通に行われています。けれどもここで操作ミスのエラーも多く発生します。対策としてVBAでコード処理しましょう。
こんにちは、じゅんぱ店長(@junpa33)です。
販売の帳票(見積書、納品書、請求書)を自動で作成するエクセルソフトを作っていますが、今回は記事第2回で、必要なデータを計算し、テンプレートに値をはめ込んで帳票を仕上げていきます。
間違いは許されない作業部分ですので、出来るだけ手作業のヒューマンエラーを無くせるようにします。
第1回目の記事を参考にするには、こちらです。
見積・納品・請求書テンプレートをVBAコードだけで作る見積書納品書請求書作成の記事編成
- 見積書納品書請求書作成ソフトの使い方とダウンロード
- 見積書納品書請求書作成ソフトの作成概略
コンテンツ
VBAでセルの値の移動と計算や表示形式変更を行う
エクセルで頻繁に行うデータ移動
エクセルでは、セルデータの移動と計算は当たり前の基本機能です。
例えば
- 同じ数字を数段下のセルでも使いたい。
- 同じ文章を印刷2ページ目でも使いたい。
- ほかのシートの内容を丸々こちらに移したい。
などなど、普段から行っている操作内容は挙げれば切りがないほどです。
その中には多くの定型作業(パターン作業)が含まれていますので、シート上に記述できる「エクセルワークシート関数」は非常に重宝なツールになっています。
そこで結構おられるのが、ゴリゴリに「何が何でもエクセル関数」、関数一本やりの方です。
使い慣れれば慣れるほど、移動先のセルは「=関数式」の大名行列になっているのではないでしょうか。
データの移動は、コピペとLookupメインですか
データの移動についてはコピーペースト、データ取出しはLookupが合言葉のようになっている方もいます。
皆さんは、少なからず何回かは、「あっ!ミスッた」と思うことがあるでしょう。
カーソルを十字にして上から下へと「スルスル」と動かしたとき、関数の数式のセル位置指定がおかしくなっていたとか。
で、「LookUpの参照範囲が・・・」
VBAを使えば、ヒューマンエラーを減らせる
ここは簡単に、でも間違いなくやっていきたいです。
間違ってセルの数式を消してしまったらどうしようと、セルにカーソルを乗せることすら怖くなる場合もありますよね。
この「ありゃー」を上手く解決するには、
最後はやはりコードをモジュールに打ち込んで、VBA化するしかありません。(自分もそれに行き着きました)
今回作成している請求納品見積書の帳票などは表示のデータが何十行になる事もありますので、これは必須のスキルになります。
「エクセルを使いだした人」、「使い慣れてきた人」、「他の人にレクチャーできるような人」
それぞれ皆さんの利用レベルの違いも有りますが、それぞれの立場で「こう出来たらうれしい」という ” 願望的希望 ” を持っているでしょう。
食わず嫌いにならずにこれからVBAにチャレンジしてみましょう。
VBAコードで簡潔にデータを移します
それでは、帳票にデータを移すVBAコードを組み立てていきます。
コード記述はModule2で行います。新たにモジュールを挿入してください。
VBA初めての起動。VBEの立ち上げ、保存と終了帳票作成プロシージャー
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はこのようにコード化できます。
SUM関数で合計計算!実務で使えるVBAコード作成デフォルトのテンプレートは、1ページ分を準備していました。これの使用行数は39行です。
当然、使用場面ではこれが2ページ3ページ必要になりますので、行数を増やさなければいけません。
つまり、このコードによってデータ項目数に合わせて罫線を引く範囲の確定を行います。追加ページの1ページは35行になります。
RoundUpとRoundDown関数の使い方。数値の切り方に注意 If条件文のVBAコードの組み方。条件の絞り方を最速理解請求書、納品書、見積書シートでテンプレートを再作成します。
同じVBAコードを3回繰り返して、それぞれのシートに作成するように記述しても良いのですが、
「請求書シート=Worksheets(2)」・「納品書シート=Worksheets(3)」・「見積書シート=Worksheets(4)」ということを使って
その(2)と(3)と(4)を変数化して「For ~ Next」のループ処理を行っています。
With~End Withの使い方。VBAコードを簡潔に記述する 「罫線」のVBAを最速理解 「フォント」の操作を最速理解する エクセルVBA 「配置」を最速理解する エクセルVBA 「表示形式」をVBAコード的に最速理解するVBAコードでのデータ移動の一つの方法(コード組み立て)です。
何十何百のデータ項目数があってもこれですべてOKです。
先ほどの「For ~ Next」のループ処理の方法を使って、そのWorksheetの方法と、
セル位置の指定方法「Cells(行番号、列番号)」についても変数化しています。
行番号・・・「作業シート」の2行目からデータの最終行SaRow
列番号・・・「作業シート」の1列目から7列目
ページの最終行が「税込合計」の場合は、「以下余白」を表示しないようにします。
ここではFor~Nextの入れ子構造にしています。
この入れ子の構造の考え方については、この記事が参考になります。
For~Nextのループと入れ子構造をVBA最速理解シートのコピーについては、この記事が参考になります。
シートのコピーを最速に理解!VBAコードで異なる結果Module2で、別に記述している「宛名設定」というプロシージャーを呼び出して実行します。
部品化プロシージャーでCallステートメントは必須宛名設定プロシージャー
「宛名の登録」シートに入力した発行相手先のデータを調べて移してきます。
調べ方は、「顧客番号」を利用して、「宛名の登録」シートでリストマッチングでピックアップします。
リストにない場合は「ありませんでした。」メッセージを表示します。
2つのインプットボックス。関数とメソッド、特徴を生かした使い分け VBAで使うMatch関数 活用度アップでテッパン関数に!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コードでデータの移動と計算のまとめ
この記事で仕上がった帳票
1ページ目
2ページ目
データ移動と合計計算のVBAコードは、それほど難しくないコードだと思います。
移動するデータが、何個何百個あってもこれで対応できるということです。
いろんな部分に応用が利くと思います。使ってみてください。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。