[[20171215091359]] 『住所の分割』(lion) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『住所の分割』(lion)

お世話になります。

以下は『Excel2007の技 VBA編』からのものですが,これを生かしながら,追加したいことがございます。ご教授ください。

以下はA列にまとめられた住所を,「都道府県」名を切り取りB列へ,それ以外をC列へ貼り付けるものです。

例えば,「東京都府中市」であれば思うとおりにできるのですが,「府中市」から始まるデータであったり,(実際あるかはわかりませんが)「道府町市」というデータがC列にそのまま貼り付けされるにはどこをどうすればよろしいでしょうか。

Sub test()

 Dim myAd As String
 Dim n As Long
 Dim i As Long
 Dim ws1 As Worksheet

 Set ws1 = Worksheets("Sheet1")

 For i = 2 To 8
    myAd = ws1.Cells(i, 1).Value

        If myAd Like "*[都道府県]*" Then
            If Mid(myAd, 4, 1) = " 県 " Then
                n = 4
            Else
                n = 3
            End If
        Else
            n = 0
        End If

      ws1.Cells(i, 2).Value = Left(myAd, n)
      ws1.Cells(i, 3).Value = Mid(myAd, n + 1)
 Next i

End Sub

< 使用 Excel:Excel2016mac、使用 OS:MacOSX >


日本の住所の分割って結構面倒で、キーワード自体が名称に使われている場合があるのですよ。たとえば、「市川市」「町田市」「大町市」「四日市市」「大町町」等。 なので、全国ではなく、もう少し範囲を絞れませんか?

最近の質問では、埼玉県限定(こういうきわどい住所がない)で、数式でバラす案(半平太さん)がありました。[[20171114141558]]

参考までに、正規表現で頑張ってみた方のページなぞ。
https://qiita.com/zakuroishikuro/items/066421bce820e3c73ce9
(???) 2017/12/15(金) 11:05


> If myAd Like "*[都道府県]*" Then ここで調べて
都道府県ない場合
> Else
 >n = 0
にしていて
>ws1.Cells(i, 3).Value = Mid(myAd, n + 1)
C列に張り付けだから
>「府中市」から始まるデータであったり
これは 処理されてると思うけど普通にC列に張り付くと思うけど

>「道府町市」というデータ
IFで逃げればいいだけだと思うけど

違うのかな
やってないから
何ともだけど
(Q::) 2017/12/15(金) 11:20


???様,Q::様

ご教示いただきありがとうございます。私もずいぶんと悩んだのですが,やはりお詳しいお二人がおっしゃるとおり,難しいですよね。範囲を狭めることで可能かもしれませんが,全国データですので,ほかに方法がないか考えてみたいと思います。

ありがとうございます。
(lion) 2017/12/15(金) 11:44


とりあえず、やばそうな住所は考慮せず、元の案を手直しした例なぞ。

 Sub test()
    Dim myAd As String
    Dim i As Long
    Dim n As Long
    Dim nMax As Long

    With Sheets("Sheet1")
        For i = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row
            myAd = .Cells(i, 1).Value
            nMax = Len(myAd)
            For n = 1 To nMax
                If Mid(myAd, n, 1) Like "[都道府県]" Then
                    .Cells(i, 2).Value = Left(myAd, n)
                    .Cells(i, 3).Value = Mid(myAd, n + 1)
                    Exit For
                End If
            Next n
            If nMax < n Then
                .Cells(i, 3).Value = myAd
            End If
        Next i
    End With
 End Sub
(???) 2017/12/15(金) 11:48

 Q::さん、「府中市」には「府」があるので
 "府中市" Like "*[都道府県]*" 
 はTrueになる。
(ねむねむ) 2017/12/15(金) 11:52

ねむねむさま
おおおおおおお
  だね

ありがとうございます

(Q::) 2017/12/15(金) 12:01


でもって、都道府県とその他だけに分ける場合の、対応例なぞ。

