住所情報を都道府県から市区町村レベルで細かく分割する

この講座は有料講座です。
講座の購入後ご覧になれます。

ログインアカウントの新規作成

解説

演習問題テーマ:住所情報を都道府県から市区町村レベルで細かく分割する

ある受講生の方から、こんな質問を受けました。

エクセルマクロの基礎編で、住所を分割するマクロを作成する課題で、以下のような疑問が生じたので自分なりに問題を作成してやってみました。
・フォローアップの問題では、市と区のみ条件分岐しておけば良かったのですが、例えば、都道府県や市区町村のようにたくさんを条件について考える場合、もっとスッキリした方法でやりたいと思いました。
・市・区に分割する場合でも、東京都新宿区の場合は良いけど、大阪市中央区の場合についてどのように処理するかに疑問を感じました。

そこで、この課題を細分化して解いていってみます。

この教材についての過去の質問・感想

10284 : 小川慶一の回答 (2018-07-24 20:22:37)

morimotoさん:

基礎編本編第2章の演習問題を再度やってみるとよいです。
それから、赤い表示になる行があったらそれは構文エラーが起きているということですので、その状態のまま放置しないことです。


> 途中何回やってもエラーデバックで返ってきました。ほんと悩みに悩み見ましたらどこか1行で毎度おなじみ
> range("b" & gyo),,,をrange("b" : gyo),,,と書いてました。エラー解消にならないときケアレスミスがないかみないといけないことが、バカばかしですが気を付ける点だとわかりました。当たり前ですが見過ごしやすいです。


10283 : 小川慶一の回答 (2018-07-24 20:21:24)

morimotoさん:

「復習の都度、新たな学びがある」というのは、とてもいいことですね o(^-^)o

> 動画解説を基に自分の今ある知識で再度トライしまして納得いく形ができました。
> やれやれです。が解説の方でsikugun = Mid(moto, todofuken + 1)があり、そうですよね都道府県部分を省いてから市区町等考えれば非常にシンプルでわかりやすいですよね。
> B列だけで処理しようとしててしんどくなりました。
> わずか1行のコードですが勉強になりました。


10277 : morimotoさんのコメント (2018-07-23 13:14:31)

途中何回やってもエラーデバックで返ってきました。ほんと悩みに悩み見ましたらどこか1行で毎度おなじみ
range("b" & gyo),,,をrange("b" : gyo),,,と書いてました。エラー解消にならないときケアレスミスがないかみないといけないことが、バカばかしですが気を付ける点だとわかりました。当たり前ですが見過ごしやすいです。


10276 : morimotoさんのコメント (2018-07-23 13:10:42)

動画解説を基に自分の今ある知識で再度トライしまして
納得いく形ができました。やれやれです。が解説の方でsikugun = Mid(moto, todofuken + 1)があり、そうですよね都道府県部分を省いてから市区町等考えれば非常にシンプルでわかりやすいですよね。B列だけで処理しようとしててしんどくなりました。わずか1行のコードですが勉強になりました。


10274 : 小川慶一の回答 (2018-07-19 15:39:12)

morimotoさん:

例外は気にせず、まずは、8割で正解できるプログラムを作ることです。
あとは例外をサポートできる仕組みに次第に作り変えていくこと。実務でもそういう流れでプログラムを書いていくことになりますね。


10273 : 小川慶一の回答 (2018-07-19 15:38:24)

morimotoさん:

>住所の後半で分けていくというのがすっごい参考になりました。

いちばんスマートな方法か?というと、そうでもないですけどね。
料理と同じです。完成品みただけでレシピ思いつくものではないです。実作業の経験が大切です。それが実務でであっても、料理教室で、であっても。


10272 : morimotoさんのコメント (2018-07-19 02:22:06)

確かに日本の住所にはきれいに行政区がわかれていないものがありますよね。たとえば四日市市や町田市、、、受講生からご質問があったとのことですが、すっごい着眼されているなと思います。ここでのセミナーの知識は住所を触る場面で絶対活用できそうです。カレーのよき材料になりそうです。


10271 : morimotoさんのコメント (2018-07-19 02:18:09)

非常に難しかったです。4日考えましたができませんでした(練習と経験不足)。解説例を熟読した後、作りたての自分のコード(まずいカレー)が補正できるか(多少マシなカレーになるか)悩みに悩み再度試してみます。ヒントがあった住所の後半で分けていくというのがすっごい参考になりました。


8961 : 小川慶一の回答 (2017-09-28 20:42:14)

金子 伊智郎さん:

パレートの法則(8:2の法則)が参考になります。
8割の改善であれば2割のコストでできます。
10割の改善をしようと思うと、10割のコストがかかります。
「残り2割の改善に、8割のコストがかかる」ということですね。

