• ベストアンサー

Excel VBA テキストボックス内の数値をソートさせるのには?

VBA初心者です。自分なりに本やネットで調べたのですが、 答えが見つからなかったので質問させていただきます。 フォーム内にある1つのテキストボックスに5桁の数値を入力し、 ボタンを押すことで、入力した数値をソートさせ、シート(A1)に追加入力させたい。 テキストボックス→(数値入力)→ボタンを押す→(ソート)→シート[A1]に入力 テキストボックス→91375→ボタンを押す→13579→シート[A1]=13579 自分の考えでは、入力された5桁の数値を1桁ずつ配列に格納出来れば ソートが可能だと思うのですが、方法が分かりません。 またその場合、ソート後に1桁ずつ別々に格納した数値を ソートさせた5桁の数値にする場合はどのようにしたら良いのでしょうか? また、この考え方以外にも何か方法がありましたらご教授ください

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 あまり難しく考える必要はないと思います。ワークシート関数には、並べ替える関数がありますから、以下のように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

junta3618
質問者

お礼

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

その他の回答 (2)

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

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

junta3618
質問者

お礼

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

回答No.2

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

junta3618
質問者

お礼

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

関連するQ&A

  • テキストボックスをグループ化するVBA

    エクセル上に並んだテキストボックスを、ボタンを押すことで、任意のテキストボックスをグループ化させたい。また、別のボタンでグループ化の解除が出来るようなVBAをおしえてください。 テキストボックスは、Sheet1~3まであって、ボタンもそれぞれに配置してあり、 どこのSheetのボタンを押しても、各シート、それぞれに任意の設定したテキストボックスがグループ化できるようにしたい ※各シート、グループ化するテキストボックスはおなじでなない・・・ よろしくお願いします。

  • VBAテキストボックスについて

    こんばんは。 エクセルVBAのテキストボックスの使用方法で行き詰っています。 配列内のデータをテキストボックスへ表示してあります。 テキストボックスを、ダブルクリックして内容を変更し、 変更したデータを配列へ格納する仕組みにしようとしています。 問題は、ダブルクリックすると、テキストボックス内のデータが消えてしまう事です。変更せず他のテキストボックスをクリックすると、データが消えたままになってしまいます。 データは表示したままで、必要な箇所のみ変更する。 ダブルクリック後何もせず、他のテキストボックスをクリックしても 、データは残る仕組みにしたいのですが、可能でしょうか? ご教授お願いいたします。 ※仕事の関係でお礼が遅くなりましたら申し訳ございません。

  • エクセルVBA チェックBoxとテキストBox

    VBA勉強中の者です。エクセル2010使用 前回も同じような件で質問したのですが、入力フォームを作成中。 数量表の入力ホームなので、出来るだけキーボードのテンキーでの操作が出来るようにと考えております。 チェックボックスのon/off でテキストボックスの入力の可否を出来るようにしています。これが7組あるとします。(チェックボックス1に対してテキストボックス1に数値が入力出来るように) 質問(1) チェックが入っていれば、呼応したテキストボックスへエンターキーで移動。 チェックを入っていなければ、エンターキーで次のチェックボックスへ移動するようにしたいのです。 質問(2) シートへの転記の際は、7組の間に『、』カンマを入れたいのですが、当然チェックのないものは必要ないので、カンマが要らない事になります。初心者の考えでは単純に条件式をその通り数書くことになるのかと思うとゾッとしますが、少しでも条件式を減らす方法があれば、ご教授願います。 分かり難くて、すみません。

  • エクセルVBA テキストボックスへのセットフォーカスについて

    エクセルVBAでユーザーフォーム内に配置されたテキストボックス への数値の入力時に、指定範囲内になければメッセージボックスで 規格外であることを警告し、その規格外が入力されたテキストボックス を強制的に空欄にし、次のテキストボックスにフォーカスを移動させずに、入力間違いのテキストボックスにフォーカスを戻したいのですが どうすればよいのでしょうか? 自分で考えた構文です。 Private Sub TextBox1_AfterUpdate() Dim A As Single A = TextBox1.Text If A < 1.99 Or A > 3.00 Then MsgBox "規格外!!"     TextBox1.Text = "" TextBox1.SetFoucus End If Exit Sub End Sub これですと、次のテキストボックスにフォーカスが移動してしまいます。 次のテキストボックスにフォーカスを移動させずに、規格内の値が 入力されるまでフォーカスを移動させない方法を教えて下さい。 お願い致します。

  • EXCEL VBA のテキストボックスで

    EXCEL VBAのテキストボックスでボックス内にテキストを入力 しなければカーソルの移動が出来ないようにできますか? 宜しくお願いします。

  • テキストボックスの大きさを、基準の大きさに戻す(エクセルVBA)

    図形のテキストボックスの大きさを取得して、その値を各テキストボックスの基準の大きさとして記録しておき、テキストボックスの大きさをマウスでドラッグして大きさを変えた後、ボタン1つでもとの大きさに戻したいのですが、どのようにすればよいでしょうか? 1)図形のテキストボックス、大きさの取得方法は? 2)基準の大きさと記録する方法は? 3)記録された大きさに戻すには?(シート上に配置されたボタンで実行) ※ 複数のシートに複数のテキストボックスがあります。 ※ シート毎にセットします。(シート毎にテキストボックスのサイズが違う為) ※ 現在、各テキストボックスには、基準位置がセットしてあり、ボタンで基準位置へ戻る仕組みが組まれています。(これをそのままにして・・・) ※ エクセル97と2000で使えるようにします。(作成は97) 宜しくお願い致します。

  • エクセルVBAでテキストボックス等選択する。

    こんばんわ! エクセルのVBAのユーザーフォームについての質問です。 オプションボタン1・2・3とあって 1を選択したらテキストボックス1が選択される(そのまま入力できる状態になる) 2を選択したらテキストボックス2が選択される(そのまま入力できる状態になる) 3を選択したらテキストボックス3が選択される(そのまま入力できる状態になる) ということをしたいのですが、どのようにすればよいでしょうか? アドバイスの程よろしくお願いいたします。

  • VBAでの「0011」などの頭に0がつく数値の扱い

    質問です。 VBA初心者です。 現在、エクセルのVBAで会社で使用するツールを自作しようとしています。 サンプルなどで勉強しつつ、フォームのテキストボックスに入力した数値をシートに転記したのですが、0011など頭に0のつく数値だと、シート上では11となってしまいます。 これを0011と、そのままシートに転記したいのですが、どなたか良い方法をご教授願えませんでしょうか? 宜しくお願いします。

  • 数値の大きい順にソート

    数値の大きい順にソートするにはどのようにしたらよろしいでしょうか? 例えば、 @A = ("10","5","18","6","9"); という配列があるとします。 これを @B = sort @A; とすると、 10,18,5,6,9 となってしまいます。 これを 18,10,9,6,5 のように数値の大きい順に配列Bに代入したいのですが、どうしたらよいでしょうか?よろしくお願いします。

    • ベストアンサー
    • Perl
  • テキストボックス

    たびたびの質問すみません。 エクセルVBAでテキストボックス等(条件)に入力すると、他のテキストボックスにエクセルシートから照合して表示させる方法で、条件のテキストボックス等を2つ以上にすることは可能でしょうか、あればやり方を教えてください。

専門家に質問してみよう