• ベストアンサー

ExcelでA1=1973を小さい数順に並べ替える方法

Excelワークシート上でA1=1973と入力されているとして この数値を小さい数順にならべかえて(ナンバース4で言う所の"BOX"にするという事です。)、B1=1379と表すマクロ文を教えてくれませんか?

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

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

http://okwave.jp/qa3963558.html で似たような質問に答えているよ。

pure_power
質問者

お礼

貴重な情報ありがとうございます。問題解決できそうです。

その他の回答 (3)

回答No.4

かなり限定的なロジックになりますが、下のようなやり方は どうでしょう? ある意味バケットソート? (現在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の書式は文字列であっても そうでなくても、それなりに動くと思います。

pure_power
質問者

お礼

ありがとございました。

回答No.3

こんなのでどうでしょう。 これは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関数を利用しました。

pure_power
質問者

お礼

ありがとうございました。

noname#140971
noname#140971
回答No.2

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

pure_power
質問者

お礼

こんな方法もあるのですね。これなら何とか理解できそうです。 ありがとうございました。