• 締切済み

【至急】Excelマクロで最大売上げ日を抽出する方法

A,B,Cという3つの商品の売上げ数が日付で整理されているデータがあります。 この3商品に対して各月毎の最大売上げ日を抽出したいと考えています。 ただし、データの数が膨大で並びもぐちゃぐちゃなため、 マクロなしでは整理しにくい状態となっています。 データ整理の詳細については添付ファイルをご参照ください。 ■背景 「今日中にデータ(Excel)を整理してほしい」という上司からの無茶振りで初めてのマクロを作成しております。 上司は、軽いセクハラをして帰ってしまいましたが… 私は、終わらなければ帰ることができないようです。 もし、お時間のある方がいらっしゃいましたら、ご指導ください。 以上、よろしくお願いいたします。

この投稿のマルチメディアは削除されているためご覧いただけません。

みんなの回答

  • yucco_chan
  • ベストアンサー率48% (828/1705)
回答No.3

汚い且つ突っ込みどころ満載ですが。。 制限:元データは、Sheet1にあり、A2からデータがある。 バグ:最大値が複数の日にある場合でも、若い日付しか表示されない。 Sub Sample1() Dim MaxRow As Integer Dim 商品数 As String Dim i As Integer Dim j As Integer Dim 商品名 As String Dim 年(10) As String Dim dat, nowrow As Long, buf As String Dim tp(31) As Integer Dim con As Integer Dim dmax As Integer Dim drow As Integer Dim dcol As Integer Dim aaa As Integer Dim Dend As Integer Dim bbb As Integer Dim zz As Integer MaxRow = Range("C1").End(xlDown).Row 商品数 = 3 '商品のA,B,Cの種類数 nowrow = 2 '商品名などのデータは、2行目から始まる dcol = 3 ' aaa = dcol con = nowrow dmax = 0 drow = 3 j = 1 Set dat = CreateObject("Scripting.Dictionary") Do 年(j) = Year(Cells(nowrow, 2)) Sheets.Add ActiveSheet.Name = 年(j) Columns("B:B").Select Selection.NumberFormatLocal = "yyyy/m/d;@" Range("A1").Select Sheets("Sheet1").Select Sheets(年(j)).Cells(1, 1) = Cells(1, 1) Sheets(年(j)).Cells(1, 2) = Cells(1, 2) Sheets(年(j)).Cells(1, 3) = Cells(1, 3) Do While 年(j) = Year(Cells(nowrow, 2)) If Cells(nowrow, 1) <> "" Then 商品名 = Cells(nowrow, 1) End If Sheets(年(j)).Cells(nowrow, 1) = 商品名 Sheets(年(j)).Cells(nowrow, 2) = Cells(nowrow, 2) Sheets(年(j)).Cells(nowrow, 3) = Cells(nowrow, 3) Sheets(年(j)).Cells(nowrow, 4) = Month(Cells(nowrow, 2)) buf = Sheets(年(j)).Cells(nowrow, 1).Value If Not dat.Exists(buf) Then dat.Add buf, buf If buf <> "" Then Sheets("Sheet2").Cells(2, dat.Count + dcol - 1) = buf Sheets("Sheet2").Cells(1, dat.Count + dcol - 1) = Cells(1, 1) ActiveWorkbook.Names.Add Name:=buf, RefersToR1C1:= _ "='Sheet2'!R1C" & dat.Count + dcol - 1 & ":R2C" & dat.Count + dcol - 1 End If End If Sheets("Sheet2").Cells(drow, dcol - 2) = 年(j) & "/" & Month(Cells(nowrow, 2)) Sheets("Sheet2").Cells(drow, dcol - 1) = "で最大売上げ日" If Month(Cells(nowrow + 1, 2)) > Month(Cells(nowrow, 2)) Or _ Year(Cells(nowrow + 1, 2)) > Year(Cells(nowrow, 2)) Then drow = drow + 1 ActiveWorkbook.Names.Add Name:="月" & Year(Cells(nowrow, 2)) & Month(Cells(nowrow, 2)), RefersToR1C1:= _ "=" & Year(Cells(nowrow, 2)) & "!R" & con & "C1:R" & nowrow & "C3" Dend = Sheets("Sheet2").Cells(drow - 2, Columns.Count).End(xlToLeft).Column For aaa = dcol To Dend Sheets("Sheet2").Cells(drow - 1, aaa + 1) = "=DMAX('" & 年(j) & "'!$A$1:$C$1:" & "月" & Year(Cells(nowrow, 2)) & Month(Cells(nowrow, 2)) _ & ",'" & 年(j) & "'!$C$1," & Sheets("Sheet2").Cells(2, aaa) & ")" For bbb = con To nowrow If Sheets(年(j)).Cells(bbb, 3) = Sheets("Sheet2").Cells(drow - 1, aaa + 1) And _ Sheets(年(j)).Cells(bbb, 1) = Sheets("Sheet2").Cells(2, aaa) Then Sheets("Sheet2").Cells(drow - 1, aaa) = Sheets(年(j)).Cells(bbb, 2) End If Next bbb Sheets("Sheet2").Cells(drow - 1, aaa + 1) = "" Next aaa con = nowrow + 1 End If If nowrow >= MaxRow Then Exit Do nowrow = nowrow + 1 Loop If j > 1 Then Sheets(年(j)).Select Rows("2:" & Range("B2").End(xlDown).Row - 1).Delete Shift:=xlUp Sheets("Sheet1").Select End If If nowrow >= MaxRow Then Exit Do j = j + 1 Loop Application.DisplayAlerts = False For i = j To 1 Step -1 Sheets(年(i)).Select ActiveWindow.SelectedSheets.Delete Next i ActiveWindow.SelectedSheets.Delete Application.DisplayAlerts = True Sheets("Sheet2").Select Cells.Select Selection.NumberFormatLocal = "yyyy/m/d" Range("A1").Select End Sub

