• ベストアンサー

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

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