- ベストアンサー
桁数が混在する並び替えの方法
EXCEL2007です。関数やマクロについてはこんなものがあるんだぁ~程度の知識しかありません。そこで質問です。 以下の数字の並び替えできる方法がわかりません。 単純にEXCELのコマンド操作でできるのでしょうか? それとも関数やプログラムを必要とするのでしょうか? もし関数やプログラムが必要であるならば、がんばって勉強してみようと思ってます。(勉強はするつもりでも、なにが必要かもよくわかっていません。) 並び替えしたい数字は以下のような数字が混在します。 桁数が違う 1桁のものや、2桁~6桁のものが混在する 例 1or12or345or645874 など ハイフンがあるのとないものがある。 例 1-1or1-2or345 順番はまずハイフンの前の番号が若い順に並べたい。 次にハイフンより前の番号が同じものについては、ハイフン後の番号の順番に並べたい。ハイフンが2回重なる場合がある。以下の例を並び替える場合まず一番始まりのハイフン前の若い順に並べるまず4番次に26番次に100番次に226番となり次は1番はじめのハイフンの順番で最後は一番最後のハイフンの順番で以下の例のように並びかえたいです。 1番 4 2番 4-3-5 3番 4-25-2 4番 26-13-6 5番 26-13-21 6番 100 7番 226-8-9 8番 226-15-31 しかしEXCELでは表示形式は文字列にしないと、ハイフンは入力できず、次に並びかえようとすると桁数がバラバラなので 一番初めの数字が桁数より優先されてしまい上記の例ですと本来並びかえたい上の例とは違い。 6番 100 8番 226-15-31 7番 226-8-9 5番 26-13-21 4番 26-13-6 1番 4 3番 4-25-2 2番 4-3-5 と並んでしまいます。理由がわかる方教えていただけませんか??? またどのようにすれば解決するのでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
ANo.3です。 > 1000個以上あり > 自分なりに考えつくことは、まず列をコピ-して元の列をいじらずにコピ-した列をハイフンで分割する。桁数を揃え(0を入れ込む)優先レベルを確定し並びかえる。 上記で可能だと思います。ただし、桁数を揃える必要はないと思います。 「データ」→「区切り位置」で分割した3列を使って並べ替えすればよいと思います。(AN0.2の方のご回答。 何時も勉強させて頂いております。) その時、問題になるのは、空白セルの存在なので、分割した3列の空白セルを含む範囲を選択して、「編集」→「置換」で「置換後の文字列」に「0」を入力すれば、「0」が挿入されますので、並び替えが可能になります。
その他の回答 (5)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 マクロでしたら、以下のようなものを考えてみました。 ただし、こちらの思惑とは違う数字の並びですと、うまくいかない可能性があります。 それは、4桁の数字がある場合です。もちろん、以下の正規表現の「パターン」の部分を修正すれば可能になります。 結果は、このようになります。 「Const DIST As Integer = 2 '右にいくつセルを離すか」の ところを2にしてありますので、A列に数値がある場合は、C列に出力されます。 もちろん、ユーザー定義関数のTriFigs を単独で使用しても、出力されますが、数式ですから、一旦、値貼り付けをしないと並べ替えは出来ません。 004-000-000 004-003-005 004-025-002 026-013-006 026-013-021 100-000-000 226-008-009 226-015-031 標準モジュールに貼り付けて、SortText を実行してください。 '------------------------------------------ Sub SortText() Dim c As Variant Dim i As Long Const DIST As Integer = 2 '右にいくつセルを離すか Application.ScreenUpdating = False '範囲 A1 ~データ範囲まで For Each c In Range("A1", Range("A" & Rows.Count).End(xlUp)) If IsNumeric(Replace(c.Value, "-", "")) Then c.Offset(, DIST).Value = TriFigs(c.Value) i = i + 1 End If Next c Application.ScreenUpdating = True MsgBox i & "セル、変換を完成しました。", 64 End Sub Function TriFigs(ByVal strText As String) Dim Matches As MatchCollection Dim Match As Match Dim i As Integer Dim a(2) As Integer Dim buf As String If strText = "" Then Exit Function With CreateObject("VBscript.RegExp") .Global = False 'パターン .Pattern = "(\d{1,3})\-*(\d{1,3})*\-*(\d{1,3})*" If .test(strText) Then Set Matches = .Execute(strText) Set Match = Matches.Item(0) For i = 0 To 2 a(i) = Match.SubMatches(i) Next buf = Format(a(0), "000") & "-" & Format(a(1), "000") & "-" & Format(a(2), "000") Else buf = strText End If TriFigs = buf End With End Function
お礼
ご協力いただきありがとうございます。質問してから、雨のせいもありかぜでダウンしてました。お礼が遅れ大変失礼いたしました。マクロは まったくわかりませんがせっかくお考えいただきました回答につきましては、意味がわかるくらいはがんばってみたいと思います。 今日から勉強させていただきます、どうもありがとうございました。
- surounin
- ベストアンサー率28% (30/106)
力技ですのでお恥ずかしいんですが、以下のようにすれば出来ると思います。 A列にデータがあると仮定してご説明します。(A1から始まっていると仮定) 1 B1に=IF(C1=0,1,IF(D1=0,2,3)) (-の数によって数式を簡単にするためのセルです) 2 C1に=IF(ISERROR(FIND("-",A1,1))=TRUE,0,FIND("-",A1,1))と入力(一個目の-の位置を特定します) 3 D1に=IF(C1=0,0,IF(ISERROR(FIND("-",A1,C1+1))=TRUE,0,FIND("-",A1,C1+1)))と入力(2個目の-の位置の特定) 4 E1に=CHOOSE(B1,VALUE(A1),VALUE(LEFT(A1,C1-1)),VALUE(LEFT(A1,C1-1))) (一個目の-までの値を取り出します) 5 =CHOOSE(B1,0,VALUE(MID(A1,C1+1,9)),VALUE(MID(A1,C1+1,D1-C1-1)))(二個目の-までの値を取り出します) 6 =CHOOSE(B1,0,0,VALUE(MID(A1,D1+1,9))) 以上のように入力した後、データのある行だけコピーして、 E列、F列、G列でソートをかければお望みの並び順になると思いますが(^^;)
お礼
ありがとうございます。これは関数というもののようですねやはり関数を使わないとできないのですか? まずこのお教えいただいたとおりにやってみたいと思います。自分には少しレベルが高すぎるみたいなので、何日間か日を頂き考えてみたいと思います。どうもありがとうございます。力技でもなんでもうれしいです。ありがとうございました。
- koko88okok
- ベストアンサー率58% (3839/6543)
[理由] Excelの並べ替えは、下記URLの「並べ替えの順序」の項にある基準で並べ替えされていますので、基準通り並べ替えているからです。 「リストの並べ替えの基本を学ぼう 2」 http://allabout.co.jp/computer/msexcel/closeup/CU20070425A/index2.htm [対策] 下記のように桁数を揃えれば、ご希望の順に並ぶと思います。 1番 004-00-00 2番 004-03-05 3番 004-25-02 4番 026-13-06 5番 026-13-21 6番 100-00-00 7番 226-08-09 8番 226-15-31
お礼
早速の回答大変ありがとうございます。教えていただけた方法で近づきつつあります。がしかし、私の説明不足でもうしわけありませんが。例だけみると数がさほどないように見えますが、1000個以上ありまして、お教えいただいた方法では、以下の作業があります。 自分なりに考えつくことは、まず列をコピ-して元の列をいじらずにコピ-した列をハイフンで分割する。桁数を揃え(0を入れ込む)優先レベルを確定し並びかえる。 これでバッチリだと思うのですが自動で0を入れ桁数を揃えつつ、なおかつ何も入力されてないセルに0を入れるなどのことができるのでしょうか?5桁までですので○○○○○-○○○○○-○○○○○のハイフン区切りの数字の列で何も入ってないところに0を挿入することは可能でしょうか? お教えください。
- imogasi
- ベストアンサー率27% (4737/17069)
>理由がわかる方教えていただけませんか こんなもの常識で回答者はみんな知っているよ。 並べ替えは、コンピュタがやるルールが決まっている。我々はそれに沿ってソートキーをつくり、勘案する列(と優先順位、昇降順と)を指定するだけ。 データー区切り位置ーハイフンで3列に分けるのが良いでしょう。 http://www.kenzo30.com/ex_kisopoint/onepoint_hensyu7.htm 参考。本質問ではハイフンで分ける。 そして数字記号ー以外の文字はなさそうだから、数字でソートすればよい。一番常識的な並びになるよ。元の1列が3列データに分かれるが、左の列から第1キー、次の列を第2きー、3列目を第3キーとしてソートする。 たまたま今回のケースは関数も、VBAも要らない。操作だけ。
お礼
ありがとうございます。いろいろ考えてはいるのですが、なかなか思うように行かず悩んでます。大変参考になりました。いろいろやってみます。お付き合いいただきありがとうございます。
- kjtyn7
- ベストアンサー率24% (300/1223)
4-3-5=数値でなく文字列と成りますので、セル内の先頭文字4のみ並べ替え対象です、-3-5は対象になりえません。次のように数値を3列に分けてInPutし、列ごとに、並べ替える条件を設定します。数値では、-=マイナスで記号で、ハイフンではありません。 A列=4,26,100,226 B列=3,25,13,8, C列=5,2,6,21,
お礼
早速のご回答ありがとうございます。なるほど列ごとに分けるんですね。できましたらハイフンこの場合マイナスですが、これを含め1つのセルに入力したいのです。理由は、入力が複雑になるからです。あと並びかえた後にチェックする際ABCの各列が動いてないともかぎりませんし・・同一セル内で桁数が違うしかもマイナスで区切られた並び替えの優先順位をもった数字はどう処理したらならびかわるのでしょうか?
お礼
ありがとうございます。むむむ、置換ですか?これならなんとかなんとか、私でもつかまることができるかもしれません。ありがとうございます。500円で購入したことがある本を思い出しました。うぅぅぅ、頭をひねってみます。