• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:EXCELで売上データから請求明細書を作成したい)

EXCELで売上データから請求明細書を作成する方法は?

このQ&Aのポイント
  • EXCELで売上データから請求明細書を作成する方法を教えてください。
  • EXCEL2007でお客様との取引データを管理しています。データを絞り込んで請求明細書を作成する方法を知りたいです。
  • VBAが苦手で、EXCELで売上データから請求明細書を作成する方法を教えていただきたいです。

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

  • ベストアンサー
  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.4

>抽出したデータが“車種”であれば、請求明細シートの車種の列全体を選択して設定するということでよいのでしょうか。 車種が元データ(Sheet1)のE列にあるなら、INDEX関数の範囲を「Sheet1!E:E」にしてください。 >また、いろいろ調べてみたのですが、知識不足でSMALL以降の式の区切れが今一つ理解できませんでした。 最後の …ROW($A$2:$A$1000),1000),ROW(A1))) のあたりと、SMALLが入ってくる理由が分からないのですが、できましたらその点についてさらにお教えいただけませんでしょうか。 SMALL(IF((Sheet1!$B$2:$B$1000=$A$2)*(Sheet1!$A$2:$A$1000>=$B$2)*(Sheet1!$A$2:$A$1000<=$C$2),ROW($A$2:$A$1000),1000),ROW(A1)) IF関数部分は、(Sheet1!$B$2:$B$1000=$A$2)*(Sheet1!$A$2:$A$1000>=$B$2)*(Sheet1!$A$2:$A$1000<=$C$2)が成立する(3条件とも成り立ち1になる)場合は、その行数を、成立しない場合は1000(行範囲よりも大きい数)の配列を返しています。 この配列の中で小さい順に1から順にその行数を求めています(ROW(A1)は1になります)。 この数字がそれぞれ3つの条件が合致する行数ですので、INDEX関数でその値を求めています。 この時、該当データがない場合は1000行目のデータを参照しますので、「0」と表示されことになります。 表示したいデータが車種のように文字列データの場合は、数式の最後に「&""」を追加するのが簡単な対応です。 数字データや日付データなどを引っ張ってきたいときは、上記の「&""」の追加では対応できないので、シートのオプションでゼロ値を表示しない設定などの対応をする必要がありますが、配列数式を多用すると、シートの動きが重くなるので、たとえばIF関数などで以下のような数式にするのがお勧めです。 =IF(車種のセル="","",元の配列数式)

eimisaru
質問者

お礼

ずいぶんと時間が経ってしまい失礼しました。結局、今回はVBAで何とか作成することができたのですが、配列数式のことを学ぶことができ、とても参考になりました。 どうもありがとうございました。

その他の回答 (3)

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.3

このケースならVBAで対応するよりも、関数だけで処理するほうが簡単かもしれません。 元データがSheet1で、日付がA列、得意先がB列にあり、請求書シートのA2セルに抽出したい得意先名、B2セルに開始日、C2セルに終了日が入っている場合、条件に該当するC列のデータを抽出したいなら以下の式を入力して、Ctrl+Shift+Enterで確定して配列数式にして、下方向にオートフィルします。 =INDEX(Sheet1!C:C,SMALL(IF((Sheet1!$B$2:$B$1000=$A$2)*(Sheet1!$A$2:$A$1000>=$B$2)*(Sheet1!$A$2:$A$1000<=$C$2),ROW($A$2:$A$1000),1000),ROW(A1))) 上記のl数式では、該当データがないと「0」と表示されますので、この「0」を非表示にするには、Excelのオプションで「ゼロ値のセルにゼロを表示する」のチェックを外してください。 なお、抽出する値が文字列の場合は、数式の最後に「&""」を付けることで対応することもできます。

eimisaru
質問者

お礼

ご回答ありがとうございます! これなら解決できそうと思い、試行錯誤してみましたが、配列数式はあまりなじみがなくうまくいきませんでした。 基本的なことで申し訳ないのですが、この式を設定する範囲なのですが・・・ 抽出したデータが“車種”であれば、請求明細シートの車種の列全体を選択して設定するということで よいのでしょうか。 また、いろいろ調べてみたのですが、知識不足でSMALL以降の式の区切れが今一つ理解できませんでした。 最後の …ROW($A$2:$A$1000),1000),ROW(A1))) のあたりと、SMALLが入ってくる理由が分からないのですが、できましたらその点についてさらにお教えいただけませんでしょうか。 面倒なお願いで申し訳ないですが、どうかよろしくお願いいたします。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.2

例えば元となる表がシート1に有ってA1セルに売上日付、B1セルに得意先、C1セルに運搬先などの項目名が右横に入力されてT1セルまでにあるとします。 また、データを抽出したい得意先名はシート2のA1セルに、期間の初めはB1セルに、期間の終わりはC1セルに入力してシート2にそれらの希望に沿ったデータを表示させることにします。 そこでシート1には作業列としてU列を使用しU2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(AND(B2=Sheet2!$A$1,A2>=Sheet2!$B$1,A2<=Sheet2!$C$1),MAX(U$1:U1)+1,"") その後に例えばシート2の3行目にはシート1の1行目で使われた項目名で請求書を作成するうえで必要な項目名をA3セルから右横方向に並べて入力します。 シート2のA4セルには次の式を入力して右横方向にオートフィルドラッグしたのちに下方にもオートフィルドラッグします。 =IF(OR(ROW(A1)>MAX(Sheet1!$U:$U),COUNTIF(Sheet1!$1:$1,A$3)=0),"",INDEX(Sheet1!$A:$T,MATCH(ROW(A1),Sheet1!$U:$U,0),MATCH(A$3,Sheet1!$1:$1,0))) これで請求書を作るのに必要な項目が選択した得意先と期間についてシート2に表示されますので、例えばシート3には請求書のスタイルを作ったうえでシート2からのデータを直接表示させるようにすればよいでしょう。 これら一連のことが完成していればシート2の1行目の条件を変えることで新しい得意先の請求書もできることになりますね。参考になりましたら幸いです。

eimisaru
質問者

お礼

お礼が遅くなりましたが、どうもありがとうございました。 結局、VBAで何とか作成することができました。

  • riri1609
  • ベストアンサー率36% (199/540)
回答No.1

1例です。19項目のデータは、横1列に並んでいるものとします。 データシートの19項目の前(一番左側)に、ID/No.を入れます。 あとはそのIDを入力するところをつくり、VLOOKUPで反映させれば、一応のことは出来ます。 私は領収書や封筒の宛名印刷、送付案内の宛名等で同様の方法を用いております。

eimisaru
質問者

お礼

早々にありがとうございます。なるほど、VLOOKUPを使うという方法もありますね。 ありがとうございます。

関連するQ&A