配列の並び替え方法

このQ&Aのポイント
  • 配列の並び替え方法についての質問です。
  • 2行目の値が3行目の値より小さい配列で、かつ2行目の値が小さい順に並び替える方法を教えてください。
  • また、3行目より2行目の値の方が大きい配列で、3行目の値が大きい順に並び替える方法も教えてください。
回答を見る
  • ベストアンサー

配列の並び替え

下のように5つの配列がA~E列まであって、2、3行目にデータが入っています。このときに、2行目の値が3行目の値より小さい配列で、かつ、2行目の値が小さい順に並べる。その後に、3行目より、2行目の値の方が大きい配列を3行目の値が大きい順に並べるマクロコードを教えてください。   A B C D E←列      1  1 2 3 4 5←配列番号 2  4 9 8 6 2 3  1 5 7 10 3      ↑ 行    ↓     A B C D E 1  5 4 3 2 1 2  2 6 8 9 4 3  3 10 7 5 1

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#3>実際は上のように5行目、B列からデータを入力して実行したので… 結局(お互いに)遠回りになるので、最初から実際に即して質問された方がいいかもしれません。。 Sample プロシージャ を処理データの基点と出力位置の基点で動作するように変更してみました。 >Const 基準セル = "B5" >Const 出力基準セル = "A1" の部分を変えれば、入力データは、"基準セル"(例で言うとB5)を基点(左上)として始まり 出力位置は"出力基準セル"(例で言うとA1)を基準とするようになります。 #3の補足で書かれたような変更もできないではないですが、 (私見ですが)あまり良い方法とは思えません。 ---------------------------------------------------------------- Public Sub sample() Const 行数 = 3 Const 基準セル = "B5" Const 出力基準セル = "A1" Dim 列数 As Integer Dim a(), x Dim i, wk Dim swap As Boolean Dim base As Range Sheets("Sheet1").Select Set base = Range(基準セル) 列数 = base.End(xlToRight).Column ' 基準セルからデータが連続していること ReDim a(行数, 列数) a = Range(base, base.Offset(行数 - 1, 列数 - 1)).Value Application.ScreenUpdating = False swap = True Do While swap swap = False For i = 列数 To 2 Step -1 If change_test1(a(2, i - 1), a(3, i - 1), a(2, i), a(3, i)) Then '条件が成立したら、交換する wk = a(1, i): a(1, i) = a(1, i - 1): a(1, i - 1) = wk wk = a(2, i): a(2, i) = a(2, i - 1): a(2, i - 1) = wk wk = a(3, i): a(3, i) = a(3, i - 1): a(3, i - 1) = wk swap = True End If Next Loop swap = True Do While swap swap = False For i = 列数 To 2 Step -1 If change_test2(a(2, i - 1), a(3, i - 1), a(2, i), a(3, i)) Then '条件が成立したら、交換する wk = a(1, i): a(1, i) = a(1, i - 1): a(1, i - 1) = wk wk = a(2, i): a(2, i) = a(2, i - 1): a(2, i - 1) = wk wk = a(3, i): a(3, i) = a(3, i - 1): a(3, i - 1) = wk swap = True End If Next Loop Sheets("Sheet2").Select '出力シート Set base = Range(出力基準セル) Range(base, base.Offset(行数 - 1, 列数 - 1)) = a Application.ScreenUpdating = True End Sub

hiro526
質問者

お礼

ありがとうございました。 無事に実行することができました。

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#2>このマクロコードを実行すると、…うまく実行することができませんが、どのような原因があるのでしょうか? ウチの環境(excel2002)では、問題なく実行できています。 何か変更されましたでしょうか? >If change_test1(a(2, i - 1), a(3, i - 1), a(2, i), a(3, i)) Then で >「インデックスが有効範囲にありません」 と言うメッセージがでるとすると、配列 a の範囲を超える添字を指定したということになりますが、 ReDim a(行数, 列数) であり、 For i = 列数 To 2 Step -1 ですから、 配列範囲外にはなるはずがないと思えます。 デバッグで止まった時に i の値はいくつになっていますか?

hiro526
質問者

