- ベストアンサー
エクセル:住所の番地順に並び替えたい
お願いします。エクセル2000です。 住所データを並べ替えすると次のような順番になってしまいます。 (例1) 東京都東京市大畑878-9 東京都東京市大畑88-14 東京都東京市大畑88-15 東京都東京市大畑882-10 これを次のような順番にソートするためにはどうすればよいでしょうか。 (例2) 東京都東京市大畑88-14 東京都東京市大畑88-15 東京都東京市大畑878-9 東京都東京市大畑882-10
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
例のように漢字と数字(文字列)とが続いている場合のソートの方法は、適当な関数が用意されていないので、ちょっと面倒くさく、次のようになります。(他にも方法はありますが、これが分かり易いので...) 番地順にソートするには、番地の部分を抜き出して、数字に変換するか、または番地の頭に"0"を幾つか追加して、この番地に対して行えばよいことになります。 これには、何段階かの手順を踏みますので、シート内の右の方の住所録には使わないセルを作業用として割り当てます。今回は、A列に住所が書かれており、E列目より右が空いていて、作業用として使えるものと仮定します。 手順は、 1)住所の中には"-"が複数あるのが通常ですから、ソートに不要な最初の"-"位置から後を削除するために、"-"の位置を検索します(G列)。 2)住所の"-"以降を削除した新しい住所を作成します(H列)。 3)この住所中のそれぞれの数字の位置を検出します(I列~Q列)。 4)その中の最小値を見つけます(F列)。 5)この位置以降が番地となりますので、この部分をとりだし、数値に変換します(E列)。 最後に、ソートしたい住所をA列~E列を含めて、選択し、E列についてソートし目的が達成できます。 エクセルで作業をするときこのように空いたセルを利用して作業を行えば分かり易く間違えのない作業が出来ます。 具体的には、 1)G列に、「=SEARCH("-",A1)」または「=SEARCH("-",$A1)」の関数を入れます。 2)H列に、「=LEFT(A1,G1-1)」または「=LEFT($A1,$G1-1)」の関数を入れます。 3)I列に、「=IF(ISERR(SEARCH("1",$H1)),"",SEARCH("1",$H1))」の関数を入れます。 "1"の中の数字は、住所内の数字と同じ形式(全角の場合は全角での意味)にします。 SEARCH関数は、検索文字列が見つからない場合には"#VALUE!"エラーを返しますので、セルを空欄にします。 このI列のセルをJ列~Q列までまでコピーし、"1"の部分をそれぞれ"2"~"9"に変更します。 4)F列に、「=MIN(I1:Q1)」または「=MIN($I1:$Q1)」の関数を入れます。 5)E列に、「=VALUE(MID(H1,F1,50))」または「=VALUE(MID($H1,$F1,50))」の関数を入れます。 関数中の[50]は、引数を入れないとエラーとなりますので、住所の文字列より多い数を入れます。多すぎる場合にはエラーとなりませんので多目の数字を入れます。 最後に、例の場合だと("A1:E4") または("A1:Q4")を選択し、[データ]→[並べ替え]→[優先されるキー] 1番目[昇順]を選び[OK]を押して、目的達成です。 この後、不要ならば、作業領域のセルを削除してください。
その他の回答 (9)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 私は、以前、某掲示板をROMしていた時に、似たような話の覚えがありますが、現実のデータでは、ものすごく難しいと感じました。以下のようにしてみましたが、自分でも疑心暗鬼です。 一応、アラビア数字が書かれているものとします。 ただ、数字がどこに出てくるか分からないからです。せめて、市町ぐらいならよいのですが、[市町]がないとすると、訳が分からなくなってきます。また、漢数字で、最後だけが、アラビア数字だと、誤動作します。 ユーザー定義関数です。 (標準モジュールに貼り付けます) '------------------------------------------------------ Function FigPickup(arg As Variant) As Double '住所の中から、数字のまとまりを二つだす関数 Dim myStr As String Dim Matches As Object Dim Match As Object Dim buf As String If VarType(arg) <> vbString Then Exit Function myStr = StrConv(arg, vbNarrow) With CreateObject("VBScript.RegExp") .Global = False .Pattern = "[区市町]\D*(\d+-?\d*)" Set Matches = .Execute(myStr) If Not Matches Is Nothing Then Set Match = Matches(0) buf = Replace(Match.SubMatches(0), "-", ".") End If FigPickup = buf End With End Function '------------------------------------------------------ 住所 数字 東京都東京市大畑878-9 →878.9 =FigPickup(A1) XXX都XXXX区XXXX1-26-1 →1.26 =FigPickup(A2) という数字を出してきます。 この出てきた数字で並べ替えればよいです。ただ、うまくいくのか、疑問が残ります。
お礼
ありがとうございます!!+
- Yosha
- ベストアンサー率59% (172/287)
No.8です。書き忘れましたので、追加します。 5)まで終了しましたら、(E1:Q1)を選択し、選択範囲の右下の「+」を左クリックしたまま、住所が書き込まれている最後の行まで、ドラッグしてコピーします。 これで、住所が書き込まれている全行のE列~Q列に関数が書き込まれました。 このあと、「最後に、・・・」を実行してください。
- sakemoni1008
- ベストアンサー率31% (317/992)
どうしてもであれば 住所1、住所2、住所3...として 住所1に東京都~大畑までを入力 住所2に88、住所3に14、住所4に次の番地を数字で入力し ソートキーを住所1を第一キー、住所2を第二キー、住所3を第三キーとすればソートできます 住所表示は別セルで&でつなげば出来ます 要するに数字セルは数字、文字セルは文字に分ける事が大事です
No.5ですが、その発言は無視してください。私が勘違いしていました。お騒がせしました。
「次のような順番」はどのような規則になっていると考えれば良いのですか? コンピュータは一定の規則に基づいてしか仕事をしてくれませんから。
東京都東京市大畑088-14 東京都東京市大畑088-15 東京都東京市大畑878-09 東京都東京市大畑882-10 とデータを修正!
- makoteru
- ベストアンサー率29% (128/440)
この参考URLも一度ご覧ください。 同じ問い合わせかと・・
- dulatour
- ベストアンサー率20% (327/1580)
ソートは、数字の昇降順なので、一般の方法では、多い順か、少ない順にしか並べ替えは出来ないでしょう。自分の並べたいようにインデックスを付けるしか、ないのでは・・・
- mii-japan
- ベストアンサー率30% (874/2820)
東京都東京市大畑 88-14 東京都東京市大畑 88-15 東京都東京市大畑878-9 東京都東京市大畑882-10 の様にデータを修正するしか無いのでは (並べ替えの判定手順から見て)
お礼
大変ありがとうございます!