• ベストアンサー

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件のデータを、手動で並び替えていますが、 これは並び替えの工夫でなんとかなるでしょうか? それともマクロなるものを使う必要があるのでしょうが。 どうかお助けいただけないでしょうか。 よろしくお願いいたします・・・

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

  • ベストアンサー
回答No.1

添付のように「並べ替えコード」を作ってやると可能です。これは match関数で自分の行の「商品名」の初出行を検索して、仕入番号 より優先してやるわけです。

goomod2
質問者

お礼

図表入りでありがとうございます! 関数で出来そうなので感激です。 ありがとうございました・・・

その他の回答 (3)

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.4

作業列を使って対応します。 例えば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)))

goomod2
質問者

お礼

具体的な作業をありがとうございました。 参考にさせていただきます。 ご回答くださった皆さん全員にポイントを差し上げたいのですが、 ポイントはお2方に限られるようで、先着の方のみとなりました。 申し訳ありません

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.3

【関数と作業列を使用する方法】  今仮に、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列のセルに、置き換えすると良いと思います。

goomod2
質問者

お礼

具体的な作業をありがとうございました。 参考にさせていただきます。 ご回答くださった皆さん全員にポイントを差し上げたいのですが、 ポイントはお2方に限られるようで、先着の方のみとなりました。 申し訳ありません

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.2

>それともマクロなるものを...  マクロ を書いてみました。 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

goomod2
質問者

お礼

マクロありがとうございました。 VBAについてはまだまだ理解できないことが多いのですが、 この内容を分析して、今後に生かしたいと思います。 ありがとうございました。