• ベストアンサー

文字列の並び替えについて教えて下さい

winXP Access 2000の環境ですが 文字列フィールドに 201-1  202-2 1011 235 と入っているとき 並び替えで 201-1 202-2 235 1011 ととう順番に並び替えしたのですが どの様にすればよいでしょうか ご指南ください

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

#1です。 > 1つのフィールドに > 201-1 > 202-2 > 235 > 1011  > > と並び替えたいという意味です。 これは、どう解釈すればよいのでしょうか。 1つの文字列を、複数のレコードに分割して並び替えるっていうことでしょうか。 それとも、1つのフィールドにあるもので並び替えるってことで良いのでしょうか。 後者だとすると、レコードセットを使うまでもないので、楽だと思います。 VBA (ユーザ定義関数)を使うことには変わりはありません。 大丈夫ですか。 #1と同様に、"-" の前後を数値として扱わないといけないと思うので、 数値化する部分はそのまま使います。 今度は、その数値化したものを文字列(固定長)にして比較するものを作ってあげます。 前回同様に、数字以外は "-" のみである前提とします。 固定長の文字列にする時に、6文字-6文字 となるようにしてみます。 以下を同様に標準モジュールに記述します。 Public Function NumOrder(vS As Variant) As String   Dim sAry() As String   Const SEP As String = "-"   NumOrder = ""   If (VarType(vS) <> vbString) Then Exit Function   If (Len(vS) = 0) Then Exit Function   sAry = Split(vS & SEP, SEP)   NumOrder = Format(CLng("0" & sAry(0)), "000000") & "-" _         & Format(CLng("0" & sAry(1)), "000000") End Function ? NumOrder("201-1") の結果は 000201-000001 ? NumOrder("50") の結果は 000050-000000 ? NumOrder("1011") の結果は 001011-000000 で、この関数の戻り値で並び替えをすれば良いと思います。 ※ それぞれ6文字で足りなければ、増やすなりすれば・・・ 「テーブルA」のフィールド「F1」がそのフィールドだったら、 SELECT * FROM テーブルA ORDER BY NumOrder([F1]); で、いけそうな気がします。 参考にする/しない等々、自己責任でお願いします。 ※ 上記では、文字列に展開しましたが、実数化する方法もあると思います。 例えば 202-2 を 202.2 に、235 を 235.0 に・・・とか

tom2011
質問者

お礼

有難う御座いました 表現できました ありがとう御座います

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

> 文字列フィールドに 201-1  202-2 1011 235 > と入っているとき これは1つの文字列になっているという事で良いでしょうか。 VBA は大丈夫でしょうか。 数字以外の文字は "-" だけの場合を考えてみました。 (スペースは区切りで・・・) 数字のままでは並び替えしにくいので、"-" の前後を数値に変換して並びかえします。 せっかく Access を使っているので、レコードセットを使って並びかえします。 (ソートが楽になります) ADO のレコードセットを使うので、 「Microfost ActiveX Data Objects X.Y Library」 を参照設定しておきます。(X.Y は数値で、動きを確認したのは 2.5 でした) 以下を標準モジュールに記述します。 (コピー、貼り付けでも) Public Function NumSort(sS As String) As String   Dim v As Variant   Dim sAry() As String   Dim sTmp As String   Const SEP As String = "-"   NumSort = ""   If (Len(sS) = 0) Then Exit Function   With New ADODB.Recordset     .Fields.Append "元", adVarChar, 255     .Fields.Append "項1", adInteger     .Fields.Append "項2", adInteger     .CursorLocation = adUseClient     .Open     For Each v In Split(sS, " ")       If (Len(v) > 0) Then         sAry = Split(v & SEP, SEP)         .AddNew         .Fields("元") = v         .Fields("項1") = CLng("0" & sAry(0))         .Fields("項2") = CLng("0" & sAry(1))         .Update       End If     Next     sTmp = ""     If (.RecordCount > 0) Then       .Sort = "項1, 項2"       While (Not .EOF)         sTmp = sTmp & " " & .Fields("元")         .MoveNext       Wend       sTmp = Mid(sTmp, 2)     End If     NumSort = sTmp     .Close   End With End Function 空白で区切った元の文字列用に「元」 "-" の前を数値にしたもの用に「項1」 "-" の後を数値にしたもの用に「項2」 のフィールに設定していきます。 レコードが出来上がったところで、"項1, 項2" の順でソートします。 ソート後の「元」を使って、文字列を作っていきます。 NumSort("201-1  202-2 1011 235") の結果は、 201-1 202-2 235 1011 NumSort("201-20 201-1  202-2 202-11 1011 235 20") の結果は、 20 201-1 201-20 202-2 202-11 235 1011 確認は、イミディエイトウィンドウで ? NumSort("201-1  202-2 1011 235") のように入力して、Enter します。 これで確認できたかなと思います。 で、この関数をVBAで使う/クエリから呼び出す・・・ 等々、記述していけばよいと思います。 ※ 関数名は適宜変更してください。 ※ 現状 "201-1" と、 "201-01" や "0201-001" は同じ数値になっています。 文字列長を新設して順を決めるとか、使いやすいようにしてください。 また、上記で扱えない桁数のものがあるとか・・・修正してください。 参考にする/しない等々、自己責任でお願いします。

tom2011
質問者

補足