補足

  B C D E F 列 (5) 1 2 3 4 5 (6) 4 9 8 6 2 (7) 3 10 7 5 1 行 実際は上のように5行目、B列からデータを入力して実行したので、const 行列=3を行列=7にして、 For i = 列数 To 2 Step -1 If change_test1(a(2, i - 1), a(3, i - 1), a(2, i), a(3, i)) Then を For i = 列数 To 2 Step -1 If change_test1(a(6, i - 1), a(7, i - 1), a(6, i), a(7, i)) Then に変更しました。 デバッグ時のiは6になっています。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1>配列数が任意の値nのときで、sheet2に並び替えた配列を表示させる と言うわけで修正してみました。 Sheet1 のA1からn列までのデータを処理してSheet2 に書き出します ---------------------------------------------------------------- Public Sub sample() Const 行数 = 3 Dim 列数 As Integer Dim a(), x Dim i, wk Dim swap As Boolean Sheets("Sheet1").Select 列数 = Range("A1").End(xlToRight).Column ' A1からデータが連続していること ReDim a(行数, 列数) a = Range(Cells(1, 1), Cells(行数, 列数)).Value Application.ScreenUpdating = False swap = True Do While swap swap = False For i = 列数 To 2 Step -1 If change_test1(a(2, i - 1), a(3, i - 1), a(2, i), a(3, i)) Then '条件が成立したら、交換する wk = a(1, i): a(1, i) = a(1, i - 1): a(1, i - 1) = wk wk = a(2, i): a(2, i) = a(2, i - 1): a(2, i - 1) = wk wk = a(3, i): a(3, i) = a(3, i - 1): a(3, i - 1) = wk swap = True End If Next Loop swap = True Do While swap swap = False For i = 列数 To 2 Step -1 If change_test2(a(2, i - 1), a(3, i - 1), a(2, i), a(3, i)) Then '条件が成立したら、交換する wk = a(1, i): a(1, i) = a(1, i - 1): a(1, i - 1) = wk wk = a(2, i): a(2, i) = a(2, i - 1): a(2, i - 1) = wk wk = a(3, i): a(3, i) = a(3, i - 1): a(3, i - 1) = wk swap = True End If Next Loop Sheets("Sheet2").Select Range(Cells(1, 1), Cells(行数, 列数)) = a Application.ScreenUpdating = True End Sub '2行目の値が3行目の値より小さい配列で、かつ、2行目の値が小さい順 Private Function change_test1(a2, a3, b2, b3) As Boolean If b2 < b3 And (a2 >= a3 Or a2 < a3 And a2 > b2) Then change_test1 = True Else change_test1 = False End If End Function '3行目より、2行目の値の方が大きい配列を3行目の値が大きい順 Private Function change_test2(a2, a3, b2, b3) As Boolean If b2 >= b3 And a2 >= a3 And a3 < b3 Then change_test2 = True Else change_test2 = False End If End Function

hiro526
質問者

補足

このマクロコードを実行すると、 「実行時エラー"9"  インデックスが有効範囲にありません」と、表示されディバックすると If change_test1(a(2, i - 1), a(3, i - 1), a(2, i), a(3, i)) Then のところが選択されてしまい、うまく実行することができませんが、どのような原因があるのでしょうか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

Public Sub sample() Const 列数 = 5, 行数 = 3 Dim a(), x Dim i, wk Dim swap As Boolean ReDim a(行数, 列数) a = Range(Cells(1, 1), Cells(行数, 列数)) Application.ScreenUpdating = False swap = True Do While swap swap = False For i = 列数 To 2 Step -1 If change_test1(Cells(2, i - 1).Value, Cells(3, i - 1), Cells(2, i).Value, Cells(3, i).Value) Then '条件が成立したら、交換する wk = Cells(1, i).Value: Cells(1, i).Value = Cells(1, i - 1).Value: Cells(1, i - 1).Value = wk wk = Cells(2, i).Value: Cells(2, i).Value = Cells(2, i - 1).Value: Cells(2, i - 1).Value = wk wk = Cells(3, i).Value: Cells(3, i).Value = Cells(3, i - 1).Value: Cells(3, i - 1).Value = wk swap = True End If Next Loop swap = True Do While swap swap = False For i = 列数 To 2 Step -1 If change_test2(Cells(2, i - 1).Value, Cells(3, i - 1), Cells(2, i).Value, Cells(3, i).Value) Then '条件が成立したら、交換する wk = Cells(1, i).Value: Cells(1, i).Value = Cells(1, i - 1).Value: Cells(1, i - 1).Value = wk wk = Cells(2, i).Value: Cells(2, i).Value = Cells(2, i - 1).Value: Cells(2, i - 1).Value = wk wk = Cells(3, i).Value: Cells(3, i).Value = Cells(3, i - 1).Value: Cells(3, i - 1).Value = wk swap = True End If Next Loop Application.ScreenUpdating = True End Sub '2行目の値が3行目の値より小さい配列で、かつ、2行目の値が小さい順 Private Function change_test1(a2, a3, b2, b3) As Boolean If b2 < b3 And (a2 >= a3 Or a2 < a3 And a2 > b2) Then change_test1 = True Else change_test1 = False End If End Function '3行目より、2行目の値の方が大きい配列を3行目の値が大きい順 Private Function change_test2(a2, a3, b2, b3) As Boolean If b2 >= b3 And a2 >= a3 And a3 < b3 Then change_test2 = True Else change_test2 = False End If End Function

hiro526
質問者

