エクセル VBAで複数セルの並べ替えを楽にする方法

このQ&Aのポイント
  • エクセルで複数セルの並べ替えをVBAを使用して簡単に行う方法を教えてください。部品数量や単価の統一、並び替えを手作業で行うのに時間がかかって困っています。
  • 取引先からのデータを集計する際に、部品数量を全て1に統一し、複数個あるデータを横に並べたいと考えています。また、その後は部品単価の高い順にデータを並び替えたいです。手動で行うのは非常に時間がかかるため、VBAを使用して効率的に処理したいです。
  • VBAがほとんど分からないため、マクロのレコーディングを使用して変更を行っていますが、うまく解決できません。このデータの変更は数時間かかるため、自動化したいと考えています。どなたか知識のある方がいらっしゃいましたら、助けていただけないでしょうか。
回答を見る
  • ベストアンサー

エクセル 複数セルの並べ替えをVBAで楽にしたい

どなたか知識のある方がいらっしゃいましたら助けてください。 やりたい事は以下の2つです。 ・部品数量が複数(2以上)あるデータを数量1に変更して、その個数分横に並べたい ・数量が1でそろったデータを単価の高い順に並び替えしたい 仕事の中で取引先からのデータを集計しているのですが、10000行くらいあるデータを手作業で変換していて非常に時間がかかって困っています。 データの内容は「部品番号/部品名/数量/単価」が1セットで4つのセルに入力されています。 取引先からのデータは数量が実数量で1だったり2だったりまちまちなのですが、こちらで管理する場合には部品数量を全て1に統一し、複数個あるデータはその個数分同じデータを横並びにしたいです。 (例) ※(部品番号/部品名/数量/単価) 【元々のデータ】 AAA/SCREW/2/\50 ・・・・・ 【変換後】 AAA/SCREW/1/\50 AAA/SCREW/1/\50 ちなみに、部品データは1行に最大30個入力(1セット4つのセルなので、合計120のセル)されています。 また、その数量を1に統一した後、今度はそれらのデータを部品単価の高い順に左から並び替えをしたいです。複数セルをセットで並び替えしないといけないので手作業でやっていて非常に時間がかかっています。 (例) ※(部品番号/部品名/数量/単価) 【元々のデータ】 AAA/SCREW/1/\50 BBB/CABLE/1/\100 CCC/SHAFT/1/\90 ・・・・・ 【変換後】 BBB/CABLE/1/\100 CCC/SHAFT/1/\90 AAA/SCREW/1/\50 ・・・・・ 先月同じ質問を出して数名の方から色々アドバイスを頂いたり参考となるデータを頂いたりしたのですが解決できなかったため今回もう一度出させて頂いております。 このデータ変更だけで数時間かかっているのでどうしても自動でエクセルにやらせたいのです・・・(泣) ちなみに私はVBAがほとんど分からず、マクロにやることをレコードして少しずつ変更しているようなレベルです。 宜しくお願いいたします。

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

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

では遅いですが簡単なマクロで。 Sub Macro1()  Dim r As Long  Dim c As Long  Dim n As Long  Dim w As Worksheet  Dim wx As Worksheet ’準備  Set w = ActiveSheet  Set wx = Worksheets.Add(before:=w) ’1行ずつ  For r = 2 To w.Range("A65536").End(xlUp).Row   wx.Cells.ClearContents  ’転記する   For c = 1 To w.Range("IV" & r).End(xlToLeft).Column Step 4    w.Cells(r, c).Resize(1, 4).Copy    For n = 1 To w.Cells(r, c + 2)     wx.Range("A65536").End(xlUp).Offset(1).PasteSpecial    Next n   Next c  ’降順に並べ替える   n = wx.Range("A65536").End(xlUp).Row   wx.Range("A2:D" & n).Sort key1:=wx.Range("D2"), order1:=xlDescending, header:=xlNo   wx.Range("C2:C" & n) = 1  ’転記する   For c = 2 To wx.Range("A65536").End(xlUp).Row    wx.Cells(c, "A").Resize(1, 4).Copy w.Cells(r, (c - 2) * 4 + 1)   Next c  Next r ’片づける  Application.DisplayAlerts = False  wx.Delete  Application.DisplayAlerts = True End Sub 目的のシートを開いてマクロを実行する。

