- ベストアンサー
ExcelでA1=1973を小さい数順に並べ替える方法
Excelワークシート上でA1=1973と入力されているとして この数値を小さい数順にならべかえて(ナンバース4で言う所の"BOX"にするという事です。)、B1=1379と表すマクロ文を教えてくれませんか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
http://okwave.jp/qa3963558.html で似たような質問に答えているよ。
その他の回答 (3)
- K-Sogacchi
- ベストアンサー率53% (50/93)
かなり限定的なロジックになりますが、下のようなやり方は どうでしょう? ある意味バケットソート? (現在Excelが無い環境で書いてるので、多少ミスがあるかもしれません。 ご了承ください。その場合はやり方の雰囲気だけ掴むという事で…) Sub Macro1() Dim svA1 as String 'A1文字列保存用 Dim svB1 as String 'B1文字列編集用 Dim numCnt(0 to 9) as Integer '数字の数 保存用 Dim i as Integer 'カウンタ Dim j as Integer '数値テンポラリ、カウンタ '配列クリア Erase numCnt '1文字ずつ取得し、その数字が使われている回数を配列に足していく '(例えば 3が5つあれば、numCnt(3)=5になるようにする) svA1 = CStr(Range("A1").Value) svB1 = "" 'B1用文字列の初期化 For i = 1 To Len(svA1) If IsNumeric(Mid(svA1, i, 1)) Then '数値でなければスルー j = CInt(Mid(svA1, i, 1)) numCnt(j) = numCnt(j) + 1 End If Next '小さい数字から、文字列を連結して作成 For i = 0 To 9 '0から9まで For j = 1 To numCnt(i) '各数字の数だけループ、ゼロの場合はスルーされる svB1 = svB1 & CStr(i) '数字を文字列に連結 Next Next '↓文字列だとマズい場合は数値に変換して代入すること。 '但しその場合、先頭にゼロがあったら消えます。あと桁あふれにも注意 Range("B1") = svB1 End Sub 半角数値しか処理対象として受け付けませんが、A1の書式は文字列であっても そうでなくても、それなりに動くと思います。
お礼
ありがとございました。
- 米沢 栄蔵(@YON56)
- ベストアンサー率36% (37/102)
こんなのでどうでしょう。 これはA列を非表示にし、 セルB1にデータを入力し、セルC1にデータを出力させるものです。 セルB1のデータの型は、英数字OKです。 Sub SSS() Dim A, B, C, D, E Dim AA A = Range("B1").Value '入力データ B = Len(A) For C = 1 To B Cells(C, 1) = Asc(Mid(A, C, 1)) Next C AA = "" For C = 1 To B D = Application.WorksheetFunction.Min(Range(Cells(1, 1), Cells(B, 1))) E = Application.WorksheetFunction.Match(D, Range(Cells(1, 1), Cells(B, 1)), 0) AA = AA & Chr(Cells(E, 1).Value) Cells(E, 1) = "" Next C Range("C1") = AA '出力データ End Sub Worksheet関数(ワークシート)を使わない方法もあると思いますが、 マクロだけで最小値(最大値)を定義する式が面倒そうなので、 Worksheet関数を利用しました。
お礼
ありがとうございました。
A1____B1 1973__1379 B1=Shojun(A1) いわゆるバブルソートで並び替えたらいいのでは・・・。 Public Function Shojun(ByVal Suji As String) As Long Dim I As Integer Dim J As Integer Dim L As Integer Dim M As Integer Dim T As String Suji = Trim(Suji) L = Len(Suji) M = L - 1 For I = 1 To M For J = I + 1 To L If Mid(Suji, I, 1) > Mid(Suji, J, 1) Then T = Mid(Suji, I, 1) Mid(Suji, I, 1) = Mid(Suji, J, 1) Mid(Suji, J, 1) = T End If Next J Next I Shojun = CLng(Suji) End Function
お礼
こんな方法もあるのですね。これなら何とか理解できそうです。 ありがとうございました。
お礼
貴重な情報ありがとうございます。問題解決できそうです。