ですので、実務では、「8割の改善」をしたらそれ以上ムリに仕組み化しようとはせず、手元のリソースを使って別のことの改善をするほうが有利です。

ざっくりしたモデルで考えると:

[1] 1つの仕事を10割マクロ化する→10のコスト
[2] 1つの仕事を 8割マクロ化する→ 2のコスト

ということですので、[2]より、以下が言えるかもしれません。

[結論] 5つの仕事を 8割マクロ化する→10のコスト


...というのは、ウソです。詭弁ですので信用しないように。

なぜなら、5つの仕事があったとしたら、パレートの法則によれば、そのうち本当にビジネス上のインパクトの有る仕事は1つだけなので。

考え方の参考にはなるかとは思いましたので、半分冗談で、あえてこんな試算を示してみました ヾ(´ー`)ノ

長くなりましたので、このへんで...。




> 小川慶一さん:
>
> コメントありがとうございます。
> 参考になりますし納得しています。
> 完璧なものに近づけようとするとコストと時間を消費しますし、
> コードも複雑になりがちです。
> 後々メンテする際にも本人しか直せないマクロ、もしくは本人で
> あっても直せないマクロになってしまうのでは、という危惧があります。
> 凝ろうと思ったらいくらでも凝ったものは作れるため、要件・要求に
> 応じたバランス感覚は重要だと思っております。
> ひとりよがりのプログラマだけが満足するだけのものは避けないと
> と思っています。


8958 : 金子 伊智郎さんのコメント (2017-09-28 16:58:04)

小川慶一さん:

コメントありがとうございます。
参考になりますし納得しています。
完璧なものに近づけようとするとコストと時間を消費しますし、
コードも複雑になりがちです。
後々メンテする際にも本人しか直せないマクロ、もしくは本人で
あっても直せないマクロになってしまうのでは、という危惧があります。
凝ろうと思ったらいくらでも凝ったものは作れるため、要件・要求に
応じたバランス感覚は重要だと思っております。
ひとりよがりのプログラマだけが満足するだけのものは避けないと
と思っています。

> 金子 伊智郎さん:
>
> > このセンテンスでは全パターンを網羅するマクロを作成する(=品質を高める)のが目的ではないと理解しておりますのでこれで良しとします。
>
> ですね。
> 実際のところ、そういうところまで作り込んだマクロを書くべきか?マクロにはざっとした処理だけさせて、細かい修正は手作業でするか?は、実務上の要請次第です。
>
> 手作業でなおすなら、たとえば、『「市」や「町」という文字が2つ以上見つかった場合には、どっかの列に「×」と記入する』、そして、あとは、目視や、ショートカットキー [Ctrl] + [↑] または [↓] でその列に記入された値を調査していく、という感じでマクロに支援させるというのもあります。
>
> いただいたサンプルについても、 Select Case 文や Split関数といった発展編1、発展編2で学べるノウハウを組み合わせるとより華麗にすっきりとした、メンテナンス性高いコードで書き上げられるようになります。
>
> ひきつづきお楽しみください☆


8952 : 小川慶一の回答 (2017-09-28 16:36:00)

受講生 さん:

鋭いですね (^^;
動画18までとそれ以降ではレベル感や性質が異なります。

最後のほうは、「そこまでしなくても、発展編1レベルのスキルがあればあっさり片付くだろう!」というものでも、ムリして(腕力に頼って)基礎編スキルだけでマクロを書き上げています。
そういう力(腕力)も大切なんですけどね。


> 質問ですが、各回のコメントをチェックしていると動画18で一旦基礎編のフォローアップは完結していたのですかね?
> 動画19以降は後から追加されたもののようですが、動画35までを目標に進めていきます。
> 本講座をとても気に入っていますので、発展編1も引き続きやりたいところ
> ですが経済的な理由もありますので、まずは基礎編を固めたいと思っております。
>


8951 : 小川慶一の回答 (2017-09-28 16:33:50)

金子 伊智郎さん:

> このセンテンスでは全パターンを網羅するマクロを作成する(=品質を高める)のが目的ではないと理解しておりますのでこれで良しとします。

ですね。
実際のところ、そういうところまで作り込んだマクロを書くべきか?マクロにはざっとした処理だけさせて、細かい修正は手作業でするか?は、実務上の要請次第です。

手作業でなおすなら、たとえば、『「市」や「町」という文字が2つ以上見つかった場合には、どっかの列に「×」と記入する』、そして、あとは、目視や、ショートカットキー [Ctrl] + [↑] または [↓] でその列に記入された値を調査していく、という感じでマクロに支援させるというのもあります。

いただいたサンプルについても、 Select Case 文や Split関数といった発展編1、発展編2で学べるノウハウを組み合わせるとより華麗にすっきりとした、メンテナンス性高いコードで書き上げられるようになります。

ひきつづきお楽しみください☆


8938 : 受講生さんのコメント (2017-09-26 13:58:12)

質問ですが、各回のコメントをチェックしていると動画18で一旦基礎編のフォローアップは完結していたのですかね?
動画19以降は後から追加されたもののようですが、動画35までを目標に進めていきます。
本講座をとても気に入っていますので、発展編1も引き続きやりたいところ
ですが経済的な理由もありますので、まずは基礎編を固めたいと思っております。


8937 : 金子 伊智郎さんのコメント (2017-09-26 13:50:20)

問題[2]ですが、B11="東京都町田市○×123-1", B12="福島県郡山市○×123-1" などと入れてテストしましたが前者ばNG,後者はOKでした。
ですので若干改修してみました。
他にもうまくいかないケース(千葉県市原市など)は多々あると思いますが
このセンテンスでは全パターンを網羅するマクロを作成する(=品質を高める)のが目的ではないと理解しておりますのでこれで良しとします。

Sub bunkatsu2()
    Dim gyo
    Dim todofuken_idx
    Dim shikugun_idx
    Dim jyusho
    
    For gyo = 2 To 12
        jyusho = Range("B" & gyo).Value
        If Left(jyusho, 3) = "東京都" Then
            todofuken_idx = Len("東京都")
        ElseIf Left(jyusho, 3) = "北海道" Then
            todofuken_idx = Len("北海道")
        ElseIf Left(jyusho, 3) = "大阪府" Then
            todofuken_idx = Len("大阪府")
        ElseIf Left(jyusho, 3) = "京都府" Then
            todofuken_idx = Len("京都府")
        ElseIf InStr(jyusho, "県") > 0 Then
            todofuken_idx = InStr(jyusho, "県")
        End If
        Range("C" & gyo).Value = Left(jyusho, todofuken_idx)
    
        If InStr(todofuken_idx + 1, jyusho, "町田市") > 0 Then
            shikugun_idx = InStr(jyusho, "町田市") + 2
        ElseIf InStr(todofuken_idx + 1, jyusho, "村") > 0 Then
            shikugun_idx = InStr(jyusho, "村")
        ElseIf InStr(todofuken_idx + 1, jyusho, "町") > 0 Then
            shikugun_idx = InStr(jyusho, "町")
        ElseIf InStr(todofuken_idx + 1, jyusho, "区") > 0 Then
            shikugun_idx = InStr(jyusho, "区")
        ElseIf InStr(todofuken_idx + 1, jyusho, "市") > 0 Then
            shikugun_idx = InStr(jyusho, "市")
        ElseIf InStr(todofuken_idx + 1, jyusho, "郡") > 0 Then
            shikugun_idx = InStr(jyusho, "郡")
        End If
        
        Range("D" & gyo).Value = Mid(jyusho, todofuken_idx + 1, shikugun_idx - todofuken_idx)
        Range("E" & gyo).Value = Mid(jyusho, shikugun_idx + 1)
    
    Next

End Sub


8806 : 小川慶一の回答 (2017-08-30 16:43:53)

浦山大さん:

よい学びになっているようでなによりです。
ひきつづきお楽しみください☆


8800 : 浦山大さんのコメント (2017-08-29 23:18:00)

何とかこの問題までは時間はかかるものの自力で書けるようになりました。
失敗しまくったあとに動画を見ると魔法の様ですね^^;
こういう方針、
こういうアプローチで進めればいいのか、
と頷く部分が多いです。

まだ練習している時間が足りないと思っています。
9月半ばで一通り完了を目指して繰り返していきます!


6422 : 受講生さんのコメント (2016-04-12 23:58:14)

小川先生:

>select case、まあ発展編1で解説してもよかったのですが。。じゃ、発展編1のフォローにこの動画引っ越そうかなw
できましたら、ぜひお願いいたします。

>受講生 さん:
>
>条件分岐のバリエーションはあればあるほどよいですね。
>select case、まあ発展編1で解説してもよかったのですが。。じゃ、発展編1のフォローにこの動画引っ越そうかなw
>
>>最初は4番目が「県」かどうかで判定していましたが、それでは「都道府県」が存在しない場合に対応できないことに気づきました。
>>前半に一瞬表示される「市区郡町村」にもSelect Caseを使う方法は、大変参考になりました。なのに、発展編1フォローで解説されていないのが不思議に思いました。
>>


6397 : 小川慶一の回答 (2016-04-12 10:43:13)

受講生 さん:

条件分岐のバリエーションはあればあるほどよいですね。
select case、まあ発展編1で解説してもよかったのですが。。じゃ、発展編1のフォローにこの動画引っ越そうかなw

>最初は4番目が「県」かどうかで判定していましたが、それでは「都道府県」が存在しない場合に対応できないことに気づきました。
>前半に一瞬表示される「市区郡町村」にもSelect Caseを使う方法は、大変参考になりました。なのに、発展編1フォローで解説されていないのが不思議に思いました。
>


6368 : 受講生さんのコメント (2016-04-09 19:33:59)

最初は4番目が「県」かどうかで判定していましたが、それでは「都道府県」が存在しない場合に対応できないことに気づきました。
前半に一瞬表示される「市区郡町村」にもSelect Caseを使う方法は、大変参考になりました。なのに、発展編1フォローで解説されていないのが不思議に思いました。


3日がかりのその仕事、3分で終わらせる方法教えます。ガラパゴスタディーオンライン講座 ユーザー登録

本講座の動画一覧

  1. 【動画1】 住所情報を都道府県から市区町村レベルで細かく分割する
    【動画1】 住所情報を都道府県から市区町村レベルで細かく分割する 未習得
  2. 【動画2】 保険料額表から標準報酬額ごとの保険料負担額を算出する
    【動画2】 保険料額表から標準報酬額ごとの保険料負担額を算出する 未習得
  3. 【動画3】 セル内の文字列から区切り文字を見つけ、その出現回数+1回だけデータ転記する
    【動画3】 セル内の文字列から区切り文字を見つけ、その出現回数+1回だけデータ転記する 未習得
  4. 【動画4】 セル内の文字列から区切り文字を見つけ、その区切り文字の間にある文字列を切り出す
    【動画4】 セル内の文字列から区切り文字を見つけ、その区切り文字の間にある文字列を切り出す 未習得
  5. 【動画5】 セル内の文字列から区切り文字を見つけ、その区切り文字の間にある文字列を反映しつつデータ転記する
    【動画5】 セル内の文字列から区切り文字を見つけ、その区切り文字の間にある文字列を反映しつつデータ転記する 未習得
  6. 【動画6】 VLookUp関数、Index関数、Match関数より便利なマクロ-該当する行が見つからない場合の処理をアレンジ
    【動画6】 VLookUp関数、Index関数、Match関数より便利なマクロ-該当する行が見つからない場合の処理をアレンジ 未習得
  7. 【動画7】 VLookUp関数、Index関数、Match関数より便利なマクロ-複数シート間、複数ファイル間でのマッチング
    【動画7】 VLookUp関数、Index関数、Match関数より便利なマクロ-複数シート間、複数ファイル間でのマッチング 未習得
  8. 【動画8】 転記先シートを生成してデータを流し込む。
    【動画8】 転記先シートを生成してデータを流し込む。 未習得
  9. 【動画9】 転記先ファイルを生成してデータを流し込む。
    【動画9】 転記先ファイルを生成してデータを流し込む。 未習得
  10. 【動画10】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で作成する。
    【動画10】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で作成する。 未習得
  11. 【動画11】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で同一ファイル内に連続的に作成する。
    【動画11】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で同一ファイル内に連続的に作成する。 未習得
  12. 【動画12】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で複数の別ファイルとして連続的に作成する。
    【動画12】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で複数の別ファイルとして連続的に作成する。 未習得
  13. 【動画13】 ファイル配布→配布先でのデータ記入→記入済データを手元資料に統合
    【動画13】 ファイル配布→配布先でのデータ記入→記入済データを手元資料に統合 未習得
  14. 【動画14】 データ記入用ファイルを配布する-その1
    【動画14】 データ記入用ファイルを配布する-その1 未習得
  15. 【動画15】 データ記入用ファイルを配布する-その2
    【動画15】 データ記入用ファイルを配布する-その2 未習得
  16. 【動画16】 各部署からファイルを回収し、記入済データを手元資料に統合その1
    【動画16】 各部署からファイルを回収し、記入済データを手元資料に統合その1 未習得
  17. 【動画17】 各部署からファイルを回収し、記入済データを手元資料に統合その2
    【動画17】 各部署からファイルを回収し、記入済データを手元資料に統合その2 未習得
  18. 【動画18】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その1)
    【動画18】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その1) 未習得
  19. 【動画19】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その2-1)
    【動画19】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その2-1) 未習得
  20. 【動画20】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その2-2)
    【動画20】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その2-2) 未習得

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