マクロを使って顧客別の販売金額を並び替える方法

このQ&Aのポイント
  • Excelのマクロを使用して、顧客別の販売金額を並び替える方法についてご教示いたします。
  • 指定された表を顧客別・金額順に並べ替えるために、マクロを作成します。
  • マクロを実行することで、顧客番号を昇順に表示し、販売金額を高額順に表示することができます。
回答を見る
  • ベストアンサー

マクロをご教示ください。

(1) C列に顧客番号を表示しその時の販売金額をH列に表示しております。     顧客番号はC6からC1000に発生順に表示しているため顧客番号は順不同です。     販売金額はH6からH1000に発生順に表示していますす。         列番号 C    列番号 H 行番号    顧客番号      金額   6        100        2000   7         30        3000  ~         500         10  100        30        20000  ~         100       25000  700        30        5000  ~         200        500 1000        100       10000 (2) 上記(1)の表を顧客別・金額順に並べ替えた表を作成したい。 顧客番号はP6からP1000に昇順に表示したい。 販売金額はQ6からZ6に高額順に表示したい。       列番号P   列番号Q   列番号R   列番号S   ~ 列番号Z 行番号  顧客番号   金額1   金額2   金額3   金額10   6      30   20000 5000 3000 7 100 25000 10000 2000 8 200 500 9 500 10 ~1000 ● ご教示のほど宜しくお願い致します。

  • oguno
  • お礼率61% (179/289)

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

一個一個マクロでデータを拾っていっても構いませんが,まぁ折角ですからエクセルにやらせてみましょう。 Sub macro1()  Dim r As Long, h As Long, p As Long ’準備  Range("P6:Z65536").ClearContents  Range("C:C").Copy  Range("P:P").Insert shift:=xlShiftToRight  Range("H:H").Copy  Range("Q:Q").Insert shift:=xlShiftToRight ’並べ替え  Range("P6:Q" & Range("Q65536").End(xlUp).Row).Sort _   key1:=Range("P6"), order1:=xlAscending, _   key2:=Range("Q6"), order2:=xlDescending, _   header:=xlNo ’転記  r = 6  p = 6  Do Until Cells(r, "P") = ""   h = Application.CountIf(Range("P:P"), Cells(r, "P"))   Cells(p, "R") = Cells(r, "P")   Cells(p, "S").Resize(1, h).Value = Application.Transpose(Cells(r, "Q").Resize(h, 1).Value)   r = r + h   p = p + 1  Loop ’片付け  Range("P:Q").Delete shift:=xlShiftToLeft  Cells.EntireColumn.AutoFit End Sub

oguno
質問者

お礼

keithin様 ご教示ありがとうございました。 ご教示により思い通りの処理が出来ました。 御礼が遅れました事お詫びいたします。 今後とも宜しくお願い致します。 oguno

その他の回答 (1)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! 一例です。 必ず1000行目までデータがあるとしてのコードです。 画面左下にある操作したいSheet見出し上で右クリック → コードの表示 → VBE画面が出ますので ↓のコードをコピー&ペーストしてマクロを実行してみてください。 Sub test() Dim i, j As Long Cells(5, 16) = "顧客番号" Application.ScreenUpdating = False For i = 6 To 1000 If WorksheetFunction.CountIf(Columns(16), Cells(i, 3)) = 0 Then Cells(Rows.Count, 16).End(xlUp).Offset(1) = Cells(i, 3) End If Next i j = Cells(Rows.Count, 16).End(xlUp).Row Range(Cells(6, 16), Cells(j, 16)).Sort key1:=Cells(5, 16), order1:=xlAscending For j = 6 To Cells(Rows.Count, 16).End(xlUp).Row For i = 6 To 1000 If Cells(i, 3) = Cells(j, 16) Then Cells(j, Columns.Count).End(xlToLeft).Offset(, 1) = Cells(i, 8) End If Next i Next j For j = 17 To ActiveSheet.UsedRange.Columns.Count If WorksheetFunction.Count(Columns(j)) Then Cells(5, Columns.Count).End(xlToLeft).Offset(, 1) = "金額" & j - 16 End If Next j Application.ScreenUpdating = True End Sub こんな感じではどうでしょうか?m(_ _)m

oguno
質問者

お礼

tom04様 ご教示ありがとうございました。 今後とも宜しくお願い致します。