piiko777
質問者

お礼

ありがとうございます! とても長いプログラムですね。全て理解するには結構時間がかかりそうです。 私の作ったものと比較すると処理速度が2倍程度速いため、その原因を探るところから勉強していこうと考えています。 別の回答をして頂いた方も”Scripting.Dictionary”というオブジェクトを使われているようですが、マニュアルを見ても何のことやら??という思いです。自分にとってマクロはかなり難しいです・・ でも、マクロの便利さには感動しております。 今日は画像をペタペタ貼る作業で、サイズやトリミングなどをショートカットキー1つで揃えることができ、業務の効率化を図ることができました。 これから、少しずつでもマクロを勉強していこうと思いますので、 もし別の質問等をお見かけなった際には、またご指導ください。 以上、ありがとうございました。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

回答1のお礼に書かれている表をセルF2以下に A 2005/09 2005/9/4 B 2005/09 2005/9/8 C 2005/09 2005/9/7 と書き出すのなら、 Sub try()  Dim myDic As Object  Dim r As Range, s_name As String  Dim c As String  Dim myKey  Set myDic = CreateObject("Scripting.Dictionary")  For Each r In Range("B2", Cells(Rows.Count, 2).End(xlUp))      s_name = IIf(LenB(r.Offset(, -1).Value) <> 0, r.Offset(, -1).Value, s_name)      c = s_name & "_" & Format(r.Value, "yyyy/mm")      If Not myDic.Exists(c) Then         myDic(c) = Array(r.Value, r.Offset(, 1).Value)      ElseIf r.Offset(, 1).Value > Val(myDic(c)(1)) Then         myDic(c) = Array(r.Value, r.Offset(, 1).Value)      End If  Next  Set r = Range("F2")  For Each myKey In myDic.keys      r.Resize(, 2).Value = Split(myKey, "_")      r.Offset(, 2).Value = myDic(myKey)(0)      Set r = r.Offset(1)  Next  Set myDic = Nothing  Set r = Nothing End Sub でも出来ますが、5万行越えでどうなのかは自信ないです。

piiko777
質問者

