プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。

過去の売上表から優良顧客を抽出したいのですが
関数を組むことで実現可能であれば方法を教えて下さい。


・売上表はエクセル(excel2007)です。
・月ごとに1ファイル用意しています。
・ファイル内は日ごとに1シート用意しています。
 (2シート目が各月1日です。)
・シート内のレイアウトは以下です。
 【行】
 1行目:タイトル
 2行目:列タイトルを表記
 3行目以降:売れた商品ごとに1行ずつ表記
 ※一人の客が複数着買った場合には服は1行ずつですが
  列によっては複数行が統合されています。

 【列】
 A~F列:色々
 G列:売れた商品名
 H列:定価
 I列:売値
 J列:客単価
   ※一人の客が複数着買った場合には服はJ列は複数行統合されます。
 K列:総売上
   ※行は統合されませんが服数着買った場合は最下行にのみセットされます。
   ※客単位ではなくその時点での1日の総売上です。
 M列:顧客名
   ※一人の客が複数着買った場合には服はM列は複数行統合されます。

となります。

この状況化で優良顧客を抽出したいです。

どのように抽出したいか、は以下です。

■各ファイル毎に最初のページのT列より右に検索結果を表示する
■一回で3万円以上購入した優良顧客を抽出する
■顧客名、購入金額を表示する
■購入日付(=シート名)を表示する

今回の例であれば
山本アローナさん、紫藤フトコロンソさん、新藤ブスケッツさんが
抽出されて欲しいです。

関数に明るくないのでそもそも実現不可能なのかどうかがわかっていません。
もしエクセルでやるのがナンセンスで秀丸のGREP機能でこういう検索の
指定方法がある、などの事があればそういったご回答でも大歓迎です。
(GREPでは検索文字指定はできても3万円以上という範囲指定は
自分ではわかりませんでした。)

よろしくお願いいたします。

「売上表エクセルから優良顧客を抽出する関数」の質問画像

A 回答 (3件)

下に二つのマクロがあります。

もとのdataを安全のためにフラッシュメモリーなどに保存してから、はじめにマクロ1、ついでマクロ2を実行してみてください。
ただ(1)シート1のB1に2と入れておいてください(2)シート数はここでは4と指定していますがマクロ1とまくろ2のプログラムの中でsheetsu を所定の数に直してください。(3)シートのデータ数が一番多いのはいくつですか。マクロ2の中で10としていますが、適宜再指定してください。
どんな結果になるか試してみてください。


Sub Macro1()
'
' Macro1 Macro
' マクロ記録日 : 2013/1/24 ユーザー名 :
'

'
Dim myshtno As Integer, sheetsu As Integer
sheetsu = 4
For myshtno = 2 To sheetsu

Worksheets(myshtno).Select
'MsgBox Range("A1:M4").Rows.Count

Range(Cells(1, 1), Cells(Rows.Count, 13)).Select
Selection.Sort Key1:=Range("J2"), Order1:=xlDescending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
:=xlPinYin
Next
End Sub
Sub Macro2()
'
' Macro2 Macro
' マクロ記録日 : 2013/1/25 ユーザー名 :
'
'
Dim myshtno As Integer, sheetsu As Integer, mygyo As Integer, endgyo As Integer
sheetsu = 4
For myshtno = 2 To sheetsu


'MsgBox Range("A1:M4").Rows.Count
For mygyo = 2 To 10

Worksheets(1).Select
endgyo = Cells(1, 2)
Worksheets(myshtno).Select
If Cells(mygyo, 10) >= 30000 Then
Rows(mygyo).Select
Selection.Copy
Worksheets(1).Select
Rows(endgyo).Select
ActiveSheet.Paste
endgyo = endgyo + 1
Worksheets(1).Cells(1, 2) = endgyo
Else
End If

Next

Next


'
End Sub

この回答への補足

早速のご回答ありがとうございます。
また、ご親身に専用マクロを作成してくださり大変感謝しています。
感激いたしました。

早速マクロをエクセルに入れてみました。
(実はマクロについてはまだなじみが薄いです)

結果としてはmacro1が実行時エラーでmacro2は実行完了しました。

******
実行時エラー'1004':
この操作には、同じサイズの結合セルが必要です。
******

※デバッグを押すとこの部分↓が黄色でマーカーされています。

Selection.Sort Key1:=Range("J2"), Order1:=xlDescending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
:=xlPinYin

macro2の実行結果は
ある月の売上表でやってみたところ、
エクセルがブレた感じでディスプレイにはしばらく表示されていて
実行完了時には3日目まで参照シートが移っていました。
(1シート目が結果表示用なので、1,2,3日と進むのでシートとしては4シート目)
そして1シート目のB1は「5」に数字が変わっていて、
列タイトルを表示している2行目が3行目と4行目にコピーされていました。

※シート1は自分が既に他の要件のためセットしたマクロで
 「全ページの同セルの値を足し込んでその日までのその月の合計金額を出す」
 というマクロの為、2シート目以降と同じレイアウトになっています。
 質問投稿時に抽出したい方法に
 「■各ファイル毎に最初のページのT列より右に検索結果を表示する」
 と書いたのはそのためです。

