プロが教える店舗&オフィスのセキュリティ対策術

エクセルの関数で○○市○○町xxx番地などとなっている住所の
区、市、郡を除いたそれ以降の住所だけ取り出したいのですが
=FIND("市",B2)
=REPLACE(B2,D2,3,"")

このFINDに複数の検索文字列を指定して、当てはまる数値を出すにはどうのようにすればよいでしょうか?

A 回答 (5件)

市川市、郡山市等がありますので、そんな小手先でできる作業ではありません。

    • good
    • 0

この手のソリューションは立派に万単位のお金を頂ける内容です。


しかしながら「住所分割」でググったら、結構出てきましたよ。
http://pc.nikkeibp.co.jp/pc21/tech/excel36/35/in …
http://www2.odn.ne.jp/excel/waza/function.html#S …
などがありました。
ご参考まで...
    • good
    • 0

福岡県糟屋郡新宮町桜山手_____新宮__新宮町桜山手


福岡県糟屋市新宮町桜山手_____新宮__新宮町桜山手
福岡県糟屋区新宮町桜山手_____新宮__新宮町桜山手
福岡県郡山郡新宮町桜山手_____新宮__新宮町桜山手
福岡県糟市川市新宮町桜山手__新宮__新宮町桜山手
福岡県糟市川市市田町桜山手__市田__市田町桜山手

=GetTown(A1)
=ReAltAddress(CutString(AltAddress(A1), "区,郡,市", 2))

町名と町名と字番地を抜き出してみました。
もちろん、上記の6つだけテストをしたに過ぎません。
そういうことで、信頼性は今一つです。

要は、単純にCutStr関数で抜き出すと’郡山’、"市川"、"市田"が邪魔します。
そこで、予めこれらを置換しておいて抜き出した後にも再置換して不具合を解消しています。
何とも原始的な手法ですが、まあ、<事足りればよし>じゃないですか?
最も簡単に抜き出す手法かと思います。

もちろん、事前置換と事後置換のデータセットは質問者の課題です。

Public Function GetTown(ByVal Text As String) As String
  GetTown = ReAltAddress(CutStr(CutString(AltAddress(Text), "区,郡,市", 2), "町", 1))
End Function

Public Function CutStr(ByVal Text As String, _
            ByVal Separator As String, _
            ByVal N As Integer) As String
  Dim strDatas() As String
  
  strDatas = Split("" & Separator & Text, Separator, , 0)
  CutStr = strDatas(N * Abs((N <= UBound(strDatas))))
End Function

Public Function CutString(ByVal Text As String, _
             ByVal Separator As String, _
             ByVal N As Integer) As String
  Dim I       As Integer
  Dim M       As Integer
  Dim strSeparator() As String
  Dim strReturn   As String
  
  strSeparator() = Split(Separator, ",")
  M = UBound(strSeparator())
  For I = 0 To M
    strReturn = strReturn & CutStr(Text, strSeparator(I), N)
  Next I
  CutString = strReturn
End Function

Public Function AltAddress(ByVal Text As String) As String
  Text = Replace(Text, "郡山", "こおり山")
  Text = Replace(Text, "市川", "いち川")
  Text = Replace(Text, "市田", "いち田")
  AltAddress = Text
End Function

Public Function ReAltAddress(ByVal Text As String) As String
  Text = Replace(Text, "いち田", "市田")
  ReAltAddress = Text
End Function
    • good
    • 0

問題点1、都道府県を抜き出せない。

(北海道=>北海)
問題点2、OO市OO市OO市、OO町OO町への対応が困難。
問題点3、事前変換、事後変換の要領が拙い。
問題点4、CutStr関数、CutString関数と2つ用いる意味がない。

先の回答は、このように4つ程の問題点を含んでいました。
要は、余りにも完成度が低かったということです。
とりあえずお知らせしておきます。
    • good
    • 0

[イミディエイト]


? CS("北海道旭川市山川町大字松田鎧町114番地", "道", 1, True )
北海道
? CS("北海道旭川市山川町大字松田鎧町114番地", "町", 2,,True)
大字松田鎧町114番地

"道"、"町"で区切られた文字の1番目と2番目を求めています。
従来のCutStr関数と違うのは、区切り子を含めて返すか否かを4番目の引数で指定できること。
従来のCutStr関数と違うのは、2番目以降の全てを連結して返すか否かの引数も5番目に指定できること。
これで、都道府県の抜き出しやOO市OO市OO市、OO町OO町パターンの住所に対応できます。

[イミディエイト]
? CutStr("北海道旭川市山川町大字松田鎧町114番地", "都,道,府,県", 1, True )
北海道
? CutStr("北海道旭川市山川町大字松田鎧町114番地", "都,道,府,県", 2, True )
旭川市山川町大字松田鎧町114番地道

そういうことで、上述のCS関数を内部的にコールする CutStr関数(先の CutString())も引数を増やしています。
これで、事前変換と事後変換の拙さを克服すれば、自在に住所を分割抽出できる筈です。
試しに、CutStr関数を用いて SplitAddress関数を作成してみます。

[イミディエイト]
? SplitAddress("北海道旭川市山川町大字松田鎧町114番地", 都道府県)
北海道
? SplitAddress("北海道旭川市山川町大字松田鎧町114番地", 市区郡)
旭川市
? SplitAddress("北海道旭川市山川町大字松田鎧町114番地", 町村)
山川町
? SplitAddress("北海道旭川市山川町大字松田鎧町114番地", 番地)
大字松田鎧町114番地

<エクセルシートの場合>
北海道旭川市山川町大字松田鎧町114番地___北海道<-------------------=SplitAddress(A1, 1)
北海道旭川市山川町大字松田鎧町114番地___旭川市<-------------------=SplitAddress(A2, 2)
北海道旭川市山川町大字松田鎧町114番地___山川町<-------------------=SplitAddress(A3, 3)
北海道旭川市山川町大字松田鎧町114番地___大字松田鎧町114番地<------=SplitAddress(A4, 4)

SplitAddress関数は、非常にシンプルなものです。
ですから、上述のテストと併せてそのコードを見れば新CutSTr関数の使い方は判ると思います。

※少々、長くなりましたので、新CutStr関数とSplitAddress関数は別回答とします。
    • good
    • 0

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