• ベストアンサー

excelVBA 配列ソート方法

こんにちは、 下記のコードを使ってsetint配列の値を 昇順にソートしようとしているのですが、 最小値が最後に来てしまいます。 何か昇順にソートする方法はないでしょうか。 '昇順並び変え For run = 1 To UBound(setint) For run1 = UBound(setint) To 1 Step -1 If setint(run) >= setint(run1) Then swap = setint(run) setint(run) = setint(run1) setint(run1) = swap End If Next Next For run = 1 To UBound(setint) Debug.Print setint(run) Next

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

  • ベストアンサー
回答No.1

このコードですと、runとrun1が途中で入れ替わってしまいます(ステップインで確認すると分かると思います)。 For run = 1 To UBound(setint) - 1 For run1 = UBound(setint) To run + 1 Step -1 とすればよいかと思います。

その他の回答 (3)

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.4

1. runはだめだ。run0にした。 2. 始の配列の添字がいくつからかわからないが、普通は0からだからそうする。 3. 2番目のfor文で、自分と比較する必要はないから、比較しないようにする。これでひととおりできるが、 4. 2番目のfor文を↓ For run1 = run0 To UBound(setint) とするほうがすなおじゃないかと思うが。 For run0 = 0 To UBound(setint) For run1 = UBound(setint) To run0+1 Step -1 If setint(run0) >= setint(run1) Then swap = setint(run0) setint(run0) = setint(run1) setint(run1) = swap End If Next Next For run0 = 0 To UBound(setint) Debug.Print setint(run0) Next

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

下記でテストしたらうまく行くようです。 ご参考に。 Runのようなシステムでも使いそうな名称は避けた方が良いのでは。 「連」の意味でつけた? For Run1 = UBound(d) To j + 1 Step -1 のように1つ手前で比較をストップすべきか。 =の場合はSWAPしないほうが良いのでは。 ーーーー テストデータとして、エクセルのシートのA1:A20までに整数値を入れた。 Option Base 1 Sub test01() Dim d(20) For i = 1 To 20 d(i) = Cells(i, "A") Next i '---- 'MsgBox UBound(d) For j = 1 To UBound(d) For Run1 = UBound(d) To j + 1 Step -1 If d(j) > d(Run1) Then swap = d(j) d(j) = d(Run1) d(Run1) = swap End If Next Run1 Next j '----- For j = 1 To UBound(d) Cells(j, "B") = d(j) Next End Sub

  • keirika
  • ベストアンサー率42% (279/658)
回答No.2

For run = 0 To UBound(setint) - 1 For run1 = UBound(setint) - 1 To 1 Step -1 If setint(run1 - 1) > setint(run1) Then swap = setint(run1 - 1) setint(run1 - 1) = setint(run1) setint(run1) = swap End If Next Next For run = 0 To UBound(setint) - 1 Debug.Print setint(run) Next でどうでしょうか

関連するQ&A