
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) EXCELでの文字・数字入力の基本について教えてください。 2 2023/05/29 23:17
- Excel(エクセル) 結合セルのソートについて 5 2022/04/22 11:57
- Visual Basic(VBA) エクセルVBAについて 2 2023/01/31 16:21
- Excel(エクセル) 関数EXACT(文字列,文字列)とexcelVBA 3 2022/04/14 15:07
- Excel(エクセル) セルに入力した小文字アルファベット、数字を大文字表示させるには? 3 2022/07/13 10:01
- Visual Basic(VBA) VBA 「,」・空白・カタカナ等の複数条件のマクロ 2 2023/08/23 11:57
- Visual Basic(VBA) 列の最終行までのセルと1つ隣のセルの合計を別の列に表示 2 2022/07/12 19:50
- その他(IT・Webサービス) パスワードの組み合わせについて 2 2023/07/05 00:01
- Excel(エクセル) エクセルで文字列と数字が混在する列に書式設定したい。 3 2022/12/19 09:11
- Excel(エクセル) エクセルのマイナス表示 3 2022/03/28 16:35
このQ&Aを見た人はこんなQ&Aも見ています
-
VBA ソートすると、1、11、2,3になって・・
Excel(エクセル)
-
エクセルで文字が混じった数字を並べ替えしたいのですが
Excel(エクセル)
-
Excelで文字+数字のデータの並び替えについて
Excel(エクセル)
-
-
4
数値に見えるものはすべて数値として並べ替えを行う
Excel(エクセル)
-
5
エクセルのソートで、数字よりもアルファベットを優先したい
Excel(エクセル)
-
6
Excel VBAにてソートが上手くいかない
その他(Microsoft Office)
-
7
アルファベットを含む数をエクセルでうまく並べ替えをしたい。
Excel(エクセル)
-
8
Excel2017 フィルタ昇順並びがA1、A10、A11、A2、A3となってしまう。
Excel(エクセル)
-
9
桁数が混在する並び替えの方法
PowerPoint(パワーポイント)
-
10
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
11
もしセルが#N/A"なら~をする・・・には?"
Excel(エクセル)
-
12
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
13
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
14
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
15
Excelで隠れてしまった図やテキストボックスを探す方法
Excel(エクセル)
-
16
VBAで文字列を数値に変換したい
Excel(エクセル)
-
17
エクセルVBA 配列からセルに「関数式」を一気代入したい
Visual Basic(VBA)
-
18
複数の条件に合う行番号を取得するには
その他(Microsoft Office)
-
19
excel VBA 2つのシートの特定の列を比較して同じ値のセルがあったらその行を上書きしたい
Excel(エクセル)
-
20
B列の最終行までA列をオートフィル
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
あなたが好きな本屋さんを教え...
-
中学生なのですが、学校の帰り...
-
エロ本やエロいDVDって、どこで...
-
便意・・本屋だけじゃなく
-
VBAにて 文字と数字が混在して...
-
TomoCardって・・・
-
仕事後、あなたはまっすぐ家に...
-
ブックカバーまで有料化!紀伊...
-
3年B組金八先生6
-
書店員の方に質問です。入店の...
-
高1女子です。BL本を買いたいの...
-
本屋でのクレジットカード利用...
-
書店にある椅子には座って読ん...
-
クオカードで本は買えますか?
-
本屋とかで毎回問い合わせるけ...
-
古本を買ったら千円札が挟まっ...
-
今時、本を本屋で買うっておか...
-
本屋での立ち読みはどこまで許...
-
バイト 暇な時間の過ごし方。
-
中学生がプリキュア好きなのは...
おすすめ情報