• 締切済み

エクセル セルの並べ替えを簡単にしたいです!

エクセルでのデータ集計で困っています。 取引先からのデータをフォーマット変換して集計する必要があるのですが、販売部品の並べ替えをマニュアルでやっていて非常に時間がかかります。 データとしては【部品番号】【部品名】【数量】【価格】の4項目が横に並べられています。 欲しいデータは数量が1のみで、同一部品が複数あるときは数量1で数の分羅列した形なのですが、 元データは数量が様々でこれをマニュアルで変換(数量変更+コピペ)するしかありません。 また、それらのデータを部品価格順に並べたいです。 (取引先にデータフォーマット変更お願いすれば・・・と言えばそうなのですがシステム上無理だそうで) サンプルは画像添付の通りです。 どなたかアイデアがある方、知恵をお借りできないでしょうか? 宜しくお願いいたします。

みんなの回答

  • mar00
  • ベストアンサー率36% (158/430)
回答No.4

補足を読みましたが、どこが違うのかがわかりません。 こちらで動作確認もしていますが正しく動作しているようです。 myCol = 5にブレークポイントを設定して実行してみて下さい。 横だった表が数量1のものだけが縦に表示されるはずです。 質問を読み返してみたのですが >元データは数量が様々でこれをマニュアルで変換(数量変更+コピペ)するしかありません。 数量1でないものは1に変えるという事でしょうか。

officebeginner
質問者

お礼

お礼が遅くなりすいません。 解決ができないのでもう一度別の質問を出すことにしました。 ありがとうございました。

officebeginner
質問者

補足

ご協力ありがとうございます。 まずはこちらの解釈違いがありました。「データの項目が2行目A列、データが3行目から始まっているものと仮定」をすっ飛ばしておりました。 実行したところ、部品価格は消えておらず、「部品番号」「部品名」「部品数量」「価格」の4項目がちゃんと残りますが、以下の問題で行き詰っています。 (1)部品が1列に集約される(データ開始の3行目) (2)法則が不明ですが消えてしまうデータがある。 私の最初の説明の「欲しいデータは数量1のみで」というのがややこしく誤解を与えているのですが、データとしては数量が何であろうと必要です。 データ自体は全部品必要なのですが、やろうとしているのは (1)数量1以上の部品は数量1に変更して、その数量分羅列する。  (基板3 = 基板1 基板1 基板1) (2)さらにそれらのデータを価格順に並び替える 説明が下手で申し訳ないですが、私がやりたいのは以下です。 <元データ> 行   列A  B  C  D  E   F  G  H   I   J   K  L 1   A01 基板 1 $10 A02 電源 1 $15 2   (部品なし) 3   A03 ビス  2 $1  A01 基板 1 $10  <欲しいデータ形式> 行   列A  B  C  D  E   F  G  H   I   J   K  L 1   A02 電源 1 $15 A01 基板 1 $10  2   (部品なし) 3   A01 基板 1 $10 A03 ビス  1 $1  A03 ビス  1 $1  行に入っているデータは行を跨いでは動かず、行の中でのみ価格順に並び替えをしたいです。 1は価格が高い順に並び替えられていて、電源($15)→基板($10)の順 2は部品がないのでそのままブランク 3はビスが数量2個なので、これを数量1×数量分の羅列にしたいので、 まずはビス1個のデータが2つ並べて表示されます。 さらにそれらのデータを価格順に並び替えしたいので、 基板($10)→ビス($1)→ビス($1)で3つの部品が入るようにしたいです。 ちなみに、1行あたりの部品種類は最高30(4列×30=120列)で、行は無制限です。(通常は20000から30000行のデータが存在します) 何度も大変申し訳ありません。

  • mar00
  • ベストアンサー率36% (158/430)
回答No.3

データの項目が2行目A列 データが3行目から始まっているものと仮定して Sub Macro1() Sheets("Sheet1").Copy After:=Sheets("Sheet1") Gyou = 3 For i = 5 To Cells(Gyou - 1, Columns.Count).End(xlToLeft).Column Step 4 myRow = Cells(Rows.Count, 1).End(xlUp).Row + 1 If Cells(Gyou, i + 2) = 1 Then Range(Cells(Gyou, i), Cells(Gyou, i + 3)).Copy Destination:=Range("A" & myRow) End If Next i Range("A" & Gyou - 1 & ":D" & myRow).Sort Key1:=Range("D" & Gyou), Order1:=xlDescending Range(Cells(1, 5), Cells(1, Cells(3, Columns.Count).End(xlToLeft).Column)).EntireColumn.Delete myCol = 5 For j = Gyou + 1 To myRow Range("A" & Gyou - 1 & ":D" & Gyou - 1).Copy Destination:=Cells(Gyou - 1, myCol) Range("A" & j & ":D" & j).Cut Destination:=Cells(Gyou, myCol) myCol = myCol + 4 Next j End Sub シートをコピーしてから作成するようになっているのでSheet1の部分を元データのシート名に変更して下さい。

officebeginner
質問者

お礼

お礼が遅くなりすいません。 解決ができないのでもう一度別の質問を出すことにしました。 ありがとうございました。

officebeginner
質問者

補足

ありがとうございます。 使わせていただいたのですが、部品価格が消えていて 部品を使っていない行にも入ってきてしまいます。 色々試してみましたがどこに原因があるのか、分かりません。 お力添え頂けませんでしょうか?

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

元のデータは例えば数量2の価格が載っているのに整理された表の数量1の価格が元のデータの数量2の価格となっているのは間違いではないのですか?また、部品が幾つまでについて表の横に並ぶのですか?

officebeginner
質問者

お礼

お礼が遅くなりすいません。 解決ができないのでもう一度別の質問を出すことにしました。 ありがとうございました。

officebeginner
質問者

補足

ご回答ありがとうございます。 分かりにくくてすいません。1個以上入力されている部品の価格はその数だけ数量1で横に並べていき、かつ、全体の並びを部品の価格順にしたいのです。 また、部品は最大30個横に並びます。

  • emuancha
  • ベストアンサー率29% (478/1614)
回答No.1

こんにちは。 そんな人のためにVBAがあるのです。文面のようなプログラムであればそんなに難しくはありません。まずは,やりたい事の仕様を整理して決めることです。作り方のこつとしては,ちょこっと小さい機能の仕様で作って,その上に機能追加していくことです。

officebeginner
質問者

お礼

お礼が遅くなりすいません。 出口が見えないのでもう一度別の質問を出すことにしました。 ありがとうございました。

officebeginner
質問者

補足

早速回答いただきありがとうございます。 実はVBAは全く知識がなく、マクロのレコードで何とか・・・という状態です。 VBAのお勉強が必要ですね。