私はマクロをネットから落としてエクセルに組み込んで実行したことが一回しかないため正しくセットアップが出来ているか怪しいので一応下記に作業内容を
書かせて下さい。

1.エクセルを開き、開発タブを開き、Visual Basicをクリック。
2.「標準モジュールの挿入」を実施しそこにマクロ1の内容を貼り付けて保存。
  sheetsuは12月は31日で、そして結果表示用のシート1があるので「32」にした。
3.「標準モジュールの挿入」を実施しそこにマクロ2の内容を貼り付けて保存。
  データ数は31行用意してあるので「For mygyo = 2 To 31」にした。
4.開発タブのマクロをクリック。マクロ1を選択して実行。
  実行時エラーになるので終了を選択。
5.開発タブのマクロをクリック。マクロ2を選択して実行。正常終了。

という流れです。

マクロ1の実行エラーの解消が可能でしたらどうぞ宜しくお願いいたします。
すみません、自分でもデバッグしようと思ったのですが中身の関数がほぼ全て
分からなくて・・・。

補足日時:2013/01/26 12:10
    • good
    • 0
この回答へのお礼

上記補足にて状況をお伝えしましたが、
マクロがセルの統合時に対応できていないのだと思い、
各月の売上表を開いて全シートを選択して全セルを選択して
一括でセルの統合の解除を行いました。
そしてエクスポートしたマクロ1・2を
都度エクスポートしました。
そしてシート1のB1に「2」を入れました。
この状況でマクロ1・2を実行すれば、シート1に
30000円以上の顧客がセットされていきました。
マクロ1を実行した状態で各ページ高い順に
ソートされていますが
顧客の行より上の方が何行かよくわからない行が
セットされているので
マクロ2を実行した結果では30000円以上の顧客以外にも
その空白行が各日分挿入されますが、
すぐに30000円以上の顧客がみつけられるので問題ありません。
ちなみに補足に書いた3日目までしか行かないのは
マクロ2の方のsheetsuを直すのを忘れていただけでした、
失礼しました。

つまり、少し追加作業をすれば充分求める結果が得られています。
2年分くらいを確認しようと思っているので
730日ページを確認しなければ
ならなかったところが、各ファイル、少し手を加えて
後は実行指示を出して放っておいてしばらくして結果を
確認してまた次を実行指示して放っておいて、で、
既に2012年の4月まで終わりました。

非常に、非常に助かっています。
また、マクロの組込がこれで無事2回目を成功し、
必要に迫られエクスポートやインポートもデビューできて
非常に満足しています。
本当にご親切にありがとうございました。
わずかな希望に期待して投稿してよかったです。

お礼日時:2013/01/27 15:28

マクロ2で終わりに近いところで下のように Exit For を入れると計算時間が節約できるのではないかと考えつき、お伝えするために出てきました。




endgyo = endgyo + 1
Worksheets(1).Cells(1, 2) = endgyo
Else
Exit For
End If

マクロの組み込み方ですが、あなたのやり方が正式かもしれませんが、私がやっているのは
(1)ツールの中のマクロのところで新規マクロの記録を選び、そのまますぐに終了にします。
(2)ツールの中のマクロのところでマクロを選ぶと、先ほどつくったマクロがリストアップされていますので、それを指定して編集をすることにします。
(3)プログラムの本体部分に手に入れたマクロプログラムをコピー貼り付けをしプログラムとしての形式を整えます。
(4)保存した後
(5)ツールの中のマクロのところでマクロを選ぶと、先ほどつくったマクロがリストアップされていますので、指定して実行します。

そこで体裁はともかくとして、解決しなければならないところ、問題はどんなことでしょうか。ポイントを教えてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。

「解決」にしていなかったのは
回答者2様が私の補足や御礼に何か
リアクションされるかもしれないと思い、
ベストアンサー選定をしてご回答を締め切っては
よくないと思ってのことでした。

状況としては解決しております。
失礼いたしました。

お礼日時:2013/02/15 19:37

試しに次のことをやってみてください。


1 N列に上から1、2、3と番号を振っておいてください。これは変になったとき元に戻すためです。
2 J列を基準として降順に並べ替えをしてください。(メニューバーのデータのなかの並べ替えの機能)
これで望みのデータが得られないでしょうか。
元に戻すのは N列を基準に昇順に並べ替えをすればよいです。

この回答への補足

日々の売上表ですので、
それをやる場合過去数日分ならよいですが、
仮に12か月分だとしても
365回やらなければならなくなってしまいます。
その労力はちょっとかけにくいこともありまして、
そのため、関数に頼って、
せめて1ファイル(=一カ月分)を開けば
すぐにその月の対象者がわかる仕組みが欲しくて…

でも早速のご回答ありがとうございます。
上記の仕組み、もし可能でしたら宜しくお願いします。

補足日時:2013/01/24 18:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!