• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:秀和システム「Excel VBAプログラミングのツボとコツが絶対に分かる本」)

秀和システム「Excel VBAプログラミングのツボとコツが絶対に分かる本」で学ぶ請求書作成プログラムの仕組みとは?

このQ&Aのポイント
  • 販売シートから請求先を選び、各会社別の請求書を作成するプログラムの仕組みについて教えてください。
  • 特に、請求書の金額の項目に単価と数量を掛ける式を自動で入れる部分について説明してください。
  • また、請求書の作成順序やプログラムの処理の流れについても教えていただきたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

#1です。 >『変数「cnt」を-1しているのは、最後のループでも+1されてしまうため、 >ループを抜けた時点では「cnt」の値が販売データの数よりも1だけ多くなって >しまっているのを修正するためです。』 この事から、理解されている内容であっていると思います。

matyu0531
質問者

お礼

n-junさんありがとうございます。 よかったです。 n-junさんには以前にも回答いただきまして、今後いろいろお世話になるかもしれません。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

12行目からデータを代入していくと、18行目で代入が終わる。 しかしcntは代入後に+1をしているので19となっている。 合計処理ではデータを代入した最終行は18なので、範囲E12:E18を 変数cntを用いて表すなら、cnt-1(19-1)=18となる。 と言う事かと推測します。(書籍は見てませんので憶測です)

matyu0531
質問者

お礼

