- ベストアンサー
VBAを用いた数値の並び替え
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
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)
バブルソート、というやり方です。 本来は、配列変数に入れてソートするのですが、今は、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)
元データの数(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)
こんな感じで Sub sample() With Range("A3:J3") .Value = Range("A1:J1").Value .Sort Key1:=Range("A3"), Order1:=xlDescending, Orientation:=xlLeftToRight End With End Sub
- tsubu-yuki
- ベストアンサー率46% (179/386)
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)
こんにちは Sub test() With Range("A3:J3") .Formula = "=LARGE($A$1:$J$1,COLUMN(A3))" .Value = .Value End With End Sub とかでも。