• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:売上表エクセルから優良顧客を抽出する関数(画像有))

売上表エクセルから優良顧客を抽出する関数

このQ&Aのポイント
  • 売上表エクセルから優良顧客を抽出する方法について教えてください。
  • 具体的な条件として、3万円以上購入した優良顧客の顧客名と購入金額を表示し、購入日付も表示することができる関数を作成したいです。
  • エクセルで優良顧客を抽出する方法がわからない場合、秀丸のGREP機能を使用して同様の検索を行うことも考えています。

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

  • ベストアンサー
noname#192382
noname#192382
回答No.2

下に二つのマクロがあります。もとの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

ARIES10
質問者

お礼

上記補足にて状況をお伝えしましたが、 マクロがセルの統合時に対応できていないのだと思い、 各月の売上表を開いて全シートを選択して全セルを選択して 一括でセルの統合の解除を行いました。 そしてエクスポートしたマクロ1・2を 都度エクスポートしました。 そしてシート1のB1に「2」を入れました。 この状況でマクロ1・2を実行すれば、シート1に 30000円以上の顧客がセットされていきました。 マクロ1を実行した状態で各ページ高い順に ソートされていますが 顧客の行より上の方が何行かよくわからない行が セットされているので マクロ2を実行した結果では30000円以上の顧客以外にも その空白行が各日分挿入されますが、 すぐに30000円以上の顧客がみつけられるので問題ありません。 ちなみに補足に書いた3日目までしか行かないのは マクロ2の方のsheetsuを直すのを忘れていただけでした、 失礼しました。 つまり、少し追加作業をすれば充分求める結果が得られています。 2年分くらいを確認しようと思っているので 730日ページを確認しなければ ならなかったところが、各ファイル、少し手を加えて 後は実行指示を出して放っておいてしばらくして結果を 確認してまた次を実行指示して放っておいて、で、 既に2012年の4月まで終わりました。 非常に、非常に助かっています。 また、マクロの組込がこれで無事2回目を成功し、 必要に迫られエクスポートやインポートもデビューできて 非常に満足しています。 本当にご親切にありがとうございました。 わずかな希望に期待して投稿してよかったです。

ARIES10
質問者

補足

早速のご回答ありがとうございます。 また、ご親身に専用マクロを作成してくださり大変感謝しています。 感激いたしました。 早速マクロをエクセルに入れてみました。 (実はマクロについてはまだなじみが薄いです) 結果としては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の実行エラーの解消が可能でしたらどうぞ宜しくお願いいたします。 すみません、自分でもデバッグしようと思ったのですが中身の関数がほぼ全て 分からなくて・・・。

その他の回答 (2)

noname#192382
noname#192382
回答No.3

マクロ2で終わりに近いところで下のように Exit For を入れると計算時間が節約できるのではないかと考えつき、お伝えするために出てきました。 endgyo = endgyo + 1 Worksheets(1).Cells(1, 2) = endgyo Else Exit For End If マクロの組み込み方ですが、あなたのやり方が正式かもしれませんが、私がやっているのは (1)ツールの中のマクロのところで新規マクロの記録を選び、そのまますぐに終了にします。 (2)ツールの中のマクロのところでマクロを選ぶと、先ほどつくったマクロがリストアップされていますので、それを指定して編集をすることにします。 (3)プログラムの本体部分に手に入れたマクロプログラムをコピー貼り付けをしプログラムとしての形式を整えます。 (4)保存した後 (5)ツールの中のマクロのところでマクロを選ぶと、先ほどつくったマクロがリストアップされていますので、指定して実行します。 そこで体裁はともかくとして、解決しなければならないところ、問題はどんなことでしょうか。ポイントを教えてください。

ARIES10
質問者

お礼

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

noname#192382
noname#192382
回答No.1

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

ARIES10
質問者

補足

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