ご指南有難う御座います 説明不足で吸いません 1つのフィールドに 201-1 202-2 235 1011  と並び替えたいという意味です。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • アクセス レポートの表示の並び替えについて

    Windows10 Office2019の環境です レポートの並び替えなのですが フィールドに―を含むデータがありましたので 文字列に設定しましたが 当然並び替えがうまくいきません 1-2 2 1-3 1-4  56 が 1-2 1-3 1-4 2 52 となるよう順番に並び替える方法はないでしょうか

  • 文字列の並び替え

    お世話になっております。 以下、ご指導いただければ幸いです。 カンマで区切られた以下のような文字列があります。 $txt = "佐藤,武田,斉藤,鈴木,内田"; この変数txt内にある文字列を、「武田」と「斉藤」を入れ替えたい(並び替え)と思うのですが、どのようにすれば宜しいでしょうか? (隣り合わせのデータのみの並び替えです) ※並び返したい命令?は、順番の番号にて取得出来る状態です。 (この例の場合で言ったら、「1と2」という感じです) 現在、 $txt_array = explode(",", $txt); などとして、一旦配列にして、for文で繰り返し処理を行いながら、武田と斉藤をそれぞれ別の変数に格納し・・・などと考えていますが、とても非効率のような気がするものの、他の策が見えて来ずに困っています。 以上、お恥ずかしい質問かと思いますが、アドバイスなど頂戴出来れば幸いです。 お忙しいなか恐縮ですが宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • 数値を文字列にして他の文字列と連結

    お世話になります。 accessで、 フィールド1の数値(オートナンバー)を文字列に変換して、固定の文字列と連結し、フィールド3に保存する方法をを教えていただきたいのですが。 よろしくお願いします。

  • アクセスのセル(列)の並び替え

    アクセスのセル(列)の並び替え エクセルでは、並び替えから名前や住所を簡単に並べ替え出来ますが、アクセス(MOのデータ(関係ないかもしれませんが))でのやり方が解りません 私は、パソコン素人です 解る方教えて下さい 宜しくお願いします。

  • vba 文字列の並び替え

    こんにちは! VBAにて以下の処理をしたいのですがどうやっても上手くいかず悩んでます。 A列には文字列B列には数字が入っています。 B列を昇順で並び替えし且つA列に指定した文字列がある場合先頭にデータを昇順で持ってくる。 ※B列で並び替えたあとにif構文で切り取り→挿入を試みたのですがどうしても昇順にならず 泣 どうかご教授下さい(ToT) 宜しくお願い致します。 A B EEEE 1 EEEE 2 RRRR 3 RRRR 4 FFFF 5 DDDD 6 上記の状態からRRRRを先頭に持っていき昇順で並び替えする。

  • CONCATENATE関数で作った文字の並び替え

    CONCATENATE関数で作った文字の並び替えができません数字でも文字列でもいいので並び替えがしたいので教えてください。

  • 5文字以上の文字列だけを、他の場所に上詰めで表示させたい

    "ABCD"AAABB""EFG""DF.KO!#"などと文字列があったときに、5文字以上のものだけを他のセルに上に詰めて表示させる方法はあるでしょうか。LENで文字数を表示させて並び替えをすれば対象の文字列はすぐに分かりますが、その結果を組み込んでまた次の計算に使うので、手順を自動化できるように関数でできる方法があれば嬉しいです。また文字数で並び替えをすると文字列の順番が入れ替わってしまいますが、可能なら元の順番通りに他のセルに表示させたいです(対象の文字列の文字数が、上から7,5,9,8,6となっていたら、このままの順番で表示させたい)。でもこれが難しいなら、上に詰めて表示させる方法だけでもどうにかできないかと思っています。注文が多くて申し訳ありませんが、良い知恵をお持ちの方がいらっしゃれば、どうかご教授お願いします。

  • C言語:文字列の並び替え

    3つの文字列を入力して、昇順に並び替えを行う方法教えて下さい。 例えば、 AKIRA AKIKO AIKOSANN と、入力されたら、 AIKOSANN AKIKO AKIRA   となるようにアルファベットが早い順に並びかえを行いたいのです。 わかる方、助けてください!

  • Excel2003の文字列の並び替えで

    数字を含む文字列の並び替えで、下記のようになり数字部分が並びません。原因は何でしょうか?   1 11:14   2 300   3 1408   4 1941   5 007 カジノロワイヤル    6 007-01 ドクター・ノー   7 007-02 ロシアより愛をこめて   8 12モンキーズ   9 12人の怒れる男  10 2001年宇宙の旅  11 2010年  12 21グラム  13 28日後  14 34丁目の奇跡  15 60セカンズ これを、5,6,7,1,8,9,3,4,10,11,12,13,2,14,15 の順にしたいのですが、出来ません。文字サイズ、英数、全角半角等、統一しましたが不可です。 宜しくお願い致します。

  • 並び替えがしたいのですが。。。

    Excel2000を使用しています。 文字列として入力している地番を、数値の昇順に並び替えをしたいのです。どうしたらいいのでしょうか? 地番を文字列としているのは、一つのセルに地番を"-"で区切って入力しています。地番の入力例としては、1-1,10-1,20-1です。そのセルを数値として入力出来ればいいのですが、"1-1"を例にすると1月1日になってしまうので、文字列として入力しています。文字列のセルを昇順に並び替えをすると、1→10→100→2→20…となってしまいます。数値の昇順(1→2→10→20→100)にするには、どうしたらいいでしょうか? 関数を使って"-"の前と後で抜き取り、並び替えすることも考えたのですが、優先キーが3つまでなので困ってます。大字・小字・地番で並び替えしたいのです。 出来れば、件数が3000~5000件程ありますので、そのまま文字列セルの状態で昇順になると嬉しいです。 よろしくお願いします。