- ベストアンサー
文字列の並び替えについて教えて下さい
winXP Access 2000の環境ですが 文字列フィールドに 201-1 202-2 1011 235 と入っているとき 並び替えで 201-1 202-2 235 1011 ととう順番に並び替えしたのですが どの様にすればよいでしょうか ご指南ください
- みんなの回答 (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 に・・・とか
その他の回答 (1)
- 30246kiku
- ベストアンサー率73% (370/504)
> 文字列フィールドに 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" は同じ数値になっています。 文字列長を新設して順を決めるとか、使いやすいようにしてください。 また、上記で扱えない桁数のものがあるとか・・・修正してください。 参考にする/しない等々、自己責任でお願いします。
補足
ご指南有難う御座います 説明不足で吸いません 1つのフィールドに 201-1 202-2 235 1011 と並び替えたいという意味です。
お礼
有難う御座いました 表現できました ありがとう御座います