総務省あたりが行政指導して、全国の "都道府県市町村区群" を含む地名を、さいたま市のようにひらがなに変えてくれれば、情報処理が簡単になると思うのですけどねぇ。

 Sub test()
    Dim myAd As String
    Dim myAd2 As String
    Dim i As Long
    Dim n As Long
    Dim nMax As Long

    With Sheets("Sheet1")
        For i = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row
            myAd = .Cells(i, 1).Value
            myAd2 = Replace(myAd, "市川市", "いちかわ市")
            myAd2 = Replace(myAd2, "府中市", "ふちゅう市")
            nMax = Len(myAd2)
            For n = 1 To nMax
                If Mid(myAd2, n, 1) Like "[都道府県]" Then
                    .Cells(i, 2).Value = Left(myAd, n)
                    .Cells(i, 3).Value = Mid(myAd, n + 1)
                    Exit For
                End If
            Next n
            If nMax < n Then
                .Cells(i, 3).Value = myAd
            End If
        Next i
    End With
 End Sub
(???) 2017/12/15(金) 12:55

辞書を作って引いちゃえばいいのでは?1800個くらいですかね???
http://www.soumu.go.jp/denshijiti/code.html

こちらは関数の解説ですが、
ロジックは参考になるのでは?
https://sites.google.com/site/s04728sh/
https://allabout.co.jp/gm/gc/297828/
(まっつわん) 2017/12/15(金) 13:36


 都道府県とそれ以外を分離するだけの話でしょ?(都道府県がなければ、C列だけでいい)

 47個の都道府県名が、対象文字列の左端にあるかどうかのチェックで済みますよ。

(半平太) 2017/12/15(金) 15:43


半平太様

ぜひコードを教えていただけないでしょうか。お願いいたします。
(lion) 2017/12/15(金) 16:06


 例えば、E列に47都道府県名リストがあるとすれば

 Sub test()
     Dim ws1 As Worksheet
     Dim lastRw As Long
     Set ws1 = Worksheets("Sheet1")

     With ws1
         lastRw = .Cells(.Rows.Count, "A").End(xlUp).Row
         With .Range("B2").Resize(lastRw - 1)
             .FormulaLocal = "=IFERROR(LOOKUP(1,0/COUNTIF(A2,$E$2:$E$48&""*""),$E$2:$E$48),"""")"
             .Offset(, 1).FormulaLocal = "=REPLACE(A2,1,LEN(B2),"""")"

             .Resize(, 2).Value = .Resize(, 2).Value
         End With
     End With
 End Sub

 <Sheet1 結果図>
  行  ____________A____________  _____B_____  _________C_________  _D_  ____ E ____
   1  住所                       都道府県名   市区町村名                都道府県名 
   2  広島県府中市府中町         広島県       府中市府中町              北海道     
   3  東京都府中市府中町         東京都       府中市府中町              青森県     
   4  府中市府中町                            府中市府中町              岩手県     
   5  広島県三次市               広島県       三次市                    宮城県     
   6  広島県府中市阿字町         広島県       府中市阿字町              秋田県     
   7  埼玉県川越市野田町1丁目   埼玉県       川越市野田町1丁目        山形県     
   8  毛呂山町大字市場                        毛呂山町大字市場          福島県     
   9  川越市野田町1丁目                      川越市野田町1丁目        茨城県     
  10  埼玉県毛呂山町大字市場     埼玉県       毛呂山町大字市場          栃木県     
  11  庄原市西城町中野                        庄原市西城町中野          群馬県     
  12  川越市野田町1丁目                      川越市野田町1丁目        埼玉県     
  13  府中市荒谷町                            府中市荒谷町              千葉県     
  14                                                                    東京都     
  15                                                                    神奈川県   
  16                                                                    新潟県     
  17                                                                    富山県     
  18                                                                    石川県     
  19                                                                    福井県     
  20                                                                    山梨県     
  21                                                                    長野県     
  22                                                                    岐阜県     
  23                                                                    静岡県     
  24                                                                    愛知県     
  25                                                                    三重県     
  26                                                                    滋賀県     
  27                                                                    京都府     
  28                                                                    大阪府     
  29                                                                    兵庫県     
  30                                                                    奈良県     
  31                                                                    和歌山県   
  32                                                                    鳥取県     
  33                                                                    島根県     
  34                                                                    岡山県     
  35                                                                    広島県     
  36                                                                    山口県     
  37                                                                    徳島県     
  38                                                                    香川県     
  39                                                                    愛媛県     
  40                                                                    高知県     
  41                                                                    福岡県     
  42                                                                    佐賀県     
  43                                                                    長崎県     
  44                                                                    熊本県     
  45                                                                    大分県     
  46                                                                    宮崎県     
  47                                                                    鹿児島県   
  48                                                                    沖縄県     

 数式で簡単にできるってことですけどね・・

 都道府県名リストが無く、且つ数式だけでもそんなに難度は高くないと思いますが、
 都道府県名リストなんて誰でも簡単に作れるんですから、
 余計な神経使わなきゃならない数式を作る気は起きないです。

