• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel 異なるシートに自動入力 請求書作成)

Excel 異なるシートに自動入力 請求書作成

このQ&Aのポイント
  • 例ですが、以下のようにsheet1のセルに入力されています。
  • sheet2に以下のように自動で入力させ、佐藤さんへの配送料の請求書を作成を考えております。
  • VLOOKUP関数を用いて自動で入力させようと考えたのですが、TRUEではないセルは「#N/A」(もしくはIF文で空白)と入力させてしまうため、他の方法がございましたら、と思い皆様の知恵をお借りしたく投稿いたしました。

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

  • ベストアンサー
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 お求めの請求書とは若干デザインが異なりますが、次の様な方法は如何でしょうか。  今、以下の様なデザインで表示を行うものとします。 【Sheet2】     A      B 1  請求書 2  佐藤     様     ←「佐藤」 はA2セルに手入力する 3 4  品物    配送料   ←「品物」、「配送料」は固定  5  リンゴ     100 6  いちご     100 7                ←1行空ける     8  合計      200   ←「合計」 は常に最終行の2行下                    (移動式で自動表示)  まず、Sheet2に次の様に入力して下さい。     A      B 1  請求書 2          様 3 4  品物    配送料  次に、Sheet2のA5セルに次の数式を入力して下さい。 =IF(ROWS($4:4)>COUNTIF(Sheet1!$D:$D,$A$2),IF(ROWS($4:4)=COUNTIF(Sheet1!$D:$D,$A$2)+2,"合計",""),INDEX(Sheet1!$A:$A,SUMPRODUCT(ROW(OFFSET(Sheet1!$C$1,,,MATCH(99^9,Sheet1!$C:$C)))*(OFFSET(Sheet1!$D$1,,,MATCH(99^9,Sheet1!$C:$C))=$A$2)*(COUNTIF(OFFSET(Sheet1!$D$1,,,ROW(OFFSET(Sheet1!$C$1,,,MATCH(99^9,Sheet1!$C:$C)))),$A$2)=ROWS($4:4)))))  次に、Sheet2のB5セルに次の数式を入力して下さい。 =IF(ROWS($4:4)>COUNTIF(Sheet1!$D:$D,$A$2),IF(ROWS($4:4)=COUNTIF(Sheet1!$D:$D,$A$2)+2,SUM(B4:B$5),""),INDEX(Sheet1!$C:$C,SUMPRODUCT(ROW(OFFSET(Sheet1!$C$1,,,MATCH(99^9,Sheet1!$C:$C)))*(OFFSET(Sheet1!$D$1,,,MATCH(99^9,Sheet1!$C:$C))=$A$2)*(COUNTIF(OFFSET(Sheet1!$D$1,,,ROW(OFFSET(Sheet1!$C$1,,,MATCH(99^9,Sheet1!$C:$C)))),$A$2)=ROWS($4:4)))))  次に、Sheet2のA5~B5の範囲をコピーして、同じ列の6行目以下に貼り付けて下さい。  以上で準備は完了で、後はA2セルに御請求先の名前を入力するだけで、表示が行われます。

sealand1
質問者

お礼

ご回答ありがとうございます。 このような方法は私の知識の中では思いつきませんでした。 とても助かります。 実際のsheetで使えるように内容を一部改変して使わせていただこうと思います。。 ありがとうございました。

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1416)
回答No.3

>sheet1のコード表示で Private Sub Workbook_SheetBeforeDoubleClick このプロシージャ名から分かるように、これは ワークブックのコードです。 だからWorkbookのコードにコピペしてください。 因みにプロシージャにキャレットを置いた時、 画面左上で「(General)」となっていると、単なる 利用者プロシージャなので、イベントによる起動は 行われません。

sealand1
質問者

お礼

丁寧なご回答をありがとうございます。 私の理解の不足なのですが、「This Workbook」に貼り付けたのですが、うまくマクロをはしらせることができませんでした。 お恥ずかしながら、VBAは全くの初心者ですので。 Private Sub 請求書作成 (ByVal 名前 As String) 以降が(General)になる状況です。 折角書いていただいたマクロを使いたいので、対策をお教えいただけないでしょうか??

  • nda23
  • ベストアンサー率54% (777/1416)
回答No.1

VBA(マクロ)しか思いつきません。 'ダブルクリック検出時の処理 Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) 'Sheet1の上で発生した場合のみ処理する If Sh.Name = "Sheet1" Then     '1行目以外の4列目だけ対象     If Target.Row <> 1 And Target.Column = 4 Then         '名前を受け取る         Dim 名前 As String         名前 = Target.Value         '空欄でない場合         If 名前 <> "" Then             '請求書を作るか問い合わせる             If MsgBox(名前 & "さんの請求書を作りますか", vbQuestion + vbYesNo) = vbYes Then                 '「はい」が応答されたら請求書を作る                 請求書作成 名前             End If         End If     End If End If End Sub Private Sub 請求書作成(ByVal 名前 As String) Dim 最終行 As Long Dim 検索行 As Long Dim 記録行 As Long 'Sheet2の最終行を求める 最終行 = Sheet2.Cells.SpecialCells(xlCellTypeLastCell).Row If 最終行 > 1 Then     '2行目以降を削除する     Sheet2.Rows("2:" & CStr(最終行)).Delete End If 'Sheet1の最終行を求める 最終行 = Sheet1.Cells.SpecialCells(xlCellTypeLastCell).Row 'Sheet2に記録する際の行位置を初期化 記録行 = 1 'Sheet1を検索しながらSheet2へ記録 For 検索行 = 2 To 最終行     If Sheet1.Cells(検索行, 4) = 名前 Then         '記録行を更新         記録行 = 記録行 + 1         '名前が一致したら品物と配送量を転記する         Sheet2.Cells(記録行, 1) = Sheet1.Cells(検索行, 1)         Sheet2.Cells(記録行, 2) = Sheet1.Cells(検索行, 3)     End If Next '1行空けて合計 Sheet2.Cells(記録行 + 2, 1) = "合計" '2~記録行までの合計 Sheet2.Cells(記録行 + 2, 2).Formula = "=SUM($B$2:$B$" & CStr(記録行) & ")" End Sub 対象となるワークブックのマクロとして上記をコピペしてください。

sealand1
質問者

お礼

早速のご回答ありがとうございます。 とてもわかりやすく、プログラムを書いていただきありがとうございます。 とても参考になります。 たびたびの質問でもうしわけありませんが、 sheet1のコード表示で記載していただいたマクロをコピー、ペーストしましたところ、sheet1上でダブルクリックの操作を行ってもマクロがはしらないのですが、対処法を教えていたいただけますでしょうか? お願いいたします。