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も見ています
-
好きなおでんの具材ドラフト会議しましょう
肌寒くなってきて、温かい食べ物がおいしい季節になってきましたね。 みなさんはおでんの具材でひとつ選ぶなら何にしますか? 1番好きなおでんの具材を教えてください。
-
家・車以外で、人生で一番奮発した買い物
どんなものにお金をかけるかは人それぞれの価値観ですが、 誰もが一度は清水の舞台から飛び降りる覚悟で、ちょっと贅沢な買い物をしたことがあるはず。
-
「覚え間違い」を教えてください!
私はかなり長いこと「大団円」ということばを、たくさんの団員が祝ってくれるイメージで「大円団」だと間違えて覚えていました。
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
【お題】 ・このサンタクロースは偽物だと気付いた理由とは?
-
エクセルで文字が混じった数字を並べ替えしたいのですが
Excel(エクセル)
-
VBA ソートすると、1、11、2,3になって・・
Excel(エクセル)
-
数値に見えるものはすべて数値として並べ替えを行う
Excel(エクセル)
-
-
4
Excelで文字+数字のデータの並び替えについて
Excel(エクセル)
-
5
エクセルのソートで、数字よりもアルファベットを優先したい
Excel(エクセル)
-
6
Excel VBAにてソートが上手くいかない
その他(Microsoft Office)
-
7
アルファベットを含む数をエクセルでうまく並べ替えをしたい。
Excel(エクセル)
-
8
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
9
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
10
B列の最終行までA列をオートフィル
Visual Basic(VBA)
-
11
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
12
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
13
VBAで文字列を数値に変換したい
Excel(エクセル)
-
14
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
15
フォントの大きさ
Visual Basic(VBA)
-
16
EXCELのVBAでシートコピーをしたとき元のマクロを削除するには?
Excel(エクセル)
-
17
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
18
桁数が混在する並び替えの方法
PowerPoint(パワーポイント)
-
19
メッセージボックスに表示する文字を大きくしたい
Excel(エクセル)
-
20
複数の条件に合う行番号を取得するには
その他(Microsoft Office)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
excelVBAについて。
-
excelVBAについて。
-
excelVBAについて。
-
エクセルのデータ整理の方法
-
excelVBAについて。
-
excelVBAについて。
-
Excelの警告について
-
excelVBAについて。
-
エクセルで図形を含む複数のブ...
-
評価のエクセルを作りたいです。
-
excelVBAについて。
-
excelVBAについて。
-
excelVBAについて。
-
excelVBAについて。
-
ieを使わずにサーバーとのやり...
-
エクセルVBA 同じ品名を色分けする
-
エクセルでVLOOKUPの入ったセル...
-
Excelの数式について教えてくだ...
-
条件付き書式に設定する関数を...
-
エクセルで、数字の下4桁の0を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ブックカバーまで有料化!紀伊...
-
中学生なのですが、学校の帰り...
-
あなたが好きな本屋さんを教え...
-
便意・・本屋だけじゃなく
-
VBAにて 文字と数字が混在して...
-
夏休みの宿題
-
仕事後、あなたはまっすぐ家に...
-
エロ本やエロいDVDって、どこで...
-
本屋でのクレジットカード利用...
-
書店員の方に質問です。入店の...
-
TomoCardって・・・
-
中学生がプリキュア好きなのは...
-
高1女子です。BL本を買いたいの...
-
アルバイトについて
-
私を1から9の数字で例えてみて...
-
本屋での立ち読みはどこまで許...
-
書店にある椅子には座って読ん...
-
バイト 暇な時間の過ごし方。
-
本屋って儲かりますか?
-
クオカードで本は買えますか?
おすすめ情報