officebeginner
質問者

お礼

できました、これです!!!! これで簡単なんですか?すごいですね。 本当にありがとうございました。これでかなり時間を短縮することができます。 私もいつかはこんなマクロをちょろっと組めるようになりたいです。

その他の回答 (2)

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

回答No1です。単価の体ものを上に並べるのでしたね。 それでしたらシート1でA列からD列までを選択してから「ホーム」タブの「並べ替え」をクリックして「ユーザー設定の並べ替え」を選択します。 最優先されるキーにはD1セルの文字を選択し、順序を「降順」にしてOKすればよいでしょう。 その他の操作は回答1のとおりです。

officebeginner
質問者

お礼

並び替えしましたが行が変わってしまいます。 同じ行の中で並び替えしたかったです。 が、これもまたひとついい勉強になりました。ありがとうございます。

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

マクロですることのメリットはほとんどないでしょう。関数で十分に対応できます。 例えばシート1のAからD列で2行目から下方にデータが並んでいるとします。 シート2の2行目からお求めの表を作成するとしてA2セルには次の式を入力して120列(DP2)まで右横にドラッグコピーします。 =IF(OR(ROW(A1)>COUNTA(Sheet1!$A$2:$A$12000),COLUMN(A1)>INDEX(Sheet1!$C:$C,ROW(A2))*4),"",IF(MOD(COLUMN(A1)-1,4)+1<>3,INDEX(Sheet1!$A:$D,ROW(A2),MOD(COLUMN(A1)-1,4)+1),1)) そのドラッグした範囲を選択してから右クリックしてコピーします。 名前ボックスにはA2と表示されていることでしょうが、その窓を書き変えてA2:DP12000のようにします。確定すればその範囲が選択されますのでA2セルの場所で右クリックして「貼り付け」を行います。 これで操作は終了です。

officebeginner
質問者

お礼

早速のご回答ありがとうございます。 教えていただいた方法でやってみて、Sheet1のA-DにあるデータでCの数が2以上のものはSheet2のEから後にその差数分出てくるのですが、その後のデータ(Sheet1のE以降)のデータが出てきません。また、Sheet1のCが1のものもE以降のデータが出てきません・・・ 難しいですね、この関数も私にとっては・・・