お礼

ありがとうございます!! 昨日は集中力を高めるために、深夜からファミレスでやっていたので、返信が遅れました。すみません。 結局、今日の朝までには間に合わず、同僚の協力の下、昼過ぎくらいに完成させることができました。 ただし、n-junさんの10倍以上の行数になってしまいました・・・ ネットで色々なサンプルプログラムを見て思ったのですが、 プログラムをスマートに書くためには、オブジェクトという概念を勉強する必要があるようですね。 n-junさんのプログラムを見て勉強したいと思います。 以上、ありがとうございました!

  • yucco_chan
  • ベストアンサー率48% (828/1705)
回答No.1

添付データーが見えません。 何が、どうぐちゃぐちゃなのか分からないので、何のアドバイスも出来ません

piiko777
質問者

お礼

すみません。添付データを付けていたのですが、解像度が低く見れるものではなかったので消してしまいました。 データを下記に示します。 ※実際のデータは、過去20年間分×仕向けでデータは50,000行を超えています・・・ ※各月における日付の個数はバラバラです・・・ -------------------------- 商品名  日付  売上げ数 A    2005/9/1 10      2005/9/2 11      2005/9/3 20      2005/9/4 41      2005/9/5 10      2005/9/6 5      2005/9/7 10 B    2005/9/1 10      2005/9/2 11      2005/9/3 20      2005/9/4 41      2005/9/5 10      2005/9/6 5      2005/9/7 10      2005/9/8 58      2005/9/9 13 C    2005/9/1 10      2005/9/2 11      2005/9/3 20      2005/9/4 20      2005/9/5 10      2005/9/6 5      2005/9/7 52      2005/9/8 20 -------------------------- 上記データから、↓の形で最大売上げ日を抽出しようとしています。                   A        B        C 2005/9で最大売上げ日  2005/9/4   2005/9/8   2005/9/7 2005/10で最大売上げ日

piiko777
質問者

補足

強制退社の時間になりましたので、自宅への持ち帰り仕事となりました。 徹夜になってでも完成させる所存ですので、よろしくお願いします。 現在、”do until~”と”For~”を使って処理しようと考えています。 1列目に対して”do until”で最大値を検索する行の範囲を求めて、 ”For~”で上記範囲内の最大値を探すというやり方です。 ですが、どちらも先ほど理解したばかりですので、使い方がイマイチわかっていません。というより、マクロの記述に関する約束事を把握した程度ですので、先は長そうです…

