• ベストアンサー

VBAを用いた数値の並び替え

VBAで入力されたデータを大きい順に並び替えるのですがやり方がわかりません。 1、A1からJ1のセルに任意の数を入力 2、A3からJ3のセルに並び替えた数字を出力(A3が最も大きい、J3が最も小さい) プログラミング初心者で初歩的な質問ではありますが困っております。 どうぞよろしくお願いしますm(__)m

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

  • ベストアンサー
  • f272
  • ベストアンサー率46% (8477/18147)
回答No.1

Sub Macro2() ActiveSheet.Range("A1:J1").Copy Destination:=ActiveSheet.Range("A3:J3") With ActiveSheet.Sort.SortFields .Clear .Add Key:=Range("A3:J3"), Order:=xlDescending End With With ActiveSheet.Sort .SetRange Range("A3:J3") .Orientation = xlLeftToRight .Apply End With End Sub

その他の回答 (5)

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.6

バブルソート、というやり方です。 本来は、配列変数に入れてソートするのですが、今は、3行目に1行目と同じものを入れて、3行目の値を配列変数に見立てて、ソートしています。 「バブルソート」というのは、泡のように(この問題では)大きい数字が上へ上がってゆくので、そのように呼ばれています。 Sub Test() Dim c, i, j, m As Long c = Cells(1, Columns.Count).End(xlToLeft).Column For i = 1 To c Cells(3, i).Value = Cells(1, i).Value Next i For i = 1 To c - 1 For j = i + 1 To c If Cells(3, i).Value < Cells(3, j).Value Then m = Cells(3, i).Value Cells(3, i).Value = Cells(3, j).Value Cells(3, j).Value = m End If Next j Next i End Sub 簡単な説明です。 c = Cells(1, Columns.Count).End(xlToLeft).Column 列の端を取得しています。 For i = 1 To c Cells(3, i).Value = Cells(1, i).Value Next i 1行目のデータを3行目にコピーしています。 For i = 1 To c - 1 For j = i + 1 To c If Cells(3, i).Value < Cells(3, j).Value Then m = Cells(3, i).Value Cells(3, i).Value = Cells(3, j).Value Cells(3, j).Value = m End If Next j Next i 「i」と「j」で大きさを比べて、大きければ、入れ替え、を繰り返しています。 なお、速さでいえば、「クィックソート」の方が、速いですが、私、説明をできないので、今回は、分かりやすい「バブルソート」です。 「VBA」に限らず、プログラミングを勉強されるのでしたら、一応、知っておいて損はないと思いますが、「VBA」しか興味がないのでしたら、他の方の回答の方が、圧倒的に優れているのだろうと思います。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

元データの数(10万件以上など。エクアセルの列数の許容限度はそんなにないのだが)にもよるが、 また多数データの場合処理時間の長短が問題になるが、しょうすうのデータと仮定して、 (1)エクセルには行や列方向にソートする機能がある。 それを使えばよい。 VBAコードを知りたければ並べ替えの操作をして、マクロの記録を取ればコードは判る。 「エクセル マクロの記録」でGoogleででも照会。 Googleででも照会してみましたか。そんなこともやってないようだ。ソートやアルゴリズムという言葉も知ってますか。 検索語の例「エクセル VBA  sort」「エクセル VBA  並べ替え」 http://excelvba.pc-users.net/fol7/7_4.html など多数 ーー エクセルの機能を使うのでなく自分でプログラムを組んでみるなら (先生の出した課題ならこちらを望むケースか) 「vba ソートアルゴリズム」などで照会してみるとよい。 http://web.sfc.keio.ac.jp/~tsaito/ITWS/Lec06.html など多数 「ソート」や「アルゴリズム」という言葉も知らないのかな。 学校で授業前の出された課題ですか。説明を聞いてもわからなかったのかな。 データは、セルの値を配列に入れて、その状態からソートのアルゴリズム(多数のやり方がある)を使う解説が多い。 その最終のソート済みの配列を、もう一度シートのセルにもどす。 下手に素人がやると間違いを含む恐れがあるので、普通はやらないと思うが。 エクセルの機能やソートのユティリティを使うと思う。 それに、データの「大小」(比較した結果の大小)とはどういうことかというコンピュターの働きに関連した考えを理解する必要がある。 「コンピュターデータの大小とは」で照会。

  • mt2015
  • ベストアンサー率49% (258/524)
回答No.4

こんな感じで Sub sample()    With Range("A3:J3")       .Value = Range("A1:J1").Value       .Sort Key1:=Range("A3"), Order1:=xlDescending, Orientation:=xlLeftToRight    End With End Sub

回答No.3

VBA勉強中でしょうか。 私も他のお二方とほとんど一緒ですが(笑) Sub Sample() Dim myRange As Range     With ActiveSheet         Set myRange = .Range("A3:J3")         .Range("A1:J1").Copy Destination:=myRange         With .Sort             With .SortFields                 .Clear                 .Add Key:=myRange, _                  Order:=xlDescending             End With             .SetRange myRange             .Header = xlGuess             .Orientation = xlLeftToRight             .Apply         End With     End With End Sub なんとなく、With多用。 一般機能で列方向のソートが出来ることに気づけば、 あとは「マクロの記録」をしてやると良いですよ。 そこから贅肉を削ぎ落してやりましょう。 なお、この例なら式のほうが早いかな。  A3セル:=LARGE($A$1:$J$1,COLUMN()) を、J3セルまでフィルしてやると一撃です。

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.2

こんにちは Sub test()   With Range("A3:J3")     .Formula = "=LARGE($A$1:$J$1,COLUMN(A3))"     .Value = .Value   End With End Sub とかでも。