- 締切済み
重複データを抽出して、重複データごとに印刷する
重複データを抽出して、重複データごとに印刷する こんにちは。Excel2007を使っています。 購入代金の請求をするにあたり、請求数が5を超える場合には 請求書をまとめて発送したいと考えています。 データはエクセル上に入っています。 A B 1 宛先 金額 2 ○×商店 243,000円 3 ○×商店 14,990円 4 ○×商店 240,100円 5 ○×商店 33,400円 6 ○×商店 1,000円 7 △△(株) 3,000円 8 △△(株) 1,500円 9 □×商会 243,000円 10 □×商会 14,990円 11 □×商会 240,100円 12 □×商会 33,400円 13 □×商会 1,000円 14 □×商会 1,000円 … … 1000 △○×会 3,500円 この場合、○×商店と□×商会は請求書の数が5を超えているので、 まとめて発送の対象になります。 その、まとめて発送するリストを作成したいのです。 具体的には、重複が5未満のデータを削除して、重複が5以上のデータだけ残し、 さらに宛先ごとの送付リストを作成したいのです。 (重複宛先の最後に改ページを挿入して、まとめて印刷出来れば、と思います) このようなリストを簡単に作成するには、どのようにしたらよいでしょうか? 今は、重複しないデータを目で見て削除して、5通を超えるものの宛先の最後に改ページを 入れるというのを一々手作業でやっています…(>_<) マクロを使えばできるのか、エクセルの機能を使えばできるのか見当もつかなかったので、 こちらで質問させていただきました。 もし簡単に出来る方法があればご教授いただけるとありがたいです。 回答よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
こういうのは仕事・業務的なEXCELの応用で、本来はプロにプログラムを組んでもらうか、出来合いのソフトをさがすべきです。VBAが出来ない人がやるべきではありません。VBAでも熟練者で無いと、バグがでて、会社などに損害を与える恐れが大きいからです。 ーーー VBAがやれれば、5件以下と超えるとは、両方やり方を変えることはしません。質問の発想そのものが、経験不足を物語ってます。 >マクロを使えばできるのか プロはこんなことはしょっちゅうやってます。出来るかなんて思ったりもしません。 エクセルは複数得意先のデータを表形式でデータを整理します。それに比べ、伝票や請求書などは得意先別の単票形式なのでその変換には、人手では手数を食うので、プログラムの出番です。 === しかしVBAを直ぐ習熟は出来ません。そこで関数と折衷方法を書いてみます。 以前から私の回答で、Googleで「imogasi 請求書」で照会すれば、出てくるやり方の変化版である。 例データ 会社ごとにソートしてあるとする(下記ではB列でソート済みが出発点) Sheet1 データはB,C列 A列は=IF(B1=B2,A1,MAX($A$1:A1)+1) で下方向に式複写。会社ごとに連番を振る。 会社連番 会社名 計数 1 a 10 1 a 12 1 a 21 1 a 23 1 a 13 1 a 15 1 a 33 2 b 23 2 b 34 3 C 16 3 C 26 3 C 18 3 C 24 3 C 25 3 C 6 ーーーー Sheet1 のC1に順序の数字を入れる。まず1と入れる C2セルに =IF(ROW()-1>COUNTIF(Sheet1!$A$1:$A$100,$C$1),"",INDEX(Sheet1!$A$1:$C$101,MATCH($C$1,Sheet1!$A$1:$A$101,0)+ROW()-2,2) D2には =IF(ROW()-1>COUNTIF(Sheet1!$A$1:$A$100,$C$1),"",INDEX(Sheet1!$A$1:$C$101,MATCH($C$1,Sheet1!$A$1:$A$101,0)+ROW()-2,3)) 最後の2が3に変わっただけに注目。 C2:D2を範囲指定し+ハンドルを出して、式を5行分下に複写(印刷は1ページ5件から) 結果 B2:C6 a 10 a 12 a 21 a 23 a 13 上記データ以外は見出しなど適当に。書式罫線行高、列幅も人手で(1回だけ)設定すれば良い。 ーーー 6件目以降の5件は 例えば31行目のB31に =IF(ROW()-25>COUNTIF(Sheet1!$A$1:$A$100,$C$1),"",INDEX(Sheet1!$A$1:$C$101,MATCH($C$1,Sheet1!$A$1:$A$101,0)+ROW()-26,2)) C31は =IF(ROW()-25>COUNTIF(Sheet1!$A$1:$A$100,$C$1),"",INDEX(Sheet1!$A$1:$C$101,MATCH($C$1,Sheet1!$A$1:$A$101,0)+ROW()-26,3)) B31:c31を範囲指定して+ハンドルを出して、式を5行分下に複写 row()-25, ROW()-26 のところは、第31行目からなどから導出される数で、旨く調節のこと。 結果 7件の残り2件 a 15 a 33 ーーー C1セルの値を2,3に変化すると、シ-トの内容が変化する。 3だと C2:D6は C 16 C 26 C 18 C 24 C 25 C31:C35は C 6 ーーー 11件以上の会社があれば61行目などにも式を設定。row()-25,ROW()-26のところは旨く算出してください。 ===== 以上で関数の役割は終わり。 後はC1の数字を会社数まで変化させて、その都度印刷する。そのVBAを作る 標準モジュールに Sub test01() For i = 1 To 4 '会社数分だけC1セルを変化させる。本例では4社 Range("C1") = i Range("A1:D30").PrintOut 'セル範囲印刷 If Range("C31") <> "" Then '5件以上あれば Range("A31:D60").PrintOut End If If Range("C61") <> "" Then '11件以上あれば Range("A61:D90").PrintOut End If Next i End Sub 関連する個所が色々あるので良く類推を働かせて変えること。
- aokii
- ベストアンサー率23% (5210/22062)
はじめに、宛先でピボットテーブルを作り、件数の並べ替えで、5件以上の店を探す。 5件以上の店が決まったら、VLOOKUP関数で、5件以上の店にのみマークを付ける。
補足
さっそくのご回答ありがとうございます。 ピボットテーブル…すみません。 恥ずかしながら使ったことがなく、宛先でピボットテーブルを作るという のが分かりませんでした(>_<) ですが、その方法によって、今5件以上あるか目で確認している作業が 簡単にできるということですよね? ただ、それだとまだ宛先ごとに改ページを入れて一気に印刷という作業は 手作業になってしまいますよね。。 最近簡単な(ほんとに簡単な)マクロを勉強し始めたところなので、 5件以上の宛先を一気に抽出して、かつ改ページを挿入して印刷するという作業が 1ボタン(もしくは簡単な作業)で出来やしないかと思ったのですが、やはり難しいでしょうか? 説明不足ですみません。 よろしければ、引き続きアドバイスお願いいたします。
補足
詳しく回答していただきありがとうございます。 >質問の発想そのものが、経験不足を物語ってます。 その通りです、安易に質問してしまい申し訳ありません。 おっしゃる通り、にわかに勉強しただけでは、エクセルの世界は 理解できないようですね。経験不足を実感いたしました。 さて、imogasiさんに教えていただいた通り、やってみたのですが、 >A列は=IF(B1=B2,A1,MAX($A$1:A1)+1) で下方向に式複写。 この時点で脱落いたしました(><) 「循環参照であるため、正しい計算が出来ない」みたいなダイアログが出ました。 知識不足の私には高度すぎる内容だったようです。。 せっかく答えていただいたのに、それを理解できない自分が悔しいです。 もうちょっと考えてみます。 ありがとうございました。