補足

詳しい回答ありがとうございます。 もし、よろしければ、配列数が任意の値nのときで、sheet2に並び替えた配列を表示させるようにするにはどのようになるか教えていただけば幸いです。

関連するQ&A

  • VBAの一次元配列から二次元配列へ

    A列にa1~a100まで数字が入ってます。 それを、b1~b5,c1~c5,…省略 u1~u5までに、データを 5行ずつ移したいのです。 b1にはa1、b2にはa2の値を、u5にはa100の値を入れたいのです。 マクロの自動記録?を使うとできることはできるのですが…。 一次配列→二次配列で、出来ると聞いたことがあるのですが。 ※VBAは全くの初心者です。 コードに説明もつけてくださるとすごく助かります。 どうかよろしくお願いいたします。

  • <文字列マクロについて>

    <文字列マクロについて> 皆さま お力を貸して下さい。 初心者で、何もわからず書いておりますがすみません。 下記の2つのマクロを教えて下さい。 ?横に並んだ「ある行」に在るデータを「列」に変換し、  指定した数だけ並べる    あいうえお    ←A1セルからE1まで5列(これは状況により変わる)       ↓(マクロ実行:3行同じ数だけ並べるという指定)  あ        →A1セルから下にひたすら、同じ文字が続き順に並ぶ  あ  あ  い  い  い  う  う        →A1セルから下に並べる(3行は指定できれば別の数字にも変えたい  う  え  え  え  お  お  お ?規則的に並んだデータのまとまりをセットで移動する。  例だと5つの塊(これは変数とおきたい)    あ A              a  い B              b  う C               c   え D               d  お E              e    ↓(マクロ実行)  あ  い  う  え  お  A  B  C  D  E      ・  ・  ・  ・    a b c d e    

  • 配列のソートについて

    配列をソートした時、もともとデータのあった配列番号を記憶しておきたいのですが いい方法はないでしょうか (31,55,84,20,96,14); //1 2 3 4 5 6 ↓ (14,20,31,55,84,96) //6 4 1 2 3 5    ※ソート前の配列番号 いくつかの行(配列A)の、違う列にあるデータを抜き出して配列Bにまとめた後、配列Bをソート その後、配列Bのもともとの順番の位置の行にあるデータを上からコピーしていく感じで行ごとのソートを考えています イメージはこんな感じです a[0]=[1,512,200]; a[1]=[3,100,1]; a[2]=[4,100,265]; a[3]=[8,300,1]; //ソート対象を抜き出す b[0]=a[0][1]; b[1]=a[1][2]; b[2]=a[2][0]; b[3]=a[3][1]; b.sort(); c[0]=a[b[0]のソート前の配列番号]; c[1]=a[b[1]のソート前の配列番号]; c[2]=a[b[2]のソート前の配列番号]; c[3]=a[b[3]のソート前の配列番号];

  • エクセルにて複数セルの並び替え

    こんにちは、エクセルについて教えてください。列はA~Hまで、行は1~200行ほどに値が入っています。 例えばValueが以下のようだとします。 A1 B1 C1 D1 E1 F1 G1 H1 A2 B2 C2 D2 E2 F2 G2 H2 ... これらのValueを、別のSheetに以下のように並び替えたいのですが、 A1 B1 C1 D1 E1 F1 G1 H1 A2 B2 C2 D2 E2 F2 G2 H2 A3 B3 ...と、これがA200~H200の行分まで。なのでPaste後は800行になります。どうにかマクロか何かで簡単に 出来ないかと思い、どなたかご教授いただければと思います、よろしくお願いします!

  • エクセルでの連番の処理

    お世話になります。 1行目に入力されたデータをルールに沿って2行目以下にどんどん追加していきたいと思っています。 まずD1、E1のセルに数字を入れます。 例:D1に3、E1に25 を入れてマクロを実行するとD列の2行目以下に3,4,5,6…25と連番で入力出来るようにしたいのです。 この例ではD列は24行目まで入力されています。そこで2行目から24行目までのA,B,C列にはそれぞれ1行目のA,B,C列と同じデータを入力します。なおA,B,C列は数字、文字列どちらもあります。空白の場合もあります。 この状態でA~E列の1行目のデータを変更し、仮にD1を2、E1を15としたとします。ここで再度マクロを実行すればD25に2、そして順に連番が入りD38に15が入るようにします。 同時に25行目から38行目までのA,B,C列にはそれぞれ1行目のA,B,C列と同じデータを入力します。 これの繰り返しです。 つまり2行目以下のD列で空白の行以下にどんどん連番を入れていく具合です。 前提としてD1、E1は整数しか入りません。またE1の数字はD1より大きいです。ただD1,E1に同じ数字が入った場合、その数字の1行分だけが入力されるようにします。 以上の処理が自動化できるマクロはできますか? アドバイス願います。

  • 配列の座標指定について。

    たとえば、下のような10行10列の配列でdの3を指定したいときにどういう手段で行えばいいのでしょうか? 入力についてですがdと3の間にはスペースは空けません。 困っています。お願いいたします。 行がそろっていません。みにくいですがお許しください。 \\\a b c d e f g h i j  \\\\\\\\\\\\\\\\\\\\\\\\\\\ 0 \ 0 0 0 0 0 0 0 0 0 0 1 \ 0 0 0 0 0 0 0 0 0 0 2 \ 0 0 0 0 0 0 0 0 0 0 3 \ 0 0 0 0 0 0 0 0 0 0 4 \ 0 0 0 0 0 0 0 0 0 0 5 \ 0 0 0 0 0 0 0 0 0 0 6 \ 0 0 0 0 0 0 0 0 0 0 7 \ 0 0 0 0 0 0 0 0 0 0 8 \ 0 0 0 0 0 0 0 0 0 0 9 \ 0 0 0 0 0 0 0 0 0 0

  • エクセル:下にコピーをマクロで(条件付)

    お世話になります。 エクセルでの入力で、「下にコピー」を多用する仕事があります。 以下の例をマクロでやりたいです。 例 まずC列、D列、E列のうちデータが入っている行がもっとも大きい列を判断します。 C10、D12、E13が各列のデータが入っている最大行の場合、E13の13行目が最大になります。このようにE列が最大になる場合、C列はC10の値を13行目まで下にコピー、D列はD12の値を13行目まで下にコピーします。(Ctrl+D) (ここでいう13行目までというのは最大値E13の13を意味します。) また、C12、D15、E11が各列のデータが入っている最大行の場合、D15の15行目が最大になります。D列が最大になる場合は、C列のC12の値を15行目まで下にコピーします。(E列に対してはなにもしない) さらに、C13、D10、E11が各列のデータが入っている最大行の場合、C13の13行目が最大になります。C列が最大になる場合はなにもしない。 C列、D列、E列のうちデータが入っている行がもっとも大きい列が判断できない場合(C14、D14、E12など最大行が同じ場合)の時も何もしません。 これをマクロでやる場合、どうすればよいでしょうか?

  • エクセルマクロ、空白行(セル)の挿入

    データがA、B、C、D、E列100行まであります。 このうちD、E列を除き、エクセルのマクロで1行ごとに空白で10行挿入したいです。 (A、B、C、D列のデータに空白セルを10行分挿入し、下にシフトするイメージ。D、E列はそのまま。) ご教授頂きたく、お願いします。

  • マクロで行の並び替え+整列させる

    (1)以下の様にセルにデータが入っているとします。 (C列のデータが1行ずれて入っています。かつD列には1種類OR2種類のデータが入ってます。) A B C D E F 1 ● ● ● ● ● 2       ☆ 3   ● 4 ○ ○ ○ ○ ○ 5   ○ 6 ● ● ● ● ● 7 ☆ (2)これを以下の通りに並び替え+整列します。 (C列のデータが1行ずれて入っています。 かつD列に2種類のデータが入っている場合、改行して整列します。) A B C D E F 1 ● ● ● ● ● ● 2 ☆ 3 ○ ○ ○ ○ ○ ○ 4 ● ● ● ● ● ● 5       ☆    こんな説明で分かるでしょうか?ご指南よろしくお願いします。 m(_ _)m

  • 条件にあてはまる場合、行挿入+値を移動させるマクロ

    Excel2003、WindowsXPを使用しています。 説明が分かり難いところがあるかもしれませんが、よろしくお願いいたします。 1.C列に値が入っていた場合、下に行を挿入。 2.挿入した行のB列に、C列に入っていた値を移動。 3.D列に値が入っていた場合、さらにその下に行を挿入。 4.挿入した行のB列に、D列に入っていた値を移動。 5.E列に値が入っていた場合、さらにその下に行を挿入。 6.挿入した行のB列に、E列に入っていた値を移動。 というように、C-E列に値が入っていた場合、下に行を挿入し、 挿入行にその値を移動させるマクロを教えてください。 (実行前)    A列     B列  C列  D列  E列   F列 ああああ  AAA  BBB  CCC  DDD  12222 うううう    EEE                   544 くくく     FFF  GGG  VVV        8 すす     TTT   BBB            4300 (実行後)  A列     B列   C列 ああああ  AAA   12222 ああああ  BBB   12222 ああああ  CCC   12222 ああああ  DDD   12222 うううう    EEE    544 くくく     FFF    8 くくく     GGG   8 くくく     VVV    8 すす     TTT    4300 すす     BBB   4300 上記実行後のように、マクロで出来たら…と思っています。 どうぞよろしくお願いいたします。

専門家に質問してみよう