(半平太) 2017/12/15(金) 17:39


まっつわん 様ご呈示のエクセルファイルを見ると4文字は3件、後は全て3文字ですので

現状では… ^^;

A列に住所があるとして
B列に

 =IF(OR(LEFT($A1,4)="和歌山県",LEFT($A1,4)="鹿児島県",LEFT($A1,4)="神奈川県"),LEFT($A1,4),LEFT($A1,3))

C列に

 =IF(OR(LEFT($A1,4)="和歌山県",LEFT($A1,4)="鹿児島県",LEFT($A1,4)="神奈川県"),MID($A1,5,LEN($A1)-4),MID($A1,4,LEN($A1)-3))

A列の最終情報行までフィルコピー
でも

(隠居じーさん) 2017/12/15(金) 18:53


 >でも 

  でも?

  ここ読みましたか?
  ↓
 >例えば,「東京都府中市」であれば思うとおりにできるのですが,「府中市」から始まるデータであったり,

(半平太) 2017/12/15(金) 20:09


半平太 さま

むむむ ^^;

ご指摘の通りですね。
左から3文字目、または四文字めが、”都”、”道”、”府”、”県”以外で、かつ郡市町村を含む???

(??)〜??? (TT)

弱った老人の頭脳の適用外のよ〜です。わたくしの案は廃案と言う事で。
失礼いたしました。

m(__)m

(隠居じーさん) 2017/12/16(土) 07:21


lion様 横から済みません
半平太 様
 "=IFERROR(LOOKUP(1,0/COUNTIF(A2,$E$2:$E$48&""*""),$E$2:$E$48),"""")"

ゼロで割らなければ、全て鹿児島県に
割れば、見事に、各、都道府県が。

なぜゼロで割れば…成功なのか
皆様は、お解りなのでしょうね…私は不思議です、でも完璧作動 ^^v
お教えいただければ幸甚です。
ネット調査しましたが。
範囲が文字列で
条件が範囲の中の任意の文字列
の使用例は有りませんでした。
只々、感嘆いたしております。

とても、勉強になります。
別スレがよければ立てます。
宜しくお願い致します。

m(_ _)m

(隠居じーさん) 2017/12/17(日) 09:53


 LOOKUP関数の仕様が分かってないと理解できないです。

 ヘルプの解説では
  昇順に並んでいる配列に対して、検索値と同値(それがなければ内輪の最大値)をヒットする。
  (※その際、エラー値は無視される)

 これを逆手にとって、以下の性質を利用する
  昇順であろうが無かろうが、検索値が配列の最大値より少しでも大きければ、最後尾の値をヒットする。
  何故なら、昇順と思い込んでいるので、同値が見当たらなければ、最後尾が内輪の最大値と判定される

 ※「ゼロで割らなければ、全て鹿児島県に」とは言えないです。 
   途中に1(=該当県)があったりするので、検索値(=1) は最大値より大きいと言えなくなります。

 あとは自力で考えてください。

(半平太) 2017/12/17(日) 11:08


半平太 様

何かと、ご多忙の中、ご説明戴き、
有難うございます。
ご指摘の関数、もうすこし掘り下げて調べてみます。
老人のボケ防止に最適な宿題です。
工夫次第で様々な使い方ができるのですね〜!

頑張ってみます。

<< _ _ >>

(隠居じーさん) 2017/12/17(日) 11:56


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.