Excelデータの仕分け方法 | 商品データの整理方法を教えてください

このQ&Aのポイント
  • Excelで商品データをメーカー毎に整理する方法について教えてください。IFとCOUNTIFを使って試みましたがうまくいきませんでした。
  • データの種類ごとにメーカーを絞り、商品名を一覧する方法が知りたいです。商品データは数千個以上あるため、関数で処理したいです。
  • 商品データをアウターやインターなどの種類ごとに整理し、メーカーと商品名を一覧したいです。どのような関数を使用すれば良いでしょうか?
回答を見る
  • ベストアンサー

条件によるデータの仕分け<Excel>

はじめまして、 今回はお世話になります。 Excel(2007/2010)関数についての質問となります。 商品データをメーカー毎に整理しようと IFとCOUNTIFを組合せてみましたが、勉強不足でうまくできませんでした。 行/列→ ↓ 《種類》  《メーカー》  《商品名》 アウター  メーカーname1  商品名A アウター  メーカーname1  商品名B アウター  メーカーname2  商品名C アウター  メーカーname1  商品名D アウター  メーカーname2  商品名E アウター  メーカーname1  商品名F アウター  メーカーname3  商品名G アウター  メーカーname3  商品名H アウター  メーカーname3  商品名I ・ ・ ・ インター  メーカーname1  商品名J インター  メーカーname1  商品名K インター  メーカーname2  商品名L ・ ・ 上記のデータから以下の結果を求めたいのですが、 良い方法がありましたらご教授ください。 アウター  メーカーname1  商品名A,商品名B,商品名D,商品名F アウター  メーカーname2  商品名C,商品名E アウター  メーカーname3  商品名G,商品名H,商品名I インター  メーカーname1  商品名J,商品名K インター  メーカーname2  商品名L ・ ・ ・ 商品の種類(例:アウター)をメーカー毎にひとまとめにしたいのです。 補足といたしまして、 商品の種類は数十種類、メーカーは100程度あります。 また、異なる商品種類の中に、同一のメーカーもあります。 例:アウター(メーカーname1)、インナー(メーカーname1) 商品データは数千個以上あります。 可能なら、データと結果は別のSheetにしたいです。 データ量が多いので、マクロではなく関数で処理した方が良いと思うのですが? お分かりの方がいらっしゃいましたら助けてください。 宜しくお願いいたします。

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

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