n-jun様 回答ありがとうございます。 せっかく書いていただきましたが、ここの仕様上画像が1枚しかUPできない為意図が伝わりにくくなっています。 返信のお答えは私の考え方が合っているということで良いのでしょうか? よろしくお願い致します。 ■販売シート A4:A32 日付データ B4:B32 A商事、B建設、C電気、D不動産などの顧客名 C4:C32 カラーペン、インクカートリッジ等の商品名 D4:D32 単価 E4:E32 数量 F4:F32 上記2つを掛けた金額(式は入っていない) ■請求書雛形シート(コピー先の為全て空欄) A12:A54 日付 B12:B54 商品 C12:C54 単価 D12:D54 数量 E12:E54 金額

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ExcelVBAテキストでの疑問

    Option Explicit Sub 請求書作成(Kokyaku As String) '引数「Kokyaku」は請求書を作成する顧客名 ここだけなぜ「請求書作成」、引数を宣言するのかが不明です。    Dim i As Integer '「販売」ワークシートの表の処理用カウンタ変数 Dim Cnt As Integer '請求書のワークシートの表の処理用変数 Cnt = 12 '請求書のワークシートの表の先頭行(12行目)の値に初期化 'ワークシート「請求書雛形」を末尾にコピー Worksheets("請求書雛形").Copy After:=Worksheets(Worksheets.Count) Worksheets(Worksheets.Count).Name = Kokyaku 'ワークシート名を設定 Worksheets(Kokyaku).Range("A6").Value = Kokyaku '請求書の宛先を設定 Worksheets(Kokyaku).Range("E2").Value = Date '請求書の発行日を設定 '指定した顧客の販売データを請求書へコピー For i = 4 To 32 If Worksheets("販売").Cells(i, 2).Value = Kokyaku Then Worksheets(Kokyaku).Cells(Cnt, 1).Value = Worksheets("販売").Cells(i, 1).Value '日付 Worksheets(Kokyaku).Cells(Cnt, 2).Value = Worksheets("販売").Cells(i, 3).Value '商品 Worksheets(Kokyaku).Cells(Cnt, 3).Value = Worksheets("販売").Cells(i, 4).Value '単価 Worksheets(Kokyaku).Cells(Cnt, 4).Value = Worksheets("販売").Cells(i, 5).Value '数量 Worksheets(Kokyaku).Cells(Cnt, 5).Value = Worksheets("販売").Cells(i, 6).Value '金額 Cnt = Cnt + 1 '請求書のワークシートの表のコピー先の行を1つ進める End If Next i End Sub Sub フォーム用意() myForm.Show End Sub

  • VBAプログラミングの質問です。

    Sheet1の第2列に行番号、4列に列番号、5列にそこの値が書かれたデータが並んでいます。 1 1 967 2 1 687 ……… x y 802 ……… x行、y列に802を代入するという感じです。全部で57985データあります。 前の回答を参考にして、48881データまではSheet2に For k = 1 To 48881 Worksheets("Sheet2").Cells(1 + Worksheets("Sheet1").Cells(k, 2), 1 + Worksheets("Sheet1").Cells(k, 4)) = Worksheets("Sheet1").Cells(k, 5) Next k このようにプログラムを書いて納まって、残りの57985-48881=9104データの行列はSheet2に納まらなかったので、Sheet3に書こうと思い、下のように書きましたがプログラムがうまく動きませんでした。他にも試しましたが初心者のためダメでした。 Dim n As Long Dim m As Long n = 9104 m = 48881 For k = 1 To n Worksheets("Sheet3").Cells(1 + Worksheets("Sheet1").Cells(k + m, 2), 1 + Worksheets("Sheet1").Cells(k + m, 4)) = Worksheets("Sheet1").Cells(k + m, 5) Next k 48881というのが大きいため動かないと考えられますが、どのように対処したらよいかわかりません。教えてください。お願いします。

  • ワークシート名を変数に格納する方法

    VBA初心者です。ワークシートが5つあり各シートにデータを転記するマクロを作成したいのですがワークシート名を変数にしてループ処理することはできるのでしょうか? 下記はワークシート名"H"にだけ転記するマクロを作成してみましたがこの後がわからず悩んでいます。よろしくお願いします。 Dim データ行 As Integer Dim cnt As Integer Dim データ数 As Integer cnt = 4 データ行 = Cells(Rows.Count, 8).End(xlUp).Row For データ数 = 11 To データ行   If Worksheets("入力").Cells(データ数,1).Value= "2"Then Worksheets("H").Cells(cnt, 6).Value = Worksheets("入力").Cells(データ数, 8).Value Worksheets("H").Cells(cnt, 7).Value = Worksheets("入力").Cells(データ数, 9).Value Worksheets("H").Cells(cnt, 8).Value = Worksheets("入力").Cells(データ数, 27).Value Worksheets("H").Cells(cnt, 9).Value = Worksheets("入力").Cells(データ数, 19).Value Worksheets("H").Cells(cnt, 10).Value = Worksheets("入力").Cells(データ数, 20).Value Worksheets("H").Cells(cnt, 11).Value = Worksheets("入力").Cells(データ数, 21).Value Worksheets("H").Cells(cnt, 12).Value = Worksheets("入力").Cells(データ数, 10).Value Worksheets("H").Cells(cnt, 13).Value = Worksheets("入力").Cells(データ数, 11).Value Worksheets("H").Cells(cnt, 14).Value = Worksheets("入力").Cells(データ数, 22).Value Worksheets("H").Cells(cnt, 15).Value = Worksheets("入力").Cells(データ数, 23).Value cnt = cnt + 1 End If Next データ数

  • vbaプログラミングについて教えてください。

    vba初心者です。下記のようにプログラミングしましたがもっといいプログラムの仕方はないでしょうか。ちょっとごちゃごちゃしていて見にくいです。どなかたお力をお貸しください。 Private Sub データUPDATE輸入_Click() ActiveSheet.Unprotect Dim Line As String Dim Maxrow As String Sheets("Invoice").Select Line = 5   Do Until Cells(Line, 7).Value = "" On Error Resume Next 'A列の空欄をコピーして埋める If Cells(5, 1).Value = "" Then Cells(Line, 1).Value = "" ElseIf Cells(Line, 1).Value = "" Then Cells(Line, 1).Value = Cells(Line - 1, 1).Value End If 'B列の空欄をコピーして埋める If Cells(5, 2).Value = "" Then Cells(Line, 2).Value = "" ElseIf Cells(Line, 2).Value = "" Then Cells(Line, 2).Value = Cells(Line - 1, 2).Value End If 'C列の空欄をコピーして埋める If Cells(5, 3).Value = "" Then Cells(Line, 3).Value = "" ElseIf Cells(Line, 3).Value = "" Then Cells(Line, 3).Value = Cells(Line - 1, 3).Value End If 'D列の空欄をコピーして埋める If Cells(5, 4).Value = "" Then Cells(Line, 4).Value = "" ElseIf Cells(Line, 4).Value = "" Then Cells(Line, 4).Value = Cells(Line - 1, 4).Value End If 'E列の文字を「輸入シート」から検索しF列に貼り付ける If Cells(Line, 5).Value = "" Then Cells(Line, 5).Value = Cells(Line - 1, 5).Value End If Cells(Line, 6).Value = Application.WorksheetFunction.VLookup(Cells(Line, 5).Value, Worksheets("輸入Parts").Range("A2:R20000"), 2, 0) 'E列を検索しデータが存在しない場合はF列に「データがありません」を表記 If Cells(Line, 6).Value = "" Then Cells(Line, 6).Value = "データがありません" GoTo コピー貼り付け End If コピー貼り付け: If Cells(Line, 6).Value = "データがありません" Then Cells(Line, 5).Copy 'コピーする Maxrow = Worksheets("輸入Parts").Range("A1").End(xlDown).Row + 1 Worksheets("輸入Parts").Range("A" & Maxrow).PasteSpecial Paste:=xlPasteValues '値を貼り付け End If 'H列の空欄をコピーして埋める If Cells(5, 12).Value = "" Then Cells(Line, 12).Value = "" ElseIf Cells(Line, 12).Value = "" Then Cells(Line, 12).Value = Cells(Line - 1, 12).Value End If 'E列の文字を「輸入シート」から検索しZ列に貼り付ける Cells(Line, 26).Value = Application.WorksheetFunction.VLookup(Cells(Line, 5).Value, Worksheets("輸入Parts").Range("A2:R20000"), 3, 0) 'E列を検索しデータが存在しない場合はZ列に「データがありません」を表記 If Cells(Line, 26).Value = "" Then Cells(Line, 26).Value = "データがありません" End If 'AD列の空欄をコピーして埋める If Cells(5, 30).Value = "" Then Cells(Line, 30).Value = "" ElseIf Cells(Line, 30).Value = "" Then Cells(Line, 30).Value = Cells(Line - 1, 30).Value End If 'E列の文字を「輸入シート」から検索しAM列に貼り付ける Cells(Line, 39).Value = Application.WorksheetFunction.VLookup(Cells(Line, 5).Value, Worksheets("輸入Parts").Range("A2:R20000"), 18, 0) 'E列を検索しデータが存在しない場合はAM列に「データがありません」を表記 If Cells(Line, 39).Value = "" Then Cells(Line, 39).Value = "データがありません" End If '「Unit price」の計算・円建と外貨建が合わさったインボイスの場合の合計金額 If Cells(Line, 14).Value = "" Then Cells(Line, 13).Value = Cells(Line, 17).Value * Cells(Line, 33).Value / Cells(Line, 7).Value Else Cells(Line, 17).Value = Application.WorksheetFunction.RoundDown(Cells(Line, 14).Value * Cells(Line, 16), 0) Cells(Line, 15).Value = Cells(Line, 16).Value * Cells(Line, 33).Value / Cells(Line, 7).Value End If 'T.Invoice Priceの計算 Cells(Line, 23).Value = Application.WorksheetFunction.Sum(Cells(Line, 17), Cells(Line, 18), Cells(Line, 19), Cells(Line, 20), Cells(Line, 21), Cells(Line, 22)) 'VLOOKUP関数が終わり、エラーが発生したら止まる On Error GoTo 0 '次の行に移り最後の行まで検索 Line = Line + 1 Loop End Sub

  • EXCEL・VBAに関する質問です。

    EXCELで或るセルに数式を代入したい場合、普通は Worksheets("xx").Range("F1").Formula = "=CONCATENATE($A$1,$C$1)" と書けば好いと思いますが、 =CONCATENATE("請求_",$D$1,".xlsm") と代入したい場合、どう書いたら好いのでしょうか。よろしくお願いします。 ちなみに私は dim seikyuu , exten as string seikyuu = "請求_" exten = ".xlsm" Worksheets("xx").Range("F2").Formula = "=CONCATENATE(" & seikyuu & ",$D$1," & exten & ")" としたら好いかと思うのですが、考え方は合っているでしょうか。

  • 【Excel】【VBA】 効率の良いカウント処理について

    以下(1)のようなデータがあります。※実際はもっと項目数は多いです。 (1)を元に、別シートに(2)のような集計を出したいのですが、 数式を埋め込みたくないため、VBAでカウントさせて実データを埋め込みたいです。 (1)  A    B | 名前 | 出身 | ├────┼────┤ | 田中 | 岩手 | | 吉田 | 秋田 | | 井上 | 沖縄 | | 加藤 | 島根 | | 鈴木 | 岐阜 | | 木本 | 愛知 | | 伊藤 | 沖縄 | | 宮田 | 秋田 | | 佐藤 | 長野 |     ↓↓↓ (2)  A    B | 出身 | 人数 | ├────┼────┤ | 岩手 |  1 | | 秋田 |  2 | | 沖縄 |  2 | | 島根 |  1 | | 岐阜 |  1 | | 愛知 |  1 | | 長野 |  1 | そこで以下のように書いてみたところ、正しくカウントは取れるのですが、 思った以上に処理時間がかかってしまいました。 Dim dc1 As Integer Dim dc2 As Integer dc1 = Worksheets("Sheet1").Range("A65536").End(xlUp).Row dc2 = Worksheets("Sheet2").Range("A65536").End(xlUp).Row i1 = 0 i2 = 0 For i1 = 2 To dc2 cnt = 0 For i2 = 2 To dc1 If Worksheets("Sheet2").Cells(i1, 1) = Worksheets("Sheet1").Cells(i2, 1) Then cnt = cnt + 1 End If Next i2 Worksheets("Sheet2").Cells(i1, 2) = cnt cntRec = cntRec + 1 Application.StatusBar = "件数処理実行中・・・(現在 " & cntRec & "件)" Next i1 (1)を元に(2)のような表を作成するのに、もっと処理時間が短くなるような 書き方はありますでしょうか?よろしくお願いいたします。

  • EXCEL2003 VBAで動作が速くなるようにマクロ記述したいのです

    EXCEL2003 VBAで動作が速くなるようにマクロ記述したいのですが、どのように行えばいいのでしょうか? Sheet1のA1からA300まで、関数によって計算されたデータが格納されています。 そのA1からA300の値(関数の計算結果のみ)を、コマンドボタンをクリックした時にSheet2のA1からA300にコピーしています。 コマンドボタンをクリックする度に、Sheet1のA1からA300までの値を、Sheet2に列を変えてコピーし、値を蓄積する方法を取っています。 以下のマクロを記述して走らせてみましたが、動作が遅いのが気になります。 コピーして貼り付けている動作が遅くなっているのでしょうか? もう少し早くなる方法はありますでしょうか? よろしくお願いします。 Sub CommandButton1_Click1() Dim I Dim N Worksheets("sheet1").Range("F1").Value = Range("F1").Value + 1 N = Worksheets("sheet1").Range("F1").Value For I = 1 To 300  Application.ScreenUpdating = False   Worksheets("sheet1").Cells(I, 1).Copy   Worksheets("sheet2").Cells(I, N).PasteSpecial Paste:=xlValues  Application.ScreenUpdating = True Next End Sub

  • Excel・VBAのコード教えてください。

    1シートに12ずつあるまとまりを印刷したくて下記のようなものを作成しました。 Worksheets("Sheet1").Select Last = Cells(1).CurrentRegion.Rows.Count Warizan = Abs(Last / 12)    ←12個以上の場合2、3…以下は1となる。 Kaisuu = Left(Warizan, 1) For r = 1 To Kaisuu      ←回数分繰り返す For i = 2 To Last      ←シート1に書かれたデータの最終行まで。 Worksheets("Sheet1").Select Company = Cells(i, 1) Yuubin = Cells(i, 2) Address = Cells(i, 3) Worksheets("Sheet2").Select Select Case i Case (Kaisuu * 12) - 10 Range("D4") = Yuubin Case (Kaisuu * 12) - 9 Range("AF4") = Yuubin        : Case (Kaisuu * 12) - 1 Range("AF45") = Yuubin Case (Kaisuu * 12) Range("D56") = Yuubin Case (Kaisuu * 12) + 1 Range("AF56") = Yuubin End Select Next ActiveWindow.SelectedSheets.PrintPreview Next とした時に、最終ページが2回、もしくは3回…と表示されてしまいます。 例えばデータが25個あったとして、1ページ目(12個分)が終ったらプレビュー、残りの2ページ目(1個分)を表示、としたいのです。 よろしくお願いします。

  • エクセルVBAについて

    前回質問させていただきました件の追加機能になります。以前質問させていただきましたマクロが下記のものです。 Sub TESTa() Dim A As Long Dim B As Long Dim C As Long Dim D As Long Dim E As Long Dim F As Long '表の行数を調べる A = Worksheets("sheet1").Range("C65536").End(xlUp).Row - 1 For C = 1 To A For B = 4 To 7 'Sheet1のデータをSheet2に複写する Worksheets("Sheet2").Cells(B - 3 + D, 15) = Worksheets("Sheet1").Cells(C + 1, 1) Worksheets("Sheet2").Cells(B - 3 + D, 6) = Worksheets("Sheet1").Cells(C + 1, B) Worksheets("Sheet2").Cells(B - 3 + D, 14) = Worksheets("Sheet1").Cells(C + 1, 3) Worksheets("Sheet2").Cells(B - 3 + D, 10) = Worksheets("Sheet1").Cells(1, B) Worksheets("Sheet2").Cells(B - 3 + D, 13) = Worksheets("Sheet1").Cells(C + 1, 2) Next D = C * 4 Next 'Sheet2の表の行数を調べる Sheets("Sheet2").Select E = Worksheets("sheet2").Range("F65536").End(xlUp).Row '0欄の確認 For F = E To 1 Step -1 If Worksheets("Sheet2").Cells(F, 6) = 0 Then '0の場合は行を削除する Cells(F, 1).EntireRow.Delete End If Next End Sub カウントするとデータ個数がSheet1で約120件になりSheet2においては、4倍になりますので約480件になります。 そこで Sheet1において12件ごとに、Sheet2,3,4...としたいのです。 Sh1 NO.1~12がSheet2 Sh1 NO.13~24がSheet3 ... 10枚のシートにしたいのですが、このマクロにどのような命令を加えればよろしいでしょうか? お手数ですがよろしくお願いいたします。

  • 検索型の数式が上手くできません。

          1    2 A    a商事  100 B    b商事  200 C    c商事  300 D    a商事  500 E     a商事  600  仕事で上記のようなデータをシートIに作成しております。 このデータを別シートへ下記のように抜き出したいのです。        1   2 A    a商事  100 B    a商事  500 C    a商事  600 D     E VLOOKUPやLOOKUPでは、上手く出来ません。(一番上の a商事 100 という値しか返さず、縦にコピーをしても同じ値が返されるだけでした。) 良い方法を教えてください。   ちなみに、シートIに作成しているデータがとても多いので、同じ検索値をA行へズラッとコピーしてその横へLOOKUPを使って値を返したのでは、とても手間がかかります。 定期的に集計をとりたいデータですので、シートIのデータが、即他のシートへ拾い出し&集計できる数式が便利なのですが、どうすればいいかわかりません。 とても困っていますので、どうか宜しくお願いします。

専門家に質問してみよう