- ベストアンサー
excelの並び替え(少し特殊な条件)
いつもお世話になります。 excel2003/2007(windows)です。 excelの並び替えについて質問です。 毎月、商品の仕入れがあるたび <仕入番号>を連番で振っていきます。 並び替えは<仕入番号>で並んでいればいいのですが、 1つだけ特別な条件があります。 *並び替え前のデータ <仕入番号> <商品名> 1 C部品 2 B溶剤 3 C部品 4 D工具 5 E機器 6 A部品 7 B溶剤 8 C部品 9 E機器 「<商品名>が同じもの については、<仕入番号>の若い順に位置を”まとめる”」 という条件です。 具体的には今回のような表の場合、 <仕入番号>1から並べていくわけですが・・・ <仕入番号>1と同じ「C部品」が3番と8番にあります。 この場合1,3,8と並べ、次に、 <仕入番号>2を並べますが、「B溶剤」は7番にあるので、 2,7と並べ、次に、 <仕入番号>4を並べ、 (仕入番号3はすでに並べたので4になります、 「D工具」は、この1件だけなので、”まとめる”作業はなし) ・・・このような感じで、並び替えたあとは、 下記のようになります。 *並び替え後のデータ <仕入番号> <商品名> 1 C部品 3 C部品 8 C部品 2 B溶剤 7 B溶剤 4 D工具 5 E機器 9 E機器 6 A部品 毎回数100件のデータを、手動で並び替えていますが、 これは並び替えの工夫でなんとかなるでしょうか? それともマクロなるものを使う必要があるのでしょうが。 どうかお助けいただけないでしょうか。 よろしくお願いいたします・・・
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (3)
- KURUMITO
- ベストアンサー率42% (1835/4283)
作業列を使って対応します。 例えばC2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(B2="","",IF(COUNTIF(B$2:B2,B2)=1,A2,INDEX(A:A,MATCH(B2,B:B,0))+COUNTIF(B$2:B2,B2)/100)) 並び替えた表をE列およびF列に表示させるとしたらE2セルには次の式を入力してF2セルまでオートフィルドラッグしたのちに下方にもオートフィルドラッグします。 =IF($B2="","",INDEX(A:A,MATCH(SMALL($C:$C,ROW(A1)),$C:$C,0)))
お礼
具体的な作業をありがとうございました。 参考にさせていただきます。 ご回答くださった皆さん全員にポイントを差し上げたいのですが、 ポイントはお2方に限られるようで、先着の方のみとなりました。 申し訳ありません
- kagakusuki
- ベストアンサー率51% (2610/5101)
【関数と作業列を使用する方法】 今仮に、Sheet1の1行目に「<仕入番号>」や「<商品名>」といった項目名が並んでいて、同じSheetのA2~A99にかけて仕入番号が入力されていて、Sheet1のB2~B99にかけて商品名が直接入力されていて、商品番号は順不同に並んでいるものとします。 そして、Sheet2のA列には並べ替え後の仕入番号が表示され、同じSheetのB列には並べ替え後の商品名が表示されものとします。 又、Sheet2のD列、E列、F列、G列、H列を作業列として使用するものとします。 まず最初に、Sheet2のD2セルに以下の数式を入力して下さい。 =IF(ROWS(D$2:D2)>COUNTA(Sheet1!$B$2:$B$99),"",ROWS(D$2:D2)) 次に、Sheet2のE2セルに以下の数式を入力して下さい。 =IF(ROWS(E$2:E2)>COUNTA(Sheet1!$B$2:$B$99),"",VLOOKUP(D2,Sheet1!$A$2:$B$99,2,FALSE)) 次に、Sheet2のF2セルに以下の数式を入力して下さい。 =IF(OR($E2="",COUNTIF($E$2:$E2,$E2)>1),"",COUNT(F$1:F1)+1) 次に、Sheet2のG2セルに以下の数式を入力して下さい。 =IF($E2="","",VLOOKUP($E2,$E$2:$F$99,2,FALSE)*ROWS(Sheet1!$B$2:$B$99)+COUNTIF($E$2:$E2,$E2)) 次に、Sheet2のH2セルに以下の数式を入力して下さい。 =IF(ROWS(H$2:H2)>COUNTA(Sheet1!$B$2:$B$99),"",SMALL($G$2:$G$99,ROWS(H$2:H2))) 次に、Sheet2のA2セルに以下の数式を入力して下さい。 =IF(ROWS(A$2:A2)>COUNTA(Sheet1!$B$2:$B$99),"",INDEX($D$2:$E$99,MATCH($H2,$G$2:$G$99,0),1)) 次に、Sheet2のB2セルに以下の数式を入力して下さい。 =IF(ROWS(A$2:A2)>COUNTA(Sheet1!$B$2:$B$99),"",INDEX($D$2:$E$99,MATCH($H2,$G$2:$G$99,0),2)) 最後に、Sheet2の2行目をコピーして、Sheet2の3~99行目に貼り付けて下さい。 以上で完成です。 尚、元データの仕入番号が順不同ではなく、最初から昇順に並んでいる場合には、数式中のSheet2のD列とE列のセルと書かれている箇所を、Sheet1のA列とB列のセルに、置き換えすると良いと思います。
お礼
具体的な作業をありがとうございました。 参考にさせていただきます。 ご回答くださった皆さん全員にポイントを差し上げたいのですが、 ポイントはお2方に限られるようで、先着の方のみとなりました。 申し訳ありません
- DOUGLAS_
- ベストアンサー率74% (397/534)
>それともマクロなるものを... マクロ を書いてみました。 Sub Macro1() Columns("B:B").AdvancedFilter Action:=xlFilterInPlace, Unique:=True Range(Range("B2"), Range("B2").End(xlDown)).Select Application.DeleteCustomList ListNum:=Application.CustomListCount + 1 Application.AddCustomList ListArray:=Selection ActiveSheet.ShowAllData Range("A1:B10").Sort Key1:=Range("B2"), Order1:=xlAscending, Key2:=Range( _ "A2"), Order2:=xlAscending, Header:=xlGuess, OrderCustom:=22, MatchCase _ :=False, Orientation:=xlTopToBottom, SortMethod:=xlStroke, DataOption1:= _ xlSortNormal, DataOption2:=xlSortNormal Application.DeleteCustomList ListNum:=Application.CustomListCount Range("A1").Select End Sub
お礼
マクロありがとうございました。 VBAについてはまだまだ理解できないことが多いのですが、 この内容を分析して、今後に生かしたいと思います。 ありがとうございました。
お礼
図表入りでありがとうございます! 関数で出来そうなので感激です。 ありがとうございました・・・