
No.3ベストアンサー
- 回答日時:
すいません。
コーディングがまずいですね。
最下のVBAコードを使用してください。
testプロシージャの
Debug.Print "パターン(1)"
myAry = Array("2", "1", "本屋", "9", "赤", "33")
Debug.Print "パターン(2)"
myAry = Array("2", "1", "33", "9", "赤", "本屋")
Debug.Print "パターン(3)"
myAry = Array("2", "1", "33", "9", "赤", "本屋")
として結果(イミディウィンド出力)は以下のようになります
パターン(1)
1
2
9
33
本屋
赤
パターン(2)
1
2
9
33
本屋
赤
パターン(3)
1
2
9
33
本屋
赤
■VBAコード
Sub test()
Dim myAry() As Variant
Debug.Print "パターン(1)"
myAry = Array("2", "1", "本屋", "9", "赤", "33")
GoSub srt
Debug.Print "パターン(2)"
myAry = Array("2", "1", "33", "9", "赤", "本屋")
GoSub srt
Debug.Print "パターン(3)"
myAry = Array("2", "1", "33", "9", "赤", "本屋")
GoSub srt
Exit Sub
srt:
Call QuickSort1(myAry, LBound(myAry), UBound(myAry))
For i = 0 To UBound(myAry)
Debug.Print myAry(i)
Next i
Return
End Sub
Sub QuickSort1(ByRef argAry() As Variant, ByVal lngMin As Long, ByVal lngMax As Long)
Dim i As Long
Dim j As Long
Dim vBase As Variant
Dim vSwap As Variant
Dim tmp(2) As Variant
vBase = argAry(Int((lngMin + lngMax) / 2))
i = lngMin
j = lngMax
Do
'比較
Do
'型変換
If IsNumeric(argAry(i)) Then tmp(0) = CDbl(argAry(i)) Else tmp(0) = CStr(argAry(i))
If IsNumeric(vBase) Then tmp(2) = CDbl(vBase) Else tmp(2) = CStr(vBase)
'判定
If tmp(0) >= tmp(2) Then Exit Do
i = i + 1
Loop
Do
'型変換
If IsNumeric(argAry(j)) Then tmp(1) = CDbl(argAry(j)) Else tmp(1) = CStr(argAry(j))
If IsNumeric(vBase) Then tmp(2) = CDbl(vBase) Else tmp(2) = CStr(vBase)
'判定
If tmp(1) <= tmp(2) Then Exit Do
j = j - 1
Loop
If i >= j Then Exit Do
vSwap = argAry(i)
argAry(i) = argAry(j)
argAry(j) = vSwap
i = i + 1
j = j - 1
Loop
If (lngMin < i - 1) Then
Call QuickSort1(argAry, lngMin, i - 1)
End If
If (lngMax > j + 1) Then
Call QuickSort1(argAry, j + 1, lngMax)
End If
End Sub
No.2
- 回答日時:
表示をオフにして新規シートを作成してセルに書き出し、
エクセルの並び替え機能をVBAで並び替えてから配列へ戻してシートを削除・・・・
が高速でシンプルにすみますが。
コード内で処理を行いたいのであれば配列ののクイックソートをどうぞ。
「test」を実行してください。
以下のサイトのクイックソートをベースにしています。
http://excel-ubara.com/excelvba5/EXCELVBA229.html
上記サイトのものですと文字列比較ですので1,2,33,9・・・となりますが、
数値と判定出来るものは数値として比較するようにすれば以下のような結果になります。
1
2
9
33
本屋
赤
1次元配列にしか対応していませんので、
2次元配列の場合は上記サイトを参考に同様に変更してみてください。
■VBAコード
Sub test()
Dim myAry() As Variant
myAry = Array("2", "1", "本屋", "9", "赤", "33")
Call QuickSort1(myAry, LBound(myAry), UBound(myAry))
For i = 0 To UBound(myAry)
Debug.Print myAry(i)
Next i
End Sub
Sub QuickSort1(ByRef argAry() As Variant, ByVal lngMin As Long, ByVal lngMax As Long)
Dim i As Long
Dim j As Long
Dim vBase As Variant
Dim vSwap As Variant
vBase = argAry(Int((lngMin + lngMax) / 2))
'数値なら数値型へ変更
If IsNumeric(vBase) Then vBase = CDbl(vBase)
i = lngMin
j = lngMax
Do
'数値なら数値で比較
If IsNumeric(vBase) Then
Do While CDbl(argAry(i)) < vBase
i = i + 1
Loop
Do While CDbl(argAry(j)) > vBase
j = j - 1
Loop
'文字で比較
Else
Do While argAry(i) < vBase
i = i + 1
Loop
Do While argAry(j) > vBase
j = j - 1
Loop
End If
If i >= j Then Exit Do
vSwap = argAry(i)
argAry(i) = argAry(j)
argAry(j) = vSwap
i = i + 1
j = j - 1
Loop
If (lngMin < i - 1) Then
Call QuickSort1(argAry, lngMin, i - 1)
End If
If (lngMax > j + 1) Then
Call QuickSort1(argAry, j + 1, lngMax)
End If
End Sub
この回答への補足
回答ありがとうございます。
myAry = Array("2", "1", "33", "9", "赤", "本屋")
このように、本屋と33を入れ替えて実行しますと、次のようなエラーが出てしまいました。
'数値なら数値で比較
If IsNumeric(vBase) Then
Do While CDbl(argAry(i)) < vBase
i = i + 1
Loop
Do While CDbl(argAry(j)) > vBase ←エラー 型が一致しません
j = j - 1
Loop
myAry = Array("2", "1", "本屋", "9", "赤", "33")
また、このように"33"を全角"33"にすると、33が数字の小さい順として並びませんでした。
1
2
9
本屋
赤
33
改善できるようでしたら、よろしくお願いいたします。
数字と文字の判定方法および数字を数値に変える方法が分かりましたので、大変参考になりました。
No.1
- 回答日時:
こんにちは!
一例です。
データはA1セルからあるとします。
Sub 並び替え()
Dim lastRow As Long
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
Application.ScreenUpdating = False
Range("A:A").Insert
With Range(Cells(1, "A"), Cells(lastRow, "A"))
.Formula = "=ASC(B1)"
.Value = .Value
End With
Range("A1").CurrentRegion.Sort key1:=Range("A1"), order1:=xlAscending, Header:=xlNo
Range("A:A").Delete
Application.ScreenUpdating = True
End Sub
こんな感じではどうでしょうか?m(_ _)m
この回答への補足
回答ありがとうございます。
質問が悪く申し訳ないのですが、
シート上で並べ替えるのではなく、
配列に格納されたデータを並べ替えたかったのです。
どうもすみません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
VBA ソートすると、1、11、2,3になって・・
Excel(エクセル)
-
エクセルで文字が混じった数字を並べ替えしたいのですが
Excel(エクセル)
-
Excelで文字+数字のデータの並び替えについて
Excel(エクセル)
-
-
4
数値に見えるものはすべて数値として並べ替えを行う
Excel(エクセル)
-
5
エクセルのソートで、数字よりもアルファベットを優先したい
Excel(エクセル)
-
6
Excel VBAにてソートが上手くいかない
その他(Microsoft Office)
-
7
桁数が混在する並び替えの方法
PowerPoint(パワーポイント)
-
8
アルファベットを含む数をエクセルでうまく並べ替えをしたい。
Excel(エクセル)
-
9
Excel2017 フィルタ昇順並びがA1、A10、A11、A2、A3となってしまう。
Excel(エクセル)
-
10
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
11
もしセルが#N/A"なら~をする・・・には?"
Excel(エクセル)
-
12
VBAで文字列を数値に変換したい
Excel(エクセル)
-
13
複数の条件に合う行番号を取得するには
その他(Microsoft Office)
-
14
エクセルVBA 配列からセルに「関数式」を一気代入したい
Visual Basic(VBA)
-
15
Access フォームのテキストボックスに半角英字のみで入力する設定は
Access(アクセス)
-
16
VBAを一度起動するとずっと出てきます。
Access(アクセス)
-
17
EXCEL VBAで、セルの文字列の前後に文字を入力する方法は?
その他(Microsoft Office)
-
18
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
19
「Columns(A:C")」の列文字を数字にして表記したい"
Excel(エクセル)
-
20
ADODB.Streamを使用してUTF-8を出力
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの関数について
-
【マクロ】変数に入れるコード...
-
エクセルのリストについて
-
Office2021のエクセルで米国株...
-
【マクロ】実行時エラー '424':...
-
【マクロ】数式を入力したい。...
-
【マクロ】元データと同じお客...
-
【マクロ】【相談】Excelブック...
-
【マクロ】左のブックと右のブ...
-
vba テキストボックスとリフト...
-
エクセルの複雑なシフト表から...
-
他のシートの検索
-
【画像あり】オートフィルター...
-
エクセルのVBAで集計をしたい
-
【マクロ】【配列】3つのシー...
-
【関数】3つのセルの中で最新...
-
【マクロ】excelファイルを開く...
-
エクセルシートの見出しの文字...
-
Dir関数のDo Whileステートメン...
-
LibreOffice Clalc(またはエク...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報