プロが教える店舗&オフィスのセキュリティ対策術

VBA初心者です。自分なりに本やネットで調べたのですが、
答えが見つからなかったので質問させていただきます。

フォーム内にある1つのテキストボックスに5桁の数値を入力し、
ボタンを押すことで、入力した数値をソートさせ、シート(A1)に追加入力させたい。

テキストボックス→(数値入力)→ボタンを押す→(ソート)→シート[A1]に入力
テキストボックス→91375→ボタンを押す→13579→シート[A1]=13579

自分の考えでは、入力された5桁の数値を1桁ずつ配列に格納出来れば
ソートが可能だと思うのですが、方法が分かりません。
またその場合、ソート後に1桁ずつ別々に格納した数値を
ソートさせた5桁の数値にする場合はどのようにしたら良いのでしょうか?

また、この考え方以外にも何か方法がありましたらご教授ください

A 回答 (3件)

こんばんは。



あまり難しく考える必要はないと思います。ワークシート関数には、並べ替える関数がありますから、以下のようにSmall()関数ですればよいと思います。逆なら、Large() です。配列を引数に取れますから、簡単に出来ます。

Private Sub CommandButton1_Click()
  Dim i As Integer
  Dim num As Variant
  Dim tmp As String
  Dim buf As Variant
  If IsNumeric(TextBox1.Text) Then
    tmp = TextBox1.Text
    ReDim num(Len(tmp) - 1)
    ReDim buf(Len(tmp) - 1)
    For i = 1 To Len(tmp)
      num(i - 1) = CDbl(Mid(tmp, i, 1))
    Next i
    For i = 1 To Len(tmp)
      buf(i - 1) = Application.WorksheetFunction.Small(num, i)
    Next
    Range("A1").Value = Join(buf, "")
  End If
End Sub
    • good
    • 0
この回答へのお礼

返信が送れてしまい申し訳ございません。お答えいただきありがとうございます。
今回、課題でこの様な事を行っているのですが、ワークシートを利用すればソートが可能なのですね
参考にさせていただきます。ありがとうございます

お礼日時:2008/04/24 00:49

1単位の数字桁をソートするなんて珍しいニーズと思う。

普通は数個以上の数値(群)があって、それら相互で小ー>大などの順に並べるのですが。
初歩的なソートのアルゴリズム(下記はバブルソート)を使って1桁ずつの数字のソートをするほか無いでしょう。普通はやりやすいため、各桁を配列に入れます。
桁数が10数桁というありがたい制約のおかげで、凝ったアルゴリズムは不要でしょう。
Sub test01()
Dim y(13) '桁数上限
x = 91375 '数値 テスト用
x = 9311752 '数値
x = 88312952 '数値
'--各桁を配列に
For i = 1 To Len(x)
y(i) = Mid(x, i, 1) * 1 '配列に
Next i
'--確認
'For i = 1 To Len(x)
'MsgBox y(i)
'Next i
'---ソート
a = 1 'テスト用
Cells.Clear 'テスト用
Ends = Len(x)
i = 1
Do Until i >= Ends
j = i + 1
Do Until j > Ends
If y(i) > y(j) Then
w = y(i) 'Swap
y(i) = y(j)
y(j) = w
End If
j = j + 1
Loop
For c = 1 To Len(x) '確認用 セルに途中を表示
Cells(a, c) = y(c)
Next c
a = a + 1
i = i + 1
Loop
'--確認用
For c = 1 To 5
Cells(a, c) = y(c)
Next c
a = a + 1
'---数値に戻す
n = 0
For K = 1 To Len(x)
n = n + y(K) * 10 ^ (Len(x) - K)
Next K
Cells(a, 1) = n
End Sub
    • good
    • 0
この回答へのお礼

返信が送れてしまい申し訳ございません。お答えいただきありがとうございます。
課題でこのようなものを作成していたのですが、ようやく理解できました。
また現在、ソートプログラムを勉強中でしたので、そちらも参考にさせていただきます。
ありがとうございます

お礼日時:2008/04/24 01:02

ANo.1さんと同様に、ソートは他人(excel)に任せる方法です。


作業シートを使って、[データ][並べ替え]と同様の事をしてます。
Private Sub CommandButton1_Click()
Dim ws As Worksheet
Dim str As String
Dim i As Integer
Set ws = Sheets("Sheet2") '適当な作業シートを指定してください
'作業シートクリア
ws.Cells.Clear
'テキストボックスの文字を作業シートのA列へ1文字づつ書き込む
For i = 1 To Len(TextBox1.Text)
ws.Cells(i, 1) = Mid(TextBox1.Text, i, 1)
Next
'A列を並べ替え
ws.Columns("A:A").Sort Key1:=ws.Range("A1"), Header:=xlNo
'作業シートのA列をまとめてActiveSheetのA1へ
str = ""
For i = 1 To ws.UsedRange.Rows.Count
str = str & ws.Cells(i, 1)
Next
Range("A1") = str
End Sub

.NET Frameworkに任せる方法です
Private Sub CommandButton1_Click()
Dim d As Object
Set d = CreateObject("System.Collections.ArrayList") '.NET Frameworkへの参照
'Dim d As New ArrayList '参照設定:Common Language Runtime Libraryにした場合、上記2行と同じ意味
Dim str As String
Dim i As Integer
'テキストボックスの文字を1文字づつArrayListへ
For i = 1 To Len(TextBox1.Text)
d.Add Mid(TextBox1.Text, i, 1)
Next
'並べ替え
d.Sort
'ArrayListのデータをまとめてActiveSheetのA1へ
str = ""
For i = 0 To d.Count - 1
str = str & d(i)
Next
Range("A1") = str
'後始末
Set d = Nothing
End Sub
    • good
    • 0
この回答へのお礼

返信が送れてしまい申し訳ございません。お答えいただきありがとうございます。
勉強中の身ですがNET Frameworkに任せるやり方もあるのですね
まだ使いこなすには時間がかかりそうですが、こちらも参考にさせていただきます。
ありがとうございます

お礼日時:2008/04/24 00:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!