関連するQ&A

  • マクロや関数で来店管理表を作成したい。

    最終来店日別・顧客番号順の管理表を作成したいと考えております。   表1・初日データ 行番号         列番号 G       列番号 H              顧客番号       最終来店日   6          100           2011-11-09   7           30           2011-11-09   8           500           2011-11-09   9           200           2011-11-09 10 ~   1000                                            表2・2日目データ 行番号         列番号 G       列番号 H              顧客番号       最終来店日   6          150            2011-11-10   7           500           2011-11-10   8           10            2011-11-10   9                  ~  1000                                            表3・来店日管理表 行番号 列番号 B  列番号 E     列番号 F        顧客番号  最終来店日    来店回数   6    10      2011-11-10    1   7    150          2011-11-10   1   8     500          2011-11-10   2   9     30    2011-11-09   1   10   100      2011-11-09      1   11    200     2011-11-09      1   12      ~  1000 ●〔表1〕・〔表2〕のデータから、〔表3〕のような〔来店日管理表〕の作成方法を教えてください。  1・初日 1・初日に〔表1〕のデータを〔表3〕に表示し、〔列番号 F〕に来店回数を〔1〕と表示する 2・〔最終来店日〕別・〔顧客番号順〕に表示する 3・〔表1〕のデータを消去する  2・2日目 1・〔表3〕のデータと〔表2〕のデータを統合して、初来店者は〔列番号 F〕に来店回数を           〔1〕と表示する          複数回来店者は、〔列番号 F〕に来店回数を〔前回回数+1〕して表示する 2・〔最終来店日〕別・〔顧客番号順〕に表示する 3・〔表1〕のデータを消去する 宜しくお願い致します。

  • 重複入力の回避のVBAをご教示ください

    6行目のセル(6行、C列)に顧客番号を入力し、F列以降に、セル(6行、C列)の顧客番号の内容を入力しています。   その入力時に、顧客番号の重複入力を避けるためのチェック及び対処処理をご教示お願い致します。     (1)・セル(6行、C列)に顧客番号を入力し、F列からH列に、セル(6行、C列)の顧客番号の内容を入力する。     (2)・セル(7行、C列)に顧客番号を入力し、F列からH列に、セル(7行、C列)の顧客番号の内容を入力する。       (イ)・セル(7行、C列)に顧客番号を入力し、エンターキーを押した時点でセル(6行、C列)の顧客番号と重複していなかチェックする           ●重複していない場合は、カーソルをセル(7行、F列)へ移動させる           ●重複している場合は、「同じ番号があります」とメッセージボックスを表示する。               メッセージボックスのキャンセルボタンをクリックするとセル(7行、C列)の重複番号が削除されカーソルはセル(7行、C列)へ     (3)・セル(8行、C列)に顧客番号を入力し、F列からH列に、セル(8行、C列)の顧客番号の内容を入力する。        (イ)・セル(8行、C列)に顧客番号を入力し、エンターキーを押した時点でセル(6行、C列)とセル(7行、C列)の顧客番号と重複していなかチェックする           ●重複していない場合は、カーソルをセル(8行、F列)へ移動させる           ●重複している場合は、「同じ番号があります」とメッセージボックスを表示する。               メッセージボックスのキャンセルボタンをクリックするとセル(8行、C列)の重複番号が削除されカーソルはセル(8行、C列)へ     (4)・セル(9行、C列)に顧客番号を入力し、F列からH列に、セル(9行、C列)の顧客番号の内容を入力する。        (イ)・セル(9行、C列)に顧客番号を入力し、エンターキーを押した時点で、セル(6行、C列)とセル(7行、C列)とセル(8行、C列)の顧客番号と重複していなかチェックする           ●重複していない場合は、カーソルをセル(9行、F列)へ移動させる           ●重複している場合は、「同じ番号があります」とメッセージボックスを表示する。               メッセージボックスのキャンセルボタンをクリックするとセル(9行、C列)の重複番号が削除されカーソルはセル(9行、C列)へ     (5)・(1)~(4)を1セットとお考え下さい           ●10行から13行の4行を1セットとして、セル位置は変わりますが、(1)~(4)の処理をしたい。           ●最終  702行から705行まで、(1)~(4)の処理をしたい。 宜しくお願い致します。

  • エクセル 関数?マクロ?をご教示下さい。

    御指導宜しく御願いいたします。 ★現状下記のように処理しています。 ●入力状況 Q6:Q125に会員番号 S6:S125に氏名 T6:P125に1回戦の得点 V6:V125に2回戦の得点 Y6:Y125に3回戦の得点 AB6:AB125に4回戦の得点 AE6:AE125に5回戦の得点 AH6:AH125に6回戦の得点 AI6:AI125に1回戦から6回戦の合計得点数 P6:P125にAI列の合計得点を基にRANK関数で順位を表示させています 「=IF(AI6="","",RANK(AI6,$AI$6:$AI$125))」 ●更新マクロで1位から125位まで並べ替えています 同点の場合、現在は会員番号順(昇順)に並べています ★御指導いただき事 合計得点が同点の場合の処理方法 1・Q6の人(会員番号10のA氏)とQ7の人(会員番号20のK氏)が同点の場合  現在は、A氏・K氏と並びP6とP7にはいずれも 1(位)と表示されていますが これを各人の1回戦から6回戦の最高得点を比較し高得点の人を上位としたい。 例 A氏の最高得点 → 3回戦の30000点  K氏の最高得点 → 5回戦の31000点       P列  Q列   S列        1   20    K        2   10     A 2・途中、6行から125行まで同点があれば、同様処理をしたい 3.尚、このワークシートは初期化し次回も使用したい。

  • エクセルマクロで出来るでしょうか。

    マウスでクリックしたセル位置の入力内容を、別のセル位置に表示するようなマクロは出来るでしょうか?。 考えているのは、弁当注文の集計表の作成です。 A列に氏名、B列に店名、C列に品名、D列に金額と、予め入力してある表で、 当日注文する分を、個人毎に、氏名・店名・品名・金額・とクリックすれば、 同じシート内に作成した集計表に、クリックした順番に表示していくというようなものです。 予めの入力は、各列5行目から行っています。 また集計表は、F列、G列、H列、I列の5行目から下に、クリックした順番に表示できればと思っています。

  • 該当のセルの他の項目を取り出すマクロ

    いつもお世話になっております。 初心者なのですが、、、マクロについて教えていただけますでしょうか? エクセルファイルで9000行×NN行の表があります。(列は増えませんが、行は増えます。) -------------------------------------------------------------------------------------------------------------------- A列    B列    C列      D列      E列      F列 -------------------------------------------------------------------------------------------------------------------- 名前  企画番号  2015/12/1   2015/12/2   2015/12/3   2015/12/4 Aさん  P410      7       0      0      6 Bさん  P500      0       9      5      3 Cさん  P043      0       0      0      0 Aさん  P403      4       0      0      0 Cさん  P789      0       0      0      0 -------------------------------------------------------------------------------------------------------------------- 条件書式で、 =SUMIF($A:$A,$A2,C:C)>10 「同じ人が同じ日付で10以上になったら」赤く塗りつぶすようにしています。 (上の表の場合は、Aさんの2015/12/1の「7」と「4」に赤い塗りつぶし。) ここから、以下のマクロを追加したいと思っています。 赤く塗りつぶしたセルの「名前」「日付」「企画番号」を新しいエクセルブックに取り出したい。 (上の表の場合は、「Aさん」「2015/12/1」「P410」「P403」の4セルを取り出したいです。) 取り出す企画番号が2つの場合もあれば、最大6つくらいまでなりそうです。 どうかよろしくお願いいたします。

  • 該当セルの他の項目のセルを取り出すマクロ

    いつもお世話になっております。 初心者なのですが、、、マクロについて教えていただけますでしょうか? エクセルファイルで9000行×NN行の表があります。(列は増えませんが、行は増えます。) ----------------------------------------------------------------------------------------------------------- A列    B列    C列      D列      E列      F列 ----------------------------------------------------------------------------------------------------------- 名前  企画番号  2015/12/1   2015/12/2   2015/12/3   2015/12/4 Aさん  P410      7       0      0      6 Bさん  P500      0       9      5      3 Cさん  P043      0       0      0      0 Aさん  P403      4       0      0      0 Cさん  P789      0       0      0      0 ----------------------------------------------------------------------------------------------------------- 条件書式で、 =SUMIF($A:$A,$A2,C:C)>10 「同じ人が同じ日付で10以上になったら」赤く塗りつぶすようにしています。 (上の表の場合は、Aさんの2015/12/1の「7」と「4」に赤い塗りつぶし。) ここから、以下のマクロを追加したいと思っています。 赤く塗りつぶしたセルの「名前」「日付」「企画番号」。 (上の表の場合は、「Aさん」「2015/12/1」「P410」「P403」の4セルを取り出したいです。) 取り出す企画番号が2つの場合もあれば、最大6つくらいまでなりそうです。 どうかよろしくお願いいたします。

  • エクセルのマクロで重複データの削除

    横17列、縦、約1000行の表があります。 4行目が項目で、5行目以降は次のように並んでいます。 A列(日付)、B列~H列(各データ) I列(契約番号)J列~Q列(各データ) 縦の並び順は、ばらばらで、日付順ではありません。しかも結構重複があります。 そこで、I列の商品番号をキーにして、重複をチェックし、重複しているものは、日付が新しいものを生かし、古い方は削除しようと思います。 しかし、手作業でやるにはあまりに多すぎるため、出来ればマクロでやりたいのですが、このように高度なものは、わたしが出来るマクロの記録程度では手におえそうもありません。 どのようにやったらよいのかどなたかお教え願えませんでしょうか?

  • 【再】エクセル2013 マクロをご教示ください

    Sheet1で選択しているセルの行をSheet2に転写したいです。 Sheet1とSheet2の4行目に見出し。 Shet1にはA~U列までデータがあります。(途中空白セルの場合もあり) Sheet1の5行目以降の、あるセルを選択してマクロを実行すると Sheet1のC~S列までをSheet2のA~Q列へコピペしたいです。 Sheet1は H列に必ずデータがあるので それらを最終行の判断基準とします。 Sheet1での選択セルは複数の場合もあります。 ただし、同じ行のセルを複数選択しても Sheet2への貼り付けは1行とします。 マクロを実行する度に、Sheet1での選択セルの該当行が Sheet2へ追加されるようにしたいです。 (Sheet2へコピペされたデータは残します) また、Sheet2への貼り付け内容が同じだった場合は 注意喚起のため メッセージで 「重複データが存在します」を表示したいです。 重複の判断基準はSheet2の B、D、F列とします。 宜しくお願い致します。

  • エクセルマクロの作り方(初歩)で教えてください。

    エクセルマクロについての初心者です。小学校で使うテスト結果の分析表(○、×の一覧表)作成の支援ソフトを作ろうとしていますが途中でわからなくなったので教えてください。 マクロにについては、配列変数、For Next,Do Loopのことが少し理解できる程度で、それらを組み合わせて作ろうとしましたが、使い方がよく分かりません。説明を簡単にするため、次の例で教えてください。児童数は40で、2行目から41行目までに児童の名前やデータが入ります。A列は出席番号、B列は名前、CからG列は正解した番号を記入するセル(問題は5問)、HからL列は問題1~5の○×を1と0で表示させます。そして出席番号1番の児童が3番と5番だけ正解なら、C2に3、D2に5を入れるだけで、H2~L2に0,0,1,0,1と自動的に表示されるようにしたいのです。実際には、児童数は200、問題数を50ぐらい考えています。C2~G2までのデータを配列変数に入れて、H2のセルにはIF文を組みわせて0か1を表示させて、それをL2まで繰り返し、それ全体を41行目まで繰り返して…とやろうとしたのですが、繰り返し方でうまくいきません。このような方法でなくてもかまいません。もっと簡単な方法があればそれも教えてください。よろしくお願いします。

  • (マクロ)カット&ペーストを列毎に繰り返したい

    下のように、A列から50列目までデータが入力されています。 各列、データは上から順に詰まっている状態です。 C列のように1つもデータが入力されていない列もあります。 ------------------------------------------ A列 B列 C列 D列 ・・・ Z001 Z003 Z004 Z002 Z005 ------------------------------------------ これを、「B列から順にデータをカットして、A列最終行の下にペーストする」という作業を、各列毎に50列目まで繰り返したいと思っています。 完成イメージは下記のようになります。 ------------------------------------------ A列 B列 C列 D列 ・・・ Z001 Z002 Z003 Z004 Z005 ------------------------------------------ 下記のようにマクロを組みましたが、無限ループになっているのか、強制終了となってしまいます。 どういうふうにマクロを組めばいいのでしょうか? 宜しくご教授お願いいたします。 Sub ADD() Dim i, j As Long For j = 2 To 50 '列番号指定 'B列1行目から順にセルが空白でなければカットする。 i = 1 Do While Cells(i, j).Value <> Empty Cells(i, j).Select Selection.Cut 'A列の最終行の1つ下の行に貼り付ける。。 Range("A1").Select Range(Selection, Selection.End(xlDown).Offset(1, 0)).Select ActiveSheet.Paste i = i + 1 Loop Next End Sub

専門家に質問してみよう