• ベストアンサー

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

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

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

  • ベストアンサー
  • f272
  • ベストアンサー率46% (8027/17155)
回答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/17068)
回答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 とかでも。

関連するQ&A

  • EXCEL VBAを用いての並び替えからの挿入表示

    EXCEL VBAを用いての並び替えからの挿入表示についての質問です。 A列に文字と数字の組み合わせデータが入っています。 カテゴリーが4つ「AC○」「BC○」「CC○」「DC○」(○は数字です)があります。 A列は「AC○」「BC○」「CC○」「DC○」の順番で並んでいます。 (ただし3つのカテゴリしかないデータの場合もあり。) そこにC1セルにデータ「AC10」、E1セルにデータ「AC12」、G1セルにデータ「BC10」、I1セルにデータ「DC10」が入ってマクロ実行した場合、添付の『マクロ実行後』のように挿入させたいです。 つまり4つのカテゴリのいずれかを判断し、A列の各カテゴリの一番最後の行に挿入させたいです。 該当したカテゴリがなければ、「AC○」「BC○」「CC○」「DC○」のカテゴリの順で最初の部分に入れる。 このような処理をするにはVBA記述はどのようにすればよいでしょうか? 私のVBAの知識レベルはマクロ記録をしてそれを元に少し修正や機能追加できたりするくらいの初心者です。 よろしくお願いいたします。

  • VBA Rangeの足し算

    どもども、とってもVBA初心者です。 "A1"のセルに任意の数字をいれます. ・"B2"セルより"A1"に代入された数分、列を移動させたセルを選ぶマクロ ・"B2"セルより"A1"に代入された数分、行を移動させたセルを選ぶマクロ 本読んでもでてこないくらい初歩のようです。 よろしくお願いします。

  • VBA 空白以外のセルをカウントして数値を返す

    エクセルVBAについて、初心者です。 例えば、A1からA5までに何か入力されている場合は、別シートのA1セルに個数を返す、というVBAを教えてください。 (A1からA5の5セルに3セルだけ文字列データが入っている場合は、別シートA1に3と入力される) 困っております。ご回答よろしくお願いいたします。

  • 印刷VBAでご教示下さい

    一つのデータ入力欄(行)を A列~H列 までとして A5A6と新しいデータを入力していますが、 データ量が多くなって印刷すると、全てが印刷されるため、必要なページ印刷を一度プレビューで 確認して範囲設定して印刷しています。 非常に手を取りますので、あるセルに入力した数字のセルをクリックすれば、入力した数字の ページのみ印刷するようなはVBA出来ないでしょうか?。 どなたか、よろしくお願いいたします。 VBAの記録と実行程度の初心者です。

  • VBA 行の削除

    全くの初心者で、初めて質問させていただきます。 A列には、数字・空白・文字を入力したセルが混在しています。 そのA列の数字の内 0 のセルが入力されている行のみを削除するVBAの記述の仕方を教えて下さい。 宜しく御願い致します。

  • エクセルVBAでセル結合

    いつもお世話になっています。 エクセル2003でVBAを使って下記をしたいのでその、VBA構文を教えて下さい。 特定の列のあるセルに文字が入っています。 (文字が入っている列は固定ですが、行番号はデータによって変わります。例えば、Aデータの場合は「J30」、Bデータの場合は、「J55」だったりします。) この文字が入っているセルをVBAで検索し、検索したセルを右隣のセルと結合します。(先ほどのAデータの場合、J30:Z30に結合します。) 更に、文字が入っているセルが2以上の複数の場合があります。(先ほどのAデータの場合、「J30」と「J40」と「J45」という感じです。文字が入っているセルの数はデータにより異なります。) 結合が終わり、このシートのデータがあるところだけに罫線を引きます。(このシートのデータというのは、前述の文字とそれ以外は、「数字」と「・」です。 ややこしいですが、よろしくお願いします。

  • VBAでやりたいこと質問します!

    こんにちわ。VBAを知って数週間の初心者です。インターネットで質問し回答をコピーして使用したりしています。 使っているうちに、ここはあーしたいあそこはこーしたいとやりたいことが増えてきてしまいました。 ご覧の皆様、良きご回答をお願いします<m(__)m> やりたいことはB列に数字を入力、C列にB列に入力した数字の累計(例.B5の累計はC5、B6の累計はC6、B7の累計はC7・・・)を表示、B列の任意のセルの入力履歴をI列の任意のセルに1回ずつ縦(例.B11の履歴を1回ずつI5、I6、I7、・・・)に表示する。 B12の入力履歴はJ列に1回ずつ縦(J5、J6、J7、・・・)に表示する。 同じようにB13の入力履歴をK列(K5、K6、K7、・・・)に表示する。 それを繰り返しB14はL列にB15はM列、B16はN列に縦に1回ずつ履歴を表示する。 B列の各セルに数字を入力したとき、Enterを2回押すと入力するセルが移動する。 Enter1回のときは、同じセルに続けて数字が入力できる。 B列の各セルに入力した数字は、C列に設けたクリアボタンでクリアすると直前の入力がクリアできる。 D列にはオールクリアボタンを設け、セルの値をオールクリアする。 電卓の「C」、「AC」ボタンの様に使いたいです。 以上、思いつくままに綴ってしまいました。 初心者が、わがままいって本当にすいません<m(__)m> 本やインターネットで、勉強しているつもりですがいつになったら組めるのか予想もつきません((+_+)) よろしくお願いします・・・・追伸、インターネットのVBAに関する質問にすばらしい回答をされている方々はVBAを仕事で使ってみえるのでしょうか?又は 個人的に勉強されているのでしょうか? どうすれば、あのすばらしいアンサーの方々に近ずけるのでしょうか・・・

  • セルの文字式の計算をVBAで行いたい

    A1のセルに "100+5n" という文字式が入っている状態で VBAにてこのセルの文字式計算を行いB1のセルから順に結果を出力したいと思っています。 "n"は1から順に指定された数まで1づつ増えていくようにし B1のセル:105、C1のセル:110、D1のセル:115 ・・・・ と結果がなるようにしたいのですが、VBAでどのように記述すればいいのか悩んでいます。 VBAを使わずにExcelの関数で計算できるのならそれでもよいと思っています。

  • VBAにて 文字と数字が混在してるデータの並び替え

    VBAにて、 A列に以下のようなデータがある場合、数字の小さい順に並べ替えるにはどうすればよいのでしょうか? 数字は文字として入力されている場合もあります。 2 1 本屋 9 赤 33 結果 パターン1 このようにしたい 数字と漢字が分かれていること 1 2 9 33 赤 本屋 パターン2 このようにしたい 数字以外の順序はどうでもよい 1 2 9 33 本屋 赤 パターン3 これはダメ 1 2 33 9 本屋 赤

  • VBAで特定範囲のセルの平均値を順次出力したい

    VBAで特定範囲のセルの平均値を順次出力したい 前回の質問で誤りがあったため再投稿しました。 図のように各行列に値が出力されており,VBAで下記のように処理をしたいと考えています。 (1) 平均値を出すセルの範囲(例えば50X16)をVBAで指定できるようにし、その範囲の平均値を求める (2) (1)で求めた平均値を新しいSheetのあるセルに出力 (3) 上記の処理をある範囲(プログラムの中で変更)の列方向に適用していき,順次(2)のSheetに平均値を出力していく イメージとしては図のように黄(A2~J10)、青(A11~J20)、赤(A21~J30)の順に列方向の平均値を新たなSheetに出力したいのです。図では黄、青、赤の3領域しかありませんが、ここもプログラムで範囲指定をできるようにし、領域の数がいくらになってもよいようにしたいです。 どなたか上記の処理ができるプログラムを教えてください。よろしくお願いします。

専門家に質問してみよう