関連するQ&A

  • エクセルのマクロについて。

    皆様、こんにちは。 以下のマクロを組みたいと考えておりますが、 浅学なこともありどのように組めばよいかわかりません。 皆様のお力をお借りしたくご教示いただけないでしょうか。 ■組みたいマクロ 【前提】 ・刻刻と変化するとある膨大なデータ(以下、元データ(1)とする)のなかから、10月1日時点について設定した条件に適合したものを抽出し、αシート(表の構成はA~C、1~10を使用、Aの欄には抽出された元データのデータ番号が入力されている)にまとめた。 ・その上で、全く別のデータ(以下、元データ(2)とする)から、元データのデータ番号に適合するそれぞれの数値をD~Eの欄に入力した。 ・後日、元データの中から、先ほどと同様の条件で抽出したところ、抽出されたデータの数(量)と数値に変更があった(そのため、抽出されたデータ番号の中には、αシートに含まれているもの、いないものが混在している。)これをαと同様にまとめたものをα’シートとする。 【組みたいマクロ】 ・αとα’シートを比較し、元データのデータ番号が一緒の列の、D~Eの欄についてはαシートの数値をα’シートに自動で転記されるようにマクロを組みたい。 ■まとめ このようなマクロの原型を教えていただけますと幸甚です。 また、今後、皆様のお手を煩わせないようエクセルにつき、深く勉強したいと考えておりますので、このようなマクロを組むために必要な本、おすすめな本も教えていただけないでしょうか。 おおざっぱな質問でわかりにくいかと存じます。 条件がもっと詳細に確定しないとマクロが作れないということがありましたら、その旨質問いただけますようお願い申し上げます。 何卒よろしくお願い致します。

  • EXCELの関数で複数条件の抽出方法

    エクセルの関数について教えてください。 VLOOKUPで複数条件を抽出したい。 以下の様に出来ればと思いますが、数式が分かりません。 売上データーの中から複数の条件に一致したものだけを抽出したい。 例) 商品が1,2,3,4,5,6,7,8,9,10と種類が100あるとします。 売上先A,B,C,D,E,F,G,と100の客先があるとします。 その中から、商品1と売上先Aの場合はA-1と売上金額のデーターを抽出させて、商品1と売上先がDの場合はD-1と売上金額を抽出させたい。但し、商品1と売上先Bの場合は売上金額を抽出させたくない。 このような場合の関数での数式を教えて欲しい。 お分かりの方があればお教え願います

  • Excelマクロ

    Excel2000でBook<A>のSheet<B>のデータを一定の条件でBook<C>の各Sheetにそれぞれ条件ごとに抽出したいと思います。どのようにマクロを記入したら良いでしょうか?すみません。初心者なのでよろしくお願いします。

  • 計算するExcelマクロを作りたいです(2)

    商品ごとに年度の売り上げを毎月計算するマクロを作りたいです。 Excelシートのキャプチャを加えたので、少しわかりやすくなって いるでしょうか? 「データ」シートでは、列は左から商品単価、通貨、商品ごとの 月別売り上げ個数、(商品別)年度売り上げ合計の順番で並んで います。各行には各商品ごとの数値が入力されています。 別にもう一つ「通貨」シート(画像右下)があり、「データ」 シートの通貨で検索してその右隣の数値を商品単価に掛け算します。 さらに、商品別売り上げ金額の年度合計を毎月計算して、最終的に 「データ」シートに出力するようにしたいです。 「データ」シートは毎月更新されるので、マクロ専用のブックを もう一つ作る予定でいますが、可能な内容でしょうか? マクロ自体は、会社の友人が多忙で困っているので、上司との会話 の間にあまり良く考えずに引き受けてしまった話です・・・ 通貨のレートを別のシートから持ってきて計算する辺りが特にわか らず困っています。 どなたかご教授お願いいたします。

  • マクロでのデータ抽出

    毎月の売上データの一覧から必要なデータのみ抽出して、伝票を作成します。 伝票は明細単位で抽出します。 マクロを組もうとしているのですが、1、2行目のように1案件につき明細が2つある場合があるので、どのようなコードになるのかがわかりません。 コードの中で明細をカウントして、その分だけコピーするような手順になるのでしょうか? また伝票は「分類」ごとに作成します。 こちらは分類ごとにシートを作成し、フィルタにかけたデータをコピーしようと思っています。 マクロは初心者で説明不足な部分がありましたら申し訳ありません。 よろしくお願い致します。

  • エクセルにてこのような抽出はできますか?

    エクセルにてこのような条件抽出(?)はできますでしょうか? 例えば下記のような売上データーがあります。 A列 売上月(4月~3月) B列 顧客名 C列 商品名 月別の売り上げデーターが毎日記入されます(1年間)。 1万行以下には全顧客名のリストが記入されています(例えば500社)。 この全顧客500社の内、売上の上がっていない顧客はどこなのかを抽出することはできますでしょうか? 売上データーを毎日記入することで、売上げのある顧客は分かりますが、売上げの上がっていない顧客はどこなのかを調べたいのです。 全顧客500社-4月売上顧客=4月売上げの上がっていない顧客一覧 こんなイメージです。 月単位で未売上の顧客を調べたいのです このようなことは可能でしょうか? どなたかご知恵を拝借できましたら幸いです。 ※1年を通して月別の売上げを記入します。   A     B    C 1   月  顧客名  商品名   2  4月  顧客A  商品A 3  4月  顧客B  商品B 4  4月  顧客C  商品C 5  4月  顧客D  商品D   ・    ・    ・   ・    ・    ・   ・    ・    ・   ・    ・    ・ ------------------------- ※1万行以下に全顧客データーを記入します(必ずしもここでなくても別シートでも問題ありません) 10000 顧客A 10001 顧客B 10002 顧客C 10003 顧客D 10004  ・ 10005  ・ 10006  ・ 10007  ・ 10008   よろしくお願い致します。

  • エクセルデータ抽出

    はじめまして、エクセルの関数とか殆ど分かりません。 そこで、以下内容の事をしたいのですが、どうすれば良いでしょうか? 何度もすみません。 前提 先程の質問内容とは異なるのですが、実際のデータに沿った形で質問させて下さい。 データ量が膨大で、実際のセルが多数御座います。 内容をしっかり理解できていない為、実データ通りの計算式を教えて下さい。 (1)今日より3ヶ月以内(月末〆)のデータのみ抽出する。 (2)抽出データを別のシートに作成する。 (1)~(2)を実行する方法を教えて下さい。 次に『抽出データ』の金額を計算する。 出来ればマクロを組んで、ボタンをクリックして対応したいと思っております。

  • 計算するExcelマクロを作りたいです

    商品ごとに年度の売り上げを毎月計算するマクロを作りたいです。 Excelブックが添付できないので、文章のみで書きますがご了承 ください。 「データ」ブックでは、列は左から商品単価、通貨、商品ごとの 月別売り上げ個数、(商品別)年度売り上げ合計の順番で並んで います。行は商品の名前です。 別にもう一つ「通貨」ブックがあり、「データ」ブックの通貨で 検索してその右隣の数値を商品単価に掛け算します。さらに、 商品別売り上げ金額の年度合計を毎月計算して、「データ」ブックに 出力するようにしたいです。 どなたかご協力お願いいたします。

  • データの抽出方法

    エクセルでデータの抽出を行いたいです。 シートが、「9月売上商品個数」(シート1)、「10月売上商品個数」(シート2)、「商品データベース ※20品目のみ ※JAN入力済」(シート3)の3枚あります。シート1と2の中から、シート3に入力されている20品目だけの商品をJAN(これは必ずJANとさせてください)で抽出し、シート3内の商品のみが9月と10月でどれほど売れたかのデータを作りたいです。 欲を言うと、シート3の商品の並び順と、シート1と2の商品の並び順は異なります。シート3のJANの横に「9月」と「10月」の列を作るので、そこに一括で個数が入るととても便利なのですが.... わかりづらく申し訳ありません。アドバイスいただければ幸いです。

  • マクロで関数を使う方法

    マクロ初心者です。 下記処理をスムーズに行う場合どのようにすればよいか 悩んでおります。的外れなことを質問しているかもしれませんが わかる方がいましたら、教えてくださいお願いいたします。 工場のパーツの出荷に関してファイルを毎月まとめております。 毎月最新データーが他部署より送られてきて そのファイルを私が、過去のファイルから一部データーを持ってきたりしております。 今回、下記の処理を簡単にさせたいのですが、マクロで出来る方法があれば教えてください。 下記2つのファイルのフォーマットは基本同じです。 装置番号の並びはその月その月で並びが違います。 【0904.xlsのファイル】 A      B     C     D    E 装置番号  商品 売上合計 コメント 担当  a1    P8  13,523   ***   ●   B1    P8  38,523   +++   ■  a2   P10 23,523   Ccc   △ 他部署より送付された今月売上分(0905.xls)の 装置情報を0904ファイルを元にD・E項目をVLOOKで入力しています。 【0905.xlsのファイル】 A      B     C     D    E 装置番号  商品 売上合計 コメント 担当  B1    P8  78,523   a1    P8  63,523       a2   P10 53,523  ここでは3行しかありませんが実際は2000行位あります。 また、VLOOKする項目も実際は10箇所ほどあります。 毎回前月のファイルを元にひとつひとつ関数でデーターを入力しております。 簡単に表示する方法がありましたらマクロでなくても教えてください。 お願いいたします。