【VBA】請求書の作成【複数シートや複数ブックに作成、PDFで保存する】

Поділитися
Вставка
  • Опубліковано 16 січ 2025

КОМЕНТАРІ • 22

  • @3461miya
    @3461miya 2 роки тому +2

    初心者ですがとてもわかりやすい大変参考になりました。これで、時間がかかっていた作業がものすごく短縮されそうです。
    ありがとうございます。

  • @畠中正昭
    @畠中正昭 2 роки тому +1

    大変参考になりました驚きの連続でした

  • @ああ-j2x9l
    @ああ-j2x9l 2 роки тому +1

    とても分かりやすかったです!
    ありがとうございます。
    1点ご相談させてください!
    こちらを参考にDBのデータ欄を増やしてvbaを組んでみたのですが上手くいきませんでした。
    DBの数量や品名欄に割引欄等を追加したので
    Dim A, B, C, E, F
    With Sheets("DB").Range("M1").CurrentRegion.Offset(1, 0)
    A = .Resize(.Rows.Count - 1).Columns(2)
    B = .Resize(.Rows.Count - 1).Columns(3)
    C = .Resize(.Rows.Count - 1).Columns(4)
    E = .Resize(.Rows.Count - 1).Columns(5)
    F = .Resize(.Rows.Count - 1).Columns(6)
    End With
    Sheets("請求書").Range("A7").Resize(UBound(A)) = A
    Sheets("請求書").Range("B7").Resize(UBound(B)) = B
    Sheets("請求書").Range("C7").Resize(UBound(C)) = C
    Sheets("請求書").Range("D7").Resize(UBound(E)) = E
    Sheets("請求書").Range("E7").Resize(UBound(F)) = F
    こちらの変数を追加しております。
    項目が増えたため動画ではセルFで行っている計算をセルM以降や請求書の取引先等のコピー位置は対応する場所へ変更しております。
    こちらを実行すると1社目のPDFは出力されるのですが2社目以降はエラーコード13、型が一致しませんとエラーが表示されます。
    経過を見てみると2社目の
    Sheets("請求書").Range("A7").Resize(UBound(A)) = A
    この部分でエラーが起きているようです。
    ローカルウィンドウでみても2社目の変数に数値は読み込まれており、変数にデータ型の設定を行っても変わりはありませんでした。
    vbaを勉強中で初歩的な質問かと思いますがご教授頂けますと幸いです!
    よろしくお願いします。
    【全文】
    Sub bbb()
    Sheets("DB").Range("A1").CurrentRegion.Columns(1).Copy Sheets("DB").Range("M1")
    Sheets("DB").Range("M1").CurrentRegion.RemoveDuplicates 1, xlYes
    Dim D
    With Sheets("DB").Range("M1").CurrentRegion.Offset(1, 0)
    D = .Resize(.Rows.Count - 1)
    End With
    Sheets("DB").Range("M1").CurrentRegion.ClearContents
    For i = 1 To UBound(D, 1)
    Sheets("DB").Range("A1").AutoFilter 1, D(i, 1)
    Sheets("DB").Range("A1").CurrentRegion.Copy Sheets("DB").Range("M1")
    Sheets("DB").Range("A1").AutoFilter
    Sheets("請求書").Range("A3") = Sheets("DB").Range("M2")
    Dim A, B, C, E, F
    With Sheets("DB").Range("M1").CurrentRegion.Offset(1, 0)
    A = .Resize(.Rows.Count - 1).Columns(2)
    B = .Resize(.Rows.Count - 1).Columns(3)
    C = .Resize(.Rows.Count - 1).Columns(4)
    E = .Resize(.Rows.Count - 1).Columns(5)
    F = .Resize(.Rows.Count - 1).Columns(6)
    End With
    Sheets("請求書").Range("A7").Resize(UBound(A)) = A
    Sheets("請求書").Range("B7").Resize(UBound(B)) = B
    Sheets("請求書").Range("C7").Resize(UBound(C)) = C
    Sheets("請求書").Range("D7").Resize(UBound(E)) = E
    Sheets("請求書").Range("E7").Resize(UBound(F)) = F
    Sheets("DB").Range("M1").CurrentRegion.ClearContents
    With Sheets("請求書")
    .ExportAsFixedFormat 0, ThisWorkbook.Path & "\" & .Range("A3") & ".pdf"
    End With
    Next
    End Sub

    • @IT-gx8sf
      @IT-gx8sf  2 роки тому +5

      コメントありがとうございます!
      ご紹介したVBAコードでは、取引先の項目数が「1つ」の場合は、エラーとなってしまいます(^^;)大変失礼しました。次のようにセルに入力すると、エラーを回避できるかと思います。
      Sub bbb()

      Sheets("DB").Range("A1").CurrentRegion.Columns(1).Copy Sheets("DB").Range("M1")
      Sheets("DB").Range("M1").CurrentRegion.RemoveDuplicates 1, xlYes

      Dim D
      With Sheets("DB").Range("M1").CurrentRegion.Offset(1, 0)
      D = .Resize(.Rows.Count - 1)
      End With

      '請求書シートを初期化
      Sheets("DB").Range("M1").CurrentRegion.ClearContents

      For i = 1 To UBound(D, 1)

      Sheets("DB").Range("A1").AutoFilter 1, D(i, 1)
      Sheets("DB").Range("A1").CurrentRegion.Copy Sheets("DB").Range("M1")
      Sheets("DB").Range("A1").AutoFilter

      Sheets("請求書").Range("A3,A7:E9").ClearContents

      Sheets("請求書").Range("A3") = Sheets("DB").Range("M2")

      Dim A, B, C, E, F
      With Sheets("DB").Range("M1").CurrentRegion.Offset(1, 0)
      A = .Resize(.Rows.Count - 1).Columns(2)
      B = .Resize(.Rows.Count - 1).Columns(3)
      C = .Resize(.Rows.Count - 1).Columns(4)
      E = .Resize(.Rows.Count - 1).Columns(5)
      F = .Resize(.Rows.Count - 1).Columns(6)
      End With

      '項目が2つ以上となり、変数が配列になる場合
      If IsArray(A) Then
      Sheets("請求書").Range("A7").Resize(UBound(A)) = A
      Sheets("請求書").Range("B7").Resize(UBound(B)) = B
      Sheets("請求書").Range("C7").Resize(UBound(C)) = C
      Sheets("請求書").Range("D7").Resize(UBound(E)) = E
      Sheets("請求書").Range("E7").Resize(UBound(F)) = F
      '項目が1つとなり、変数が配列ではない場合
      Else
      Sheets("請求書").Range("A7") = A
      Sheets("請求書").Range("B7") = B
      Sheets("請求書").Range("C7") = C
      Sheets("請求書").Range("D7") = E
      Sheets("請求書").Range("E7") = F
      End If

      Sheets("DB").Range("M1").CurrentRegion.ClearContents

      With Sheets("請求書")
      .ExportAsFixedFormat 0, ThisWorkbook.Path & "\" & .Range("A3") & ".pdf"
      End With

      Next
      End Sub
      エラーの原因としては、配列ではない変数に「Ubound」を使用したのが原因となります。
      変数が「配列」の場合のみに、「UBound」を使うことができます。
      今回の場合だと、取引先ごと品目などの項目数が2つ以上の場合には、変数は「配列」になります。
      項目が「1つ」の場合は「配列ではない変数」になります。
      なのでエラー回避策としては、
      変数が配列の場合は「Uboundを使って」、変数が配列ではない場合は「UBoundを使わない」というように条件分岐します。
      追加したVBAコードとしては、セルに入力する変数が「配列」もしくは「配列ではない」場合で、条件分岐して入力しています。
      セルに入力する値が「配列」の場合で、項目が複数ある場合は、次のように入力します。
       Sheets("請求書").Range("A7").Resize(UBound(A)) = A
      また、セルに入力する値が「配列ではない」場合は、項目が1つのみなので、次のように入力をします。
       Sheets("請求書").Range("A7") = A
      上記のように修正をすると、エラーを回避することができるかと思います。
      あと、最初の方に、「請求書」シートを初期化するVBAコードを追記しております。
      貼り付けする項目数が変わる場合は、前のデータが残ってしまう場合がありますので、最初にシートを初期化しておくといいかと思います。
      参考になればと思います(^^)

    • @ああ-j2x9l
      @ああ-j2x9l 2 роки тому +1

      ご返信ありがとうございます!
      やりたかったことが出来ました。
      あとでゆっくり実行しながら流れを見たいと思います!
      配列とか使える使えない関数とかvbaって難しいですね。。。
      遅くなりましたが動画いつも拝見させていただいております!
      これからも勉強させていただきますのでよろしくお願いします!

    • @ああ-j2x9l
      @ああ-j2x9l Рік тому

      すみません。。。
      こちらの改良で困ったことがあります💦
      Sub 新案件管理シート()
      Sheets("DB").Range("A1").CurrentRegion.Columns(1).Copy Sheets("DB").Range("Z1")
      Sheets("DB").Range("Z1").CurrentRegion.RemoveDuplicates 1, xlYes
      Dim D
      With Sheets("DB").Range("Z1").CurrentRegion.Offset(1, 0)
      D = .Resize(.Rows.Count - 1)
      End With
      '請求書シートを初期化
      Sheets("DB").Range("Z1").CurrentRegion.ClearContents
      For i = 1 To UBound(D, 1)
      Sheets("DB").Range("A1").AutoFilter 1, D(i, 1)
      Sheets("DB").Range("A1").CurrentRegion.Copy Sheets("DB").Range("Z1")
      Sheets("DB").Range("A1").AutoFilter
      Sheets("請求書").Range("A2,A6:G54").ClearContents
      Sheets("請求書").Range("A2") = Sheets("DB").Range("AA2")
      Dim A, B, C, E, F, G, H
      With Sheets("DB").Range("Z1").CurrentRegion.Offset(1, 0)
      A = .Resize(.Rows.Count - 1).Columns(1)
      B = .Resize(.Rows.Count - 1).Columns(6)
      C = .Resize(.Rows.Count - 1).Columns(7)
      E = .Resize(.Rows.Count - 1).Columns(8)
      F = .Resize(.Rows.Count - 1).Columns(9)
      G = .Resize(.Rows.Count - 1).Columns(10)
      H = .Resize(.Rows.Count - 1).Columns(11)
      End With
      '項目が2つ以上となり、変数が配列になる場合
      If IsArray(A) Then
      Sheets("請求書").Range("A6").Resize(UBound(A)) = A
      Sheets("請求書").Range("B6").Resize(UBound(B)) = B
      Sheets("請求書").Range("C6").Resize(UBound(C)) = C
      Sheets("請求書").Range("D6").Resize(UBound(E)) = E
      Sheets("請求書").Range("E6").Resize(UBound(F)) = F
      Sheets("請求書").Range("F6").Resize(UBound(F)) = G
      Sheets("請求書").Range("G6").Resize(UBound(F)) = H
      '項目が1つとなり、変数が配列ではない場合
      Else
      Sheets("請求書").Range("A6") = A
      Sheets("請求書").Range("B6") = B
      Sheets("請求書").Range("C6") = C
      Sheets("請求書").Range("D6") = E
      Sheets("請求書").Range("E6") = F
      Sheets("請求書").Range("F6") = G
      Sheets("請求書").Range("G6") = H
      End If
      Sheets("DB").Range("Z1").CurrentRegion.ClearContents
      With Sheets("請求書")
      .ExportAsFixedFormat 0, ThisWorkbook.Path & "\" & .Range("A2") & ".pdf"
      End With
      Next
      End Sub
      このvbaですが下記の定義Aの部分でエラー1004が出てしまいます。
      ご教授頂けますと幸いです。

    • @ああ-j2x9l
      @ああ-j2x9l Рік тому

      エラー部分
      Dim A, B, C, E, F, G, H
      With Sheets("DB").Range("Z1").CurrentRegion.Offset(1, 0)
      A = .Resize(.Rows.Count - 1).Columns(1)
      B = .Resize(.Rows.Count - 1).Columns(6)
      C = .Resize(.Rows.Count - 1).Columns(7)
      E = .Resize(.Rows.Count - 1).Columns(8)
      F = .Resize(.Rows.Count - 1).Columns(9)
      G = .Resize(.Rows.Count - 1).Columns(10)
      H = .Resize(.Rows.Count - 1).Columns(11)
      End With

  • @mari-kf5mc4gc3x
    @mari-kf5mc4gc3x 4 місяці тому +1

    取引先別でなおかつ品名別で請求書を作りたいですが難しいでしょうか?

    • @IT-gx8sf
      @IT-gx8sf  4 місяці тому

      コメントありがとうございます!
      取引先別で、品目別で作成したい場合は、取引先リストと品目リストを作成することでできます。
      VBAコードは次のようになります。
      Sub TEST1()

      '取引先リスト取得
      Sheets("DB").Range("A1").CurrentRegion.Columns(1).Copy Sheets("DB").Range("F1")
      Sheets("DB").Range("F1").CurrentRegion.RemoveDuplicates 1, xlYes

      Dim List1, List2
      With Sheets("DB").Range("F1").CurrentRegion.Offset(1, 0)
      List1 = .Resize(.Rows.Count - 1)
      End With

      Sheets("DB").Range("F1").CurrentRegion.ClearContents

      '品目リスト取得
      Sheets("DB").Range("A1").CurrentRegion.Columns(2).Copy Sheets("DB").Range("F1")
      Sheets("DB").Range("F1").CurrentRegion.RemoveDuplicates 1, xlYes

      With Sheets("DB").Range("F1").CurrentRegion.Offset(1, 0)
      List2 = .Resize(.Rows.Count - 1)
      End With

      Sheets("DB").Range("F1").CurrentRegion.ClearContents

      For i = 1 To UBound(List1, 1)
      For j = 1 To UBound(List2, 1)

      '請求書クリア
      Sheets("請求書").Range("A2,A10:E12").ClearContents

      '取引先ごとで品目ごとに抽出
      Sheets("DB").Range("A1").AutoFilter 1, List1(i, 1) '取引先でフィルタ
      Sheets("DB").Range("A1").AutoFilter 2, List2(j, 1) '品目でフィルタ
      Sheets("DB").Range("A1").CurrentRegion.Copy Sheets("DB").Range("F1")
      Sheets("DB").Range("A1").AutoFilter

      Dim A, B, C, E

      '抽出データがある場合
      If WorksheetFunction.Subtotal(103, Range("F1").EntireColumn) > 1 Then

      '取引先を転記
      Sheets("請求書").Range("A2") = Sheets("DB").Range("F2")

      '品目以下を転記
      With Sheets("DB").Range("F1").CurrentRegion.Offset(1, 0)
      A = .Resize(.Rows.Count - 1).Columns(2)
      B = .Resize(.Rows.Count - 1).Columns(3)
      C = .Resize(.Rows.Count - 1).Columns(4)
      E = .Rows.Count - 1
      End With

      Sheets("請求書").Range("A10").Resize(E) = A
      Sheets("請求書").Range("D10").Resize(E) = B
      Sheets("請求書").Range("E10").Resize(E) = C

      'PDFで保存
      With Sheets("請求書")
      .ExportAsFixedFormat 0, ThisWorkbook.Path & "\" & .Range("A2") & "_" & .Range("A10") & ".pdf"
      End With

      End If

      '抽出データをクリア
      Sheets("DB").Range("F1").CurrentRegion.ClearContents

      Next
      Next

      End Sub
      手順としては、次のようになります。
      ・取引先リストを作成(AAA~CCC)
      ・品目リストを作成(デスクトップPC、ノートパソコン、マウス)
      ・取引先と品目リストでそれぞれループ
      ・請求書シートのデータをクリア
      ・取引先と品目ごとにデータを抽出
      ・取引先と品目以下を請求書シートに転記
      ・PDFを作成
      ・抽出データをクリア
      「取引先と品目リストを作成する」ところと、「取引先と品目ごとにデータを抽出する」ところがポイントとなります。
      実行すると、
      AAA_デスクトップPC.pdf
      AAA_ノートパソコン.pdf
      AAA_マウス.pdf
      BBB_デスクトップPC.pdf
      BBB_ノートパソコン.pdf
      BBB_マウス.pdf
      CCC_デスクトップPC.pdf
      CCC_ノートパソコン.pdf
      CCC_マウス.pdf
      というように、同フォルダに上記のファイルが作成されます。
      参考になればと思います(^^)

    • @IT-gx8sf
      @IT-gx8sf  4 місяці тому

      一部VBAコードに訂正がありました。正しくは下記となります。
      Subtotal関数の引数内で、シートを指定しておりませんでしたので、シートを指定しております。
      Sub TEST1()

      '取引先リスト取得
      Sheets("DB").Range("A1").CurrentRegion.Columns(1).Copy Sheets("DB").Range("F1")
      Sheets("DB").Range("F1").CurrentRegion.RemoveDuplicates 1, xlYes

      Dim List1, List2
      With Sheets("DB").Range("F1").CurrentRegion.Offset(1, 0)
      List1 = .Resize(.Rows.Count - 1)
      End With

      Sheets("DB").Range("F1").CurrentRegion.ClearContents

      '品目リスト取得
      Sheets("DB").Range("A1").CurrentRegion.Columns(2).Copy Sheets("DB").Range("F1")
      Sheets("DB").Range("F1").CurrentRegion.RemoveDuplicates 1, xlYes

      With Sheets("DB").Range("F1").CurrentRegion.Offset(1, 0)
      List2 = .Resize(.Rows.Count - 1)
      End With

      Sheets("DB").Range("F1").CurrentRegion.ClearContents

      For i = 1 To UBound(List1, 1)
      For j = 1 To UBound(List2, 1)

      '請求書クリア
      Sheets("請求書").Range("A2,A10:E12").ClearContents

      '取引先ごとで品目ごとに抽出
      Sheets("DB").Range("A1").AutoFilter 1, List1(i, 1) '取引先でフィルタ
      Sheets("DB").Range("A1").AutoFilter 2, List2(j, 1) '品目でフィルタ
      Sheets("DB").Range("A1").CurrentRegion.Copy Sheets("DB").Range("F1")
      Sheets("DB").Range("A1").AutoFilter

      Dim A, B, C, E

      '抽出データがある場合
      If WorksheetFunction.Subtotal(103, Sheets("DB").Range("F1").EntireColumn) > 1 Then

      '取引先を転記
      Sheets("請求書").Range("A2") = Sheets("DB").Range("F2")

      '品目以下を転記
      With Sheets("DB").Range("F1").CurrentRegion.Offset(1, 0)
      A = .Resize(.Rows.Count - 1).Columns(2)
      B = .Resize(.Rows.Count - 1).Columns(3)
      C = .Resize(.Rows.Count - 1).Columns(4)
      E = .Rows.Count - 1
      End With

      Sheets("請求書").Range("A10").Resize(E) = A
      Sheets("請求書").Range("D10").Resize(E) = B
      Sheets("請求書").Range("E10").Resize(E) = C

      'PDFで保存
      With Sheets("請求書")
      .ExportAsFixedFormat 0, ThisWorkbook.Path & "\" & .Range("A2") & "_" & .Range("A10") & ".pdf"
      End With

      End If

      '抽出データをクリア
      Sheets("DB").Range("F1").CurrentRegion.ClearContents

      Next
      Next

      End Sub

  • @tomo-kd4dc
    @tomo-kd4dc Рік тому +1

    すごくわかりやすく、早速作成しております。
    PDFで複数の請求書を作成するのを
    ボタンで操作したいのですが
    ボタンの作成方法を教えていただけますか?

    • @IT-gx8sf
      @IT-gx8sf  Рік тому

      コメントありがとうございます!
      下記の手順で、PDFで複数請求書を作成するVBAコードを、ボタンから実行することができます。
      ■手順
      「開発」タブ→「挿入」→「フォームコントロール」から「ボタン」を選択します。
      ボタンの大きさをドラッグして指定して挿入します。
      ボタンを挿入すると、マクロの登録画面が表示されます。
      登録したいマクロを選択して、OKをクリックします。
      VBAコードをボタンに登録することができます。
      下記のブログにて、指定したVBAコードを、ボタンに登録する方法について解説していますので、参考になるかと思います。
      ↓VBAコードをボタンに登録する方法
      daitaideit.com/vba-make-run-button/
      参考になればと思います(^^)

    • @tomo-kd4dc
      @tomo-kd4dc Рік тому

      返信ありがとうございます😭
      早速、できました!
      しかし、
      エラー13が出てしまいました。
      会社名を増やしました。

    • @tomo-kd4dc
      @tomo-kd4dc Рік тому

      よろしければ教えていただけますでしょうか?

  • @ゆうゆう-o9l
    @ゆうゆう-o9l 2 роки тому +2

    大変面白かったです。勉強になりました。
    一つ質問させてください。
    PDFファイルに日付表示をさせたい場合はどのようにコードを書いたらよいのでしょうか?
    Formatを使用するのは予想がつくのですが特定の参照元のセルの日付をPDFに表示させたいです。
    なのでforamt(rangeとなると思うのですがご教授お願いいたします。

    • @IT-gx8sf
      @IT-gx8sf  Рік тому

      コメントありがとうございます!
      日付を取得したい場合は「Now」を使うとできます。
      または、取得した日付のフォーマットを指定したい場合は、「Format」を使うといいです。
      次のようなVBAコードになります。
      ↓日付と時間を文字数を固定して取得
      Dim H
      H = Format(Now, "yyyymmdd-hhmmss")
      ↓全体のVBAコードは、次のようになります。
      Sub TEST2()

      Sheets("DB").Range("A1").CurrentRegion.Columns(1).Copy Sheets("DB").Range("F1")
      Sheets("DB").Range("F1").CurrentRegion.RemoveDuplicates 1, xlYes

      Dim D
      With Sheets("DB").Range("F1").CurrentRegion.Offset(1, 0)
      D = .Resize(.Rows.Count - 1)
      End With

      Sheets("DB").Range("F1").CurrentRegion.ClearContents

      For i = 1 To UBound(D, 1)

      Sheets("DB").Range("A1").AutoFilter 1, D(i, 1)
      Sheets("DB").Range("A1").CurrentRegion.Copy Sheets("DB").Range("F1")
      Sheets("DB").Range("A1").AutoFilter

      Sheets("請求書").Range("A2") = Sheets("DB").Range("F2")

      Dim A, B, C
      With Sheets("DB").Range("F1").CurrentRegion.Offset(1, 0)
      A = .Resize(.Rows.Count - 1).Columns(2)
      B = .Resize(.Rows.Count - 1).Columns(3)
      C = .Resize(.Rows.Count - 1).Columns(4)
      End With

      Sheets("請求書").Range("A10").Resize(UBound(A)) = A
      Sheets("請求書").Range("D10").Resize(UBound(B)) = B
      Sheets("請求書").Range("E10").Resize(UBound(C)) = C

      Sheets("DB").Range("F1").CurrentRegion.ClearContents

      Dim H
      H = Format(Now, "yyyymmdd-hhmmss")
      With Sheets("請求書")
      .ExportAsFixedFormat 0, ThisWorkbook.Path & "\" & .Range("A2") & "_" & H & ".pdf"
      End With

      Next

      End Sub
      PDFのファイル名に日付を追加するという感じです。
      参考になればと思います(^^)

  • @yuyakoki-wb2wu
    @yuyakoki-wb2wu Рік тому +1

    エクセルデータで任意のフォルダに保存したいのですがうまくいきません。何故かデスクトップに保存されてしまいます。何か良い方法はないでしょうか?

    • @IT-gx8sf
      @IT-gx8sf  Рік тому +1

      コメントありがとうございます!
      任意のフォルダに保存したい場合は、
      最後の方のVBAコードを変更することで、うまくいくかと思います。
      ・ブックを名前を付けて保存するVBAコード
      ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & Range("A2") & ".xlsx"
      ↓任意のフォルダパスに変更
      ActiveWorkbook.SaveAs "任意のフォルダパス" & "\" & Range("A2") & ".xlsx"
      上記の変更で作成できない場合は、下記の点を確認するとうまくいくかと思います。
      ・注意点
      任意のフォルダは、あらかじめ作成されている必要があります。
      フォルダパスが誤っている場合は、デスクトップに保存される場合があります。

    • @yuyakoki-wb2wu
      @yuyakoki-wb2wu Рік тому +1

      分かりやすい回答ありがとうございます!任意のフォルダパスを打ち込む際、区切り?の部分は¥ではダメですか?

    • @IT-gx8sf
      @IT-gx8sf  Рік тому

      @@yuyakoki-wb2wu
      UA-camのコメントの仕様で、「/」になってしまっていますが、ご指摘のとおり、区切りは「¥」で区切るのが正しいです。

  • @後藤琢也-n2q
    @後藤琢也-n2q Рік тому +1

    請求内容が1行の場合だと、エラーになりませんか?

    • @IT-gx8sf
      @IT-gx8sf  4 місяці тому

      コメントありがとうございます!
      転記する際に「UBound」を使ってしまいますと、1行だった場合にエラーが出ておりました。
      With Sheets("DB").Range("F1").CurrentRegion.Offset(1, 0)
      A = .Resize(.Rows.Count - 1).Columns(2) '品目
      B = .Resize(.Rows.Count - 1).Columns(3) '単価
      C = .Resize(.Rows.Count - 1).Columns(4) '数量
      End With

      Sheets("請求書").Range("A10").Resize(UBound(A, 1)) = A '品目
      Sheets("請求書").Range("D10").Resize(UBound(B, 1)) = B '単価
      Sheets("請求書").Range("E10").Resize(UBound(C, 1)) = C '数量
      下記のように、「.Rows.Count - 1」を使って、見出しを除いたデータの行数を、そのまま使用することで、1行の場合でもエラーなく転記することができます。
      With Sheets("DB").Range("F1").CurrentRegion.Offset(1, 0)
      A = .Resize(.Rows.Count - 1).Columns(2) '品目
      B = .Resize(.Rows.Count - 1).Columns(3) '単価
      C = .Resize(.Rows.Count - 1).Columns(4) '数量
      Sheets("請求書").Range("A10").Resize(.Rows.Count - 1) = A '品目
      Sheets("請求書").Range("D10").Resize(.Rows.Count - 1) = B '単価
      Sheets("請求書").Range("E10").Resize(.Rows.Count - 1) = C '数量
      End With
      だいぶ遅くなり恐れ入ります。
      備忘のためコメントいたします。