>Cのセル内に商品名を表示したいです。 どうしてもそうしたいなら、まぁマクロを使った方が手早いは手早いです。 それでも数式を併用したほうが、遥かに簡単ですが。 状況: シート1のABC列からシート2のABC列に抽出する 1行目はタイトル行 2行目から実データ。 手順: ALT+F11を押す 現れた画面で挿入メニューから標準モジュールを挿入する 現れたシートに下記をコピー貼り付ける sub macro1()  dim LastRow as long  dim ResRow as long  worksheets("Sheet1").select  worksheets("Sheet2").cells.clearcontents  application.screenupdating = false ’抽出と調査  range("A:B").advancedfilter _   action:=xlfiltercopy, _   copytorange:=worksheets("Sheet2").range("A1"), _   unique:=true  lastrow = range("B65536").end(xlup).row  resrow = worksheets("Sheet2").range("B65536").end(xlup).row ’数式の投入  worksheets("Sheet2").range("C2:C" & resrow).formula = "=ROW(C1)"  range("D2:D" & lastrow).formula = "=SUMIFS(Sheet2!C:C,Sheet2!A:A,A2,Sheet2!B:B,B2)"  range("E2:E" & lastrow).formula = "="",""&C2&IFERROR(VLOOKUP(D2,D3:E$" & (lastrow+1) & ",2,FALSE),"""")"  with worksheets("Sheet2").range("D2:D" & resrow)   .formula = "=MID(VLOOKUP(C2,Sheet1!D:E,2,FALSE),2,99999)"   .value = .value  end with ’片づけ  range("D:E").delete shift:=xlshifttoleft  worksheets("Sheet2").range("C:C").delete shift:=xlshifttoleft  application.screenupdating = true end sub ファイルメニューから終了してエクセルに戻る ALT+F8でマクロを実行する。 #ループとか一つも回してないでも、十分作成できます。 #このマクロで記入させた数式を手で記入しても、もちろん出来ます。

mihotan117
質問者

お礼

100点満点のご回答をいただきありがとうございます。 今までの苦労が嘘の様に、あっと言う間に仕分け作業が完了しました。 先にご回答いただきましたtom04様のマクロでも 望む結果が得られましたが、処理的にはkeithin様のマクロ式の方が早かったです。 20000行を超えるデータが3分程で処理できました。 私のために何度もお手数おかけし、大切なお時間を費やしていただいたことに 大感謝と同時に申し訳なく思っています。 本当にありがとうございました。

その他の回答 (5)

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

No.3です。 >欲を言えば、 >Cのセル内に商品名を表示したいです。 とありますので・・・ 商品名はC列のみに表示したいというコトですね? 今一度コードを載せてみますので、前回同様の操作でマクロを実行してみてください。 Sub test2() 'この行から Dim i, k As Long Dim str As String Dim ws As Worksheet Set ws = Worksheets("Sheet2") Application.ScreenUpdating = False k = ws.Cells(Rows.Count, 1).End(xlUp).Row If k > 1 Then ws.Rows(2 & ":" & k).ClearContents End If Columns(1).Insert For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row Cells(i, 1) = Cells(i, 2) & Cells(i, 3) If WorksheetFunction.CountIf(Columns(1), Cells(i, 1)) = 1 Then With ws.Cells(Rows.Count, 1).End(xlUp).Offset(1) .Value = Cells(i, 2) .Offset(, 1) = Cells(i, 3) End With End If Next i For k = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 1) = ws.Cells(k, 1) & ws.Cells(k, 2) Then str = str & Cells(i, 4) & "," End If Next i ws.Cells(k, 3) = Left(str, Len(str) - 1) str = "" Next k ws.Columns.AutoFit Columns(1).Delete Application.ScreenUpdating = True End Sub 'この行まで こんな感じではどうでしょうか?m(_ _)m

mihotan117
質問者

お礼

素晴らしいマクロを作っていただきありがとうございます。 20000行を超えるデータを問題なく処理できました。 実に爽快でした^^ 素人の私でも、丁寧なご回答のお蔭で迷うことなく望む結果が得られました。 tom04様にご回答いただけ事は大変幸運だったと思います。 貴重な時間を割いてお付き合いいただきましたことに大変感謝しています。 ありがとうございました!! tom04様のご回答にもベストアンサーを付けたかったのですが、 2者をベストアンサーに選ぶ方法が分かりませんでした。 申し訳なく思います。

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

再掲: >シート2のC2に >=IFERROR(VLOOKUP($A2&"_"&$B2&"_"&COLUMN(A2),Sheet1!$A:$E,5,FALSE),"") >と記入し、右に下にコピー貼り付ける。 「右にコピー」し、「下にコピーする」と回答しています。 回答した通りに行ってください。 >C列関数式は以下のとおりです。 どうして2行目の数式の次が4行目、8行目になるのですか? 下にコピーすれば、2行目の1つ下には3行目の数式になるはずですが。 それとも。 再掲: >5.シート2のA:B列でデータタブの「重複の削除」を使い、一意のリストを作成する この手順をスルーして行っていないのですか。 なお。 念のため言わずもがなですが、「1つのC列のセルの中に」カンマでつないで商品A,B,Cが羅列されるみたいな計算の仕方は、無駄すぎるのでそういう事はしません。

mihotan117
質問者

お礼

大変失礼しました。 ちゃんとできました。 ご指摘どおり、右へ(列方向)のコピーをしていませんでした。 C列に結果が出ると考えていましたので。。。申し訳ありません。 >一意のリストを作成する 上記は、理解していたのですが、 行削除後でも数式の値が反映されていたので問題ないと判断しました。 実際、それでもできました。 本当にありがとうございます! 助かりました。 欲を言えば、 Cのセル内に商品名を表示したいです。 商品名が10点程なら、ご教授いただいた方法が見やすいのですが、 実際には、100点近いものもあります。 その際、右へスクロールして確認するより、 一つのセルをクリックして、数式バーを展開した方が見やすいと考えてのことです。 ですが、自身で結合式を入れれば良いだけのことですので こちらで十分活用できます。 ありがとうございました^^

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

こんにちは! VBAになってしまいますが・・・ 一例です。 Sheet1のデータをSheet2にまとめるようにしてみました。 Sheet2の1行目は項目行でA1に「種類」・B1に「メーカー」と入力済みだとします。 画面左下のSheet1のSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub test() 'この行から Dim i, k As Long Dim ws As Worksheet Set ws = Worksheets("Sheet2") Application.ScreenUpdating = False k = ws.Cells(Rows.Count, 1).End(xlUp).Row If k > 1 Then ws.Rows(2 & ":" & k).ClearContents End If Columns(1).Insert For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row Cells(i, 1) = Cells(i, 2) & Cells(i, 3) If WorksheetFunction.CountIf(Columns(1), Cells(i, 1)) = 1 Then With ws.Cells(Rows.Count, 1).End(xlUp).Offset(1) .Value = Cells(i, 2) .Offset(, 1) = Cells(i, 3) End With End If Next i For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row For k = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 2) = ws.Cells(k, 1) And Cells(i, 3) = ws.Cells(k, 2) Then ws.Cells(k, Columns.Count).End(xlToLeft).Offset(, 1) = Cells(i, 4) End If Next k Next i ws.Columns.AutoFit Columns(1).Delete Application.ScreenUpdating = True End Sub 'この行まで ※ 関数でないので、すぐにSheet2に反映されません。 Sheet1のデータ変更があるたびにマクロを実行する必要があります。 参考になりますかね?m(_ _)m

mihotan117
質問者

お礼

ありがとうございます。 見事にできました^^ まだ、実用のデータでは試したいませんが、 「凄く楽だなー」と感じました。 得られた結果は、 No.1回答者のkeithin様と同じものですので、 手間と処理時間から、どちらが実用的か比べてみたいと思います。 下記は、No.4のお礼書いたものと重複しますが、 欲を言えば、 Cのセル内に商品名を表示したいです。 商品名が10点程なら、ご教授いただいた方法が見やすいのですが、 実際には、100点近いものもあります。 その際、右へスクロールして確認するより、 一つのセルをクリックして、数式バーを展開した方が見やすいと考えてのことです。 もし、ご迷惑でなければ、この件に関してもご考慮いただけないでしょうか? ご無理なら結構です。 先のご回答でも十分助かっています。

回答No.2

ピボットテーブルと数式による処理の合わせ技というのもお手軽です。ご相談のデータに対して、試しにちょっと、ピボットテーブルをいじくってみてください。種類ごと、メーカーごとの一覧がすぐに入手できると思います。あとはそうして抽出された商品名を、セル内で一つにつなげればいいですね。 =c1&"、"&c2&"、"&c3 のような計算をすると、C1・C2・C3セルの値を一つにつなげることができますよ。 >データ量が多いので、マクロではなく関数で処理した方が良いと思うのですが? ??? 通常、「データ量が多いからマクロ」とおっしゃる方はよくいらっしゃるんですが、逆のパターンは珍しいですね。 手作業でも簡単にできてしまうようなような処理なら、マクロで行ってもそれほど価値はないのかな、と。まあ易しいコードでも、マクロを使わないことにはできないことというのもありますけれども。確かに、データ量が多ければ関数よりマクロのほうが適切と言えるわけでもありません。関数など数式による処理でも、パッとできてしまうことも多くあります。そのような場合、マクロコードを書いていたら、かえって時間かかって仕方ないということにも。何でも関数、何でもマクロではなく、Excelには様々な機能があるので、それらをあれこれ活用すると、結構いろいろできます。できるだけ簡単な処理を目指しましょう。 マクロが向いているのは、数式を書こうとすると複雑になってしまうけれど、内容としてはおんなじ演算をひたすらひたすら繰り返すようなとき。また、将来、何度も同じ作業を繰り返すことが予定されているような事務とかは、マクロを使えば自動化されるので、効率化につながります。たとえ数分で終わるような作業でも、それを毎日行わないといけないとしたら、ボタン1つクリックすれば数秒で終わり、とかのほうがラクですね。「繰り返し」がキーワードです。

mihotan117
質問者

お礼

御教授ありがとうございました。 私の勉強不足で、皆様にはお手間取らせて申しわけございません。 ピボットテーブルですか。 やってみます!

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

こちらの相談室でもちょっと検索してみると、多数の類似ご相談がヒットします。そういったご相談ではしばしばよく、イミフメイだけどとにかくコピーすれば動く関数式が紹介されています。 が、 >商品データは数千個以上あります というお話では、そういった計算式は実用的に役に立ちません。 現実的な方策としては 1)マクロを使う 2)丁寧に作業列を追加して、簡単な関数で計算する のどちらかになります。 関数の方がいいのでしたら、次のようにします。 1.シート1のC列に種類、D列にメーカ、E列に商品名とする 2.シート1のB列に  B2:  =C2&"_"&D2  として以下コピーする 3.シート1のA列に  =B2&"_"&COUNTIF($B$2:B2,B2)  として以下コピーする 4.シート1のC:D列を列コピーし、シート2のA列に貼り付ける 5.シート2のA:B列でデータタブの「重複の削除」を使い、一意のリストを作成する 6.シート2のC2に  =IFERROR(VLOOKUP($A2&"_"&$B2&"_"&COLUMN(A2),Sheet1!$A:$E,5,FALSE),"")  と記入し、右に下にコピー貼り付ける。 #マクロを使いたいのでしたら、上述の手順を「新しいマクロの記録」でマクロに録れば、ほぼそのまま利用できるマクロを採取できます。必要に応じて、作業列として追加したシート1のA:B列を取り除くとか、計算式の結果を値化するなどの作業を追加します。

mihotan117
質問者

お礼

早速の御教授ありがとうございました。 質問時の例の通り、アウター部分だけに試したところ Sheet2は、 A列      B列         C列 アウター  メーカーname1  商品名A アウター  メーカーname2  商品名C アウター  メーカーname3  商品名G となりました。 C列関数式は以下のとおりです。 =IFERROR(VLOOKUP($A2&"_"&$B2&"_"&COLUMN(A2),Sheet1!$A:$E,5,FALSE),"") =IFERROR(VLOOKUP($A4&"_"&$B4&"_"&COLUMN(A4),Sheet1!$A:$E,5,FALSE),"") =IFERROR(VLOOKUP($A8&"_"&$B8&"_"&COLUMN(A8),Sheet1!$A:$E,5,FALSE),"") 恐縮ですが、当方の望む結果 アウター  メーカーname1  商品名A,商品名B,商品名D,商品名F アウター  メーカーname2  商品名C,商品名E アウター  メーカーname3  商品名G,商品名H,商品名I とは、なりませんでした。 (何度か試したので、手順に間違いはないと思うのですが・・・) 引き続きご指導いただければ幸いです。

関連するQ&A

  • お判りになる方、是非ともお助け下さい(Excel)

    Excel関数で、以下の関数を使用したいのですが、どうしてもうまくいきません。どうすればよいでしょうか =IF(M5="",L5,IF(AND(M5="",L5=""),K5,IF(AND(M5="",L5="",K5=""),J5,IF(AND(M5="",L5="",K5="",J5=""),I5,IF(AND(M5="",L5="",K5="",J5="",I5=""),H5,IF(AND(M5="",L5="",K5="",J5="",I5="",H5=""),G5,IF(AND(M5="",L5="",K5="",J5="",I5="",H5="",G5=""),F5,IF(AND(M5="",L5="",K5="",J5="",I5="",H5="",G5="",F5=""),E5,IF(AND(M5="",L5="",K5="",J5="",I5="",H5="",G5="",F5="",E5=""),D5,IF(AND(M5="",L5="",K5="",J5="",I5="",H5="",G5="",F5="",E5="",D5=""),C5,IF(AND(M5="",L5="",K5="",J5="",I5="",H5="",G5="",F5="",E5="",D5="",C5=""),B5,IF(B5="",B5,M5)))))))))))) 左から右に4月から3月までの行方向の表があり、入力されたら数値を反映させたいのですが、3月と2月は問題ないものの1月からは反映されません

  • 条件によるデーターの仕分け

     初めまして、よろしくお願いします。  関数で値によってデーターを仕分ける方法を探しています。 例)     A     B    C     D     E    F 1 2 3 タイトル タイトル      タイトル      タイトル 4  数値A  数値B       数値D       数値A 5  数値F  数値G       数値H       数値G 6  数値J  数値K       数値L        数値K 7   ”    ”           ”           ” 8   ”    ”           ”           ”  と言うデーターを、F列の数値が、A列の数値かB列の数値かでD列の数値を仕分けます。           ・・H      I 1    2 3        タイトルA列 タイトルB列 4          数値D 5                 数値H 6                 数値L 7           ”      ” 8           ”      ” 列Fの数値は、必ず列Aの数値か列Bの数値かのどちらかとなります。よろしくお願いします。

  • EXCEL-同じ組み合わせになった回数

    勤務表を作成していてるのですが、画像のように上の3名(C、D、F)としたの3名(J、K、L)が同じシフトになった回数(Hは休みなのでカウントせずにAとBの時のみ)を計算したいのですがどのようにしたらいいのでしょうか? 画像の場合ですと C-J:2回  C-K:2回  C-L:3回 D-J:2回  D-K:4回  D-L:1回 E-J:4回  E-K:0回  E-L:2回 となりますが自動的に表示できるようにするにはどうすればいいでしょうか? よろしくお願いいたします。

  • エクセルデータの並び替え

    A列に 1 2 3 4 5 6 7 ・・・・・ B列に a b c d e f g h i j k l ・・・・ と文字列があります。 これを C列に 5つずつデータをセットにして並べたいのです。 A列    B列           C列 1     a      1 a   2 b  3 c  4 d  5 e 2     b      6 f   7 g  8 h  9 i  10 j 3     c      11 k  12 l  13 m  14 n  15 o 4     d      16 p   17 q  18 r  19 s  20 t 5     e      以下同じように続く 6     f 7     g 8     h 9     i 10     j 11     k 実際のC列のデータは トマト tomato  ネコ cat   机 desk  いす chair  かばん  bag  のようにしたいのです。 関数の扱いがわからずに苦戦しています。どうぞ、よろしくお願いします。

  • リストのデータを重複なしでランダムに抽出する

    シート1に下記のように14種類の名前リストがあります     A 1   A 2   B 3   C 4   D 5   E 6   F 7   G 8   H 9   I 10  J  11  K 12  L 13  M 14  N 上記の名前を下記のように別シートの数列おきの列(行は同一)に重複なしに行毎にランダムに抽出する事が関数で出来るでしょうか?(エクセルは2010です) ちなみに下記は一列おきのセルに抽出した例です   A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA 1 D   L   K    I    A   M   N    B   H   J    C    F    E   G 2 K   J   M   H    I   G   F    E   D    A    B   N   C    L 3 E   J   A    L   B   M    K   C   N    G    F   D    H   I どなたか教えていただける方がおりましたらよろしくお願いします。

  • 2つエクセルデータを比較し、必要な情報を抽出する方法は?

    sheet1        sheet2      sheet3 19000001 a    19000001 a   19000001 aa 19000001 aa   19000002 b    19000005 ee 19000002 b    19000003 c 19000003 c    19000004 d 19000004 d    19000005 e 19000005 e    19000006 f 19000005 ee   19000007 g 19000006 f    19000008 h 19000007 g    19000009 i 19000008 h    19000010 j 19000009 i    19000011 k 19000010 j    19000012 l 19000011 k 19000012 l sheet1にあるデータから sheet2にはないデータをsheet3に抜き出したい できるだけ簡単な方法を教えてください

  • Excelの行のコピーと挿入について教えて下さい

    商品に添付するラベル発行を考えています。受注数が1以外の場合は同じラベルを受注数分 発行したいと思います。 ラベルソフトの利用も検討していますが、ハードとコストの制約もあり、エクセルのデータをアクセス に取り込んで印刷する手順で進めています。 例ですが、下記の様な表で受注数が2以上の場合は、受注数を1にしてn行にして書き直す関数?マクロ?がありましたらお教え下さい。    会社名 商品名 発送先 受注数     会社名 商品名 発送先 受注数    A社   B     C     1        A社   B     C     1  D社   E     F     1         D社   E     F     1             G社   H     I      2   →    G社   H     I     1  J社   K     L     3         G社   H     I      1                              J社   K     L     1                            J社   K     L     1                            J社   K     L     1                 

  • <Excel> 特殊なデータ形式に加算した関数

    以下の形式のデータに1を加算する関数を作りたいのですが、    H000000←6桁の数値(000000~999998)    ↑  アルファベット1文字(A~Z) 例えばA1がデータ、B1に計算結果を表示させるのに    A1        B1 H000000 → H000001 H000002 → H000003 J001004 → J001005 K099999 → K100000 LEFT、RIGHT関数を使って試みたのですが、頭の0が消えてしまいます(J1005みたいに)。ご指導お願いします。なお数値は全角でなくてもかまいません。

  • データの配列

    POSTで送られたデータから配列を作りたいのです。 下記はPOSTのデータをprint_r($_POST)で全て表示していますが、 この中から[NO0~11]までを array([0]=>11 [1]=>6 ~)というような形で配列として表示したので すが、方法が分かりません。 Array ( [N00] => 11 [NAME0] => a [N01] => 6 [NAME1] => b [N02] => 9 [NAME2] => c [N03] => 3 [NAME3] => d [N04] => 12 [NAME4] => e [N05] => 10 [NAME5] => f [N06] => 1 [NAME6] => g [N07] => 5 [NAME7] => h [N08] => 2 [NAME8] => i [N09] => 7 [NAME9] => j [N010] => 4 [NAME10] => k [N011] => 8 [NAME11] => l)

    • 締切済み
    • PHP
  • エクセル:データの間にスペースを入れて表示させたいのですが

    エクセル:データの間にスペースを入れて表示させたいのですが エクセル2007を使用しています。 英数や+-が混在した30桁のデータの間に スペースを7・4・4・4・7・4 文字毎に 入れて表示させたいのですが いい方法はあるでしょうか?   a0b1c2d3e-f3g-h4i5j6k+l7m8n9o+ を   a0b1c2d 3e-f 3g-h 4i5j 6k+l7m8 n9o+ の様に表示させたいのですが。 ご存知の方がいらっしゃいましたらお教え下さい。 宜しくお願いします。

専門家に質問してみよう