関連するQ&A

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

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

  • エクセル、複数行のデータを別シートに集計するには?

    複数行のデータを別シートに、伝票番号別、品名別に反映させるにはどのような関数にすればいいですか? 例えば、 [シート1] 伝票番号   品名   数量 aaa      りんご   50 aaa      バナナ   30 aaa      もも     15 bbb      バナナ   20 bbb      りんご   33 ccc      りんご   10 ccc      バナナ    40 [シート2]    A      B    C    D    1         aaa  bbb  ccc 2 りんご    50   33   10 3 バナナ    30   20   40 4 もも      15 [シート1]の様なデータがあり、それを[シート2]のセルB1に伝票番号を入力したらセルB2、B3...と数量が反映するようにしたいです。 わかりづらくてすいません。 どなたかわかる方がいらしたらお願いします。    

  • 1つのセルに複数のハイパーリンク(改)

    二重投稿申し訳ありません。 あせり過ぎてて、アプリ名書き忘れてました エクセル2003で1つのセルに複数のハイパーリンクを設定することは可能でしょうか? たとえば、1つのセルに AAA,BBB,CCCと表示されていて AAAをクリックしたらhttp:xxxへ BBBをクリックしたらhttp:yyyへ CCCをクリックしたらhttp:zzzへと言った様に

  • 【Excel VBA】複数範囲の並べ替えは可能でしょうか?

    【Excel VBA】複数範囲の並べ替えは可能でしょうか? Excel2003を使用しています。 CSVデータを元に作成された下記のような表があります。 A列…日付、B列…受注番号、C列…摘要(会社名・品名等)、D列…金額となっています。 6行目以下に上記の内容でデータが入力されていますが、会社ごとのデータ内で日付順に並べ替えをしたいのですが、VBAで複数の範囲を選択して、それぞれの範囲内での並べ替えは可能でしょうか?     A     B     C    D 6             ○○会社 7   1/20   123   AAA   1,000 8   1/15   120   BBB   2,000 9 10              計     3,000 11 12            ××会社 13 計の1行上と下は空欄行で、以下、会社名の後にデータが続くというパターンの繰り返しで数十社分あります。 Excelのデータ⇒並べ替えでは複数選択した状態での並べ替えはできないので、VBAで可能であればと思い、質問させていただきました。 よろしくお願いします。

  • エクセルで複数シートを一覧表にするには?

    教えてください。エクセルで複数シートを自動で別のシートに転記したいのですが、 やり方がわかりません。 各シートの空白部分を除いてデーターがある分だけを取り出して、金額に数式を入れて 合計金額を追加したいのですが・・・・・。 下記のような感じでできますか? 宜しくお願いいたします。    Sheet1     商品名  単価  数量        ****   000  000        ****    00   00   Sheet2     商品名  単価  数量        ****   000  000        ****    00   00   Sheet3     商品名  単価  数量        ****   000  000        ****    00   00 をSheet4に   シート名 商品名  単価  数量  金額   Sheet1  ****   000  000  0000(単価×数量)          ****    00   00  0000(単価×数量)                    合計金額  000   Sheet2 商品名  単価  数量  金額         ****   000  000  0000(単価×数量)         ****    00   00  0000(単価×数量)                   合計金額  000    Sheet3 商品名  単価  数量  金額         ****   000  000  0000(単価×数量)         ****    00   00  0000(単価×数量)                   合計金額  000

  • アクセス2003 各売上日の直近仕入額を知るには?

    いつもお世話になっています。 クエリを使って次のようなことがしたいのですが可能でしょうか? 下記のような2つのテーブルがあるとします。 <仕入記録> [仕入ID]  [仕入年月日]   [商品名]   [数量]   [単価]   1     2007/04/01     AAA    1    1,000   2     2007/04/03     BBB    1    2,000   3     2007/05/06     AAA    1    1,200   4     2007/05/15     CCC    1     800   5     2007/06/08     BBB    1    2,200   6     2007/06/20     CCC    1     900 <売上記録> [売上ID]   [売上年月日]   [商品名]   [数量]   1      2007/04/25    AAA      1   2      2007/05/08    AAA      1   3      2007/05/08    BBB      1   4      2007/06/10    AAA      1   5      2007/06/10    BBB      1   6      2007/06/10    CCC      1 この時2つのテーブルを使って販売した商品の原価(仕入単価)を求めるクエリを作りたいのですがどのようにしたらよいのでしょうか? 仕入単価は、各商品の売上年月日以前かつ最も売上年月日に近い仕入れ時の単価にしたいと考えています。 上記の場合、希望するクエリの結果は下記のような感じです。 [売上ID]   [売上年月日]   [商品名]   [仕入単価]   1      2007/04/25    AAA      1,000   2      2007/05/08    AAA      1,200   3      2007/05/08    BBB      2,000   4      2007/06/10    AAA      1,200   5      2007/06/10    BBB      2,200   6      2007/06/10    CCC       800 ご指導よろしくお願いします。

  • 検索SQLについて

    SQL初心者です。 SQL文1つで以下のようなことをしたいんですが いい方法が思いつかなくて大変困ってします。 いい方法がありましたら教えてください。 以下のようなデータがあるとして 電話番号、商品名 、日付 、数量 00000001、商品AAA、2004/10/10、1 00000001、商品AAA、2004/10/10、2 00000001、商品BBB、2004/10/10、1 00000002、商品AAA、2004/10/09、2 00000002、商品AAA、2004/10/10、1 00000003、商品AAA、2004/10/10、1 00000003、商品AAA、2004/10/10、1 電話番号と商品名が同じ場合は (1)日付(降順) (2)数量(昇順) の順に比較して1つだけに絞って取得したい 「取得結果」 電話番号、商品名 、日付 、数量 00000001、商品AAA、2004/10/10、1 00000001、商品BBB、2004/10/10、1 00000002、商品AAA、2004/10/09、2 00000003、商品AAA、2004/10/10、1 よろしくお願いします。

  • 複数の条件

    名前 G番号 G連番 数量  チーム AAA   1    1    80    1 AAA   2    1    99    1 AAA   3    1    98    1 AAA   3    2    60    1 AAA   4    1    99    1 AAA   4    2    97    1 BBB   1    1    22    2 BBB   2    1    19    2 BBB   2    2    99    2 BBB   3    1    50    2 CCC   1    1    99    1 CCC   2    1    99    1 DDD   1    1    99    1 DDD   2    1    99    1 DDD   1    1    99    2 DDD   2    1    99    2 以上のようなテーブル T_Aがあるとして、以下のような優先順位での抽出条件を考慮した場合のSQL記述方法が分かりません。教えていただけますでしょうか。 名前  "AAA" OR "DDD" ↓ チーム "1" ↓ G番号 "最大"のもの ↓ G連番 "最大"のもの 欲しいレコード 名前 G番号 G連番 数量  チーム AAA   4    2    97    1 DDD   2    1    99    1 以下のようにやってみましたが駄目でした。 SELECT 名前,G番号,G連番,数量,チーム FROM T_A WHERE 名前='AAA' OR 名前='DDD' AND チーム='1' AND (G番号=(SELECT MAX(G番号) FROM T_A)) AND (G連番=(SELECT MAX(G連番) FROM T_A)) 宜しく御願いいたします。

  • エクセル セル内の文字列を空白から空白まで抽出したい。

    一つのセルに入っている文字列を複数のセルに分割したいのですが良い方法が見つかりません。 具体的には 「商品名 単価 数量 金額」が一つのセルに入っているのですが、これをそれぞれ「商品名」「単価」「数量」「金額」というように別のセルに分けたいのです。 条件は次です。 ・文字列の区切りは空白(スペース)。 ・商品名や金額などそれぞれの文字列の長さは決まっていません。 ・商品名には名称の中に空白が使われている場合があります、その数も決まっていません。 以上です。いろいろ関数を使ってやってみたのですが、どうもうまくいきません。 どなたか良い方法がありますでしょうか、よろしくお願いいたします。

  • Excel VBA 「小計」と入力したら自動計算

    エクセルの小計の計算について質問いたします。    A列    B列      C列   D列     E列    F列 1 施設名  2      商品名,内容   1    単位     単価    金額(数量×単価) 3      商品名,内容   1    単位     単価    金額(数量×単価) 4                              小計     ●●●● ――――――――――――――――――――――――――――――――― 5 施設名 6      商品名,内容   1    単位     単価    金額(数量×単価) 7      商品名,内容   1    単位     単価    金額(数量×単価) 8      商品名,内容   1    単位     単価    金額(数量×単価) 9                              小計     ●●●● ―――――――――――――――――――――――――――――――――                                合計     ●●●● 施設名ごとに項目が複数あり、施設ごとに項目の数も違います。 これを施設ごとに●の所に小計を出したいです。 「小計」が数回にわたり出てくる場合は、「前回小計をした次のセルから今回小計するセルの前まで」を計算させる訳ですが、どんなVBAを組めばいいのかわかりません。 理想としてはにE列に小計という文字を入れるとF列に自動で計が出るようにして、さらに小計の合計を最後の行のセルにだしたいです。。 さらに、見やすくなるように小計の下のセルにA~Fの間に太線を引いて施設ごとの区切りがわかるようにしたいです。。 繰り返し作業ばかりで大変です。 どなたか知恵をお貸しください。

専門家に質問してみよう