dポイントプレゼントキャンペーン実施中!

エクセルにて住所録を作っていますが、並び替えがうまく行きません

C列に
10-1
2-1
20-1
1-1

と言う元データ(住所の番地)があります

これを昇順で並び替えボタンを押すと
10-1
1-1
20-1
2-1

となってしまいます

住所録の番地順に並べ替えたいので
1-1
2-1
10-1
20-1

と並べ替えたいのですが、上手く並べ替える方法はありませんか?
恐らく数字と「-」(ハイフン)を比較した時に「-」の方が順位が先に来るためだと予想しますが・・・。
良い方法があれば教えてください。

A 回答 (8件)

1. D列に、=SUBSTITUTE(C1,"-",":") と入力


2. D列で並べ替え
    • good
    • 2
この回答へのお礼

回答ありがとうございます。

関数を使う方法ですね。
一度試してみます

お礼日時:2019/10/29 17:37

マクロ(VBA)を使って1時的にソート可能な形にして、ソート後に別のマクロを使って元に戻すというのはいかがでしょう?



☆ 使い方
 ① 住所録の番地の列を選択する。
 ②「ソート用データ作成」マクロを実行する。
 ③ ソート処理を行う。
 ④ 住所録の番地の列を選択する。
 ⑤「原型に戻す」マクロを実行する。
 ※「?????-?????-?????」まで対応しています。

☆ 標準モジュールに書き込んでください。

Sub ソート用データ作成()

Dim Rng_セル As Range
Dim Str_地番 As Variant
Dim Str_出力 As String
Dim Lng_要素 As Long

 For Each Rng_セル In Selection
  If Trim(Rng_セル.Value) <> "" Then
   Str_出力 = ""
   If InStr(Rng_セル.Value, "-") = 0 Then
    If IsNumeric(Rng_セル.Value) Then
     Str_出力 = Format(CLng(Rng_セル.Value), "00000") & "-00000-00000"
    Else
     Str_出力 = Rng_セル.Value
    End If
   Else
    Str_地番 = Split(Rng_セル.Value, "-")
    For Lng_要素 = 0 To 2
     If UBound(Str_地番) > 3 Then Exit For
     If Lng_要素 <= UBound(Str_地番) Then
      Str_出力 = Str_出力 & Format(CLng(Str_地番(Lng_要素)), "00000")
     Else
      Str_出力 = Str_出力 & "00000"
     End If
     If Lng_要素 < 2 Then
      Str_出力 = Str_出力 & "-"
     End If
    Next
   End If
   Rng_セル.Value = "'" & Str_出力
  End If
 Next
 MsgBox ("変換完了")

End Sub

Sub 原型に戻す()

Dim Rng_セル As Range
Dim Str_入力 As String
Dim Str_出力 As String
Dim Lng_要素 As Long

 For Each Rng_セル In Selection
  Str_入力 = Rng_セル.Value
  If Left(Str_入力, 1) = "'" Then Str_入力 = Mid(Str_入力, 2)
  If Len(Str_入力) = 17 Then
   If IsNumeric(Left(Str_入力, 5)) Then
    If Mid(Str_入力, 6, 1) = "-" Then
     If IsNumeric(Mid(Str_入力, 7, 5)) Then
      If Mid(Str_入力, 12, 1) = "-" Then
       If IsNumeric(Right(Str_入力, 5)) Then
        Lng_要素 = CLng(Right(Str_入力, 5))
        If Lng_要素 = 0 Then
         Str_出力 = ""
        Else
         Str_出力 = "-" & Format(Lng_要素, "0")
        End If
        Lng_要素 = CLng(Mid(Str_入力, 7, 5))
        If Lng_要素 <> 0 Then
         Str_出力 = "-" & Format(Lng_要素, "0") & Str_出力
        End If
        Lng_要素 = CLng(Left(Str_入力, 5))
        Str_出力 = Format(Lng_要素, "0") & Str_出力
        Rng_セル.Value = "'" & Str_出力
       End If
      End If
     End If
    End If
   End If
  End If
 Next
 MsgBox ("変換完了")

End Sub
    • good
    • 0

え?データ量が多いから、これが簡単だろ?って思うんだけど?

    • good
    • 0

これが一番でしょ。


ハイフンの前と後を分ける。
「【エクセル、並び替えについて】」の回答画像6
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

これも考えてみたのですが、データ量が多いので、簡単にできる方法がないのかと思い質問いたしました。

お礼日時:2019/10/29 17:42

回答No.3 だと出来なそうだね。

    • good
    • 0

こんにちは



文字列での比較になってしまっているので、ご質問のような結果になります。

対応としては、No2様がお示しの方法が良いと思いますが、
 2-11
 10-1
などが存在する可能性も苦慮すると、「-」の前だけを抜き出すようにした方が確実と思います。

関数式が少し長くなりますが
 =LEFT(C1,IFERROR(FIND("-",C1)-1,LEN(C1)))
とか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます

こちらも関数を使う方法ですね。
試してみます

お礼日時:2019/10/29 17:40

その数値などは半角での前提です



データ並び替えをクリックすると
ダイヤログが現れ
他取る業にチェックOKで

またダイヤログが現れます
下の図です

その部分を
上の方の「数値として見えるものはすべて数値として並び替える」の方にチェックすれば良いですね
「【エクセル、並び替えについて】」の回答画像3
    • good
    • 1
この回答へのお礼

回答ありがとうございます

お礼日時:2019/10/29 17:38

数値じゃなくて文字列だからなあ。



 10番地1
 _2番地1
 20番地1
 _1番地1

とハイフン(-)を ”番地” に置換、一桁の値を ”スペース” をいれて整形することをお勧めします。
(見づらいので ”スペース” を アンダーバー(_)にしています)
こうすれば、

 _1番地1
 _2番地1
 10番地1
 20番地1

となります。

なお、スペースが無いと

 10番地1
 1番地1
 20番地1
 2番地1

となります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます

他に簡単な方法がないかと思い質問したのですがやはりそう言う方法になりますか(汗

お礼日時:2019/10/29 17:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています