• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセル 複数セルの並べ替えをVBAで楽にしたい)

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

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

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7941)
回答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