質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

1回答

1136閲覧

住所の加工における文字列置換に関して

KoheiNoma

総合スコア14

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/04/23 23:38

編集2020/04/24 10:02

「4丁目27番3」などのように番の後ろに数字が続く場合はハイフンに、「4丁目27番」などのように番の後ろに数字が続かない場合は何もなしに変換したいです。

しかし、以下のマクロを実行すると、「4丁目27-」のように3が消えてしまいます。

Cells.Replace What:="番?", Replacement:="-", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

パターンとしては以下のものがあります。
千代田区霞が関1-2番1丸ビル → 千代田区霞が関1-2-1号丸ビル
千代田区霞が関77-1番丸ビル → 千代田区二番町77-1丸ビル

また、千代田区霞が関二番町のように町名などに含まれる「番」は「-」に変換しないようにしたいです。(こちらの条件は最悪満たせなくても大丈夫です)

上記のサンプルを修正して、目的を達成したい場合どうすればよろしいでしょうか。
教えていただけると幸いです。

何卒ご協力よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/04/24 00:00

「番」は残して「3」を「-」にしたいということですか?
m.ts10806

2020/04/24 00:13

コードはマークダウンのcode機能を利用してご提示ください。
m.ts10806

2020/04/24 00:16 編集

ケースパターンは出せるだけ出した方が良いかと思います。 たぶん 4丁目27番3 → 4丁目27-3 4丁目27番 → 4丁目27  「だろう」とは思うのですが、仕様なので書かれないので推測に過ぎません。 文章説明よりデータ例で示してもらった方が伝わりやすいです。 あとは「番がない」パターンとか?住所をどこからもってきてるのかにもよります。 ユーザー入力が発生するのであれば完全なパターン化は困難ですしね。
KoheiNoma

2020/04/24 01:27

コメントありがとうございます!伝わりづらい事例で大変失礼いたしました。インラインにてコメントいたします。 >「番」は残して「3」を「-」にしたいということですか? こちら「3」は残して「番」を「-」にしたいです。 パターンとしては以下のものがあります。 千代田区霞が関1-2番1丸ビル → 千代田区霞が関1-2-1号丸ビル 千代田区霞が関77-1番丸ビル → 千代田区二番町77-1丸ビル また、千代田区霞が関二番町のように町名などに含まれる「番」は「-」に変換しないようにしたいです。(こちらの条件は最悪満たせなくても大丈夫です) 以上で伝わるでしょうか。追加でご不明点あれば言ってくださると幸いです。 何卒ご協力よろしくお願いします。
meg_

2020/04/24 06:08

情報は質問に追記した方が、回答がつきやすくなりますよ。
KoheiNoma

2020/04/24 10:03

アドバイスありがとうございます!追記させていただきました。
guest

回答1

0

私の知っている限りでは、1文字ずつチェックするしかない気がします。
(そして、建物名とかに番が含まれている場合もあるだろうし、とてもリスキーだと思います)

ネストが深くて美しくないですが、一応サンプルです。

  • パターン例ひとつ目の「号」に変換する処理は入れていません。
  • とりあえずActiveSheetのUsedRange内でループを回して1件ずつ置換していますが、

住所が入っているセル範囲をちゃんと指定して、
データ件数が多いなら配列に入れて最後にまとめて出力とかにした方が良いと思います。

Sub ReplaceTest() Dim r As Range For Each r In ActiveSheet.UsedRange Dim tgtStr As String: tgtStr = r.Value Dim txtCnt As Long: txtCnt = Len(r.Value) If txtCnt > 1 Then Dim i As Long, tgtChar As String For i = 2 To txtCnt If tgtStr Like "*番*" Then If NeedReplace(tgtStr, txtCnt, i) Then '後が数字の場合は、ハイフンに置換 If IsNumeric(Mid(r.Value, i + 1, 1)) Then r.Value = WorksheetFunction.Replace(tgtStr, i, 1, "-") '後が数字でない場合、番を削除 Else r.Value = WorksheetFunction.Replace(tgtStr, i, 1, "") End If End If End If Next i End If Next r End Sub Function NeedReplace(tgtStr As String, txtCnt As Long, i As Long) As Boolean NeedReplace = True Dim tgtChar As String: tgtChar = Mid(tgtStr, i, 1) Select Case True Case tgtChar <> "番": NeedReplace = False Case Not IsNumeric(Mid(tgtStr, i - 1, 1)): NeedReplace = False Case Else If i < txtCnt Then Select Case Mid(tgtStr, i + 1, 1) Case "町", "丁", "通", "堰", "甲": NeedReplace = False End Select End If If i < txtCnt - 1 Then If Mid(tgtStr, i + 1, 2) = "耕地" Then NeedReplace = False End If If i < txtCnt - 3 Then If Mid(tgtStr, i + 1, 3) = "堀通町" Then NeedReplace = False End If If i > 3 Then Select Case Mid(tgtStr, i - 3, 2) Case "春日", "旧舘": NeedReplace = False End Select End If If i > 4 Then Select Case Mid(tgtStr, i - 4, 3) Case "熱田区", "門真市", "浜中町", "百目木", "青山奥": NeedReplace = False End Select End If If i > 5 Then Select Case True Case Mid(tgtStr, i - 5, 3) = "豊里町": NeedReplace = False Case Mid(tgtStr, i - 5, 3) = "美旗町": NeedReplace = False Case Mid(tgtStr, i - 5, 4) = "安曇川町": NeedReplace = False End Select End If End Select End Function

投稿2020/04/24 14:54

snufkin819

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KoheiNoma

2020/04/25 03:26

ご丁寧にありがとうございます!少しVBAを復習したのちに、こちらのスクリプトで試してみます。また結果を報告させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問