なんでもエクセル(Nandemo Excel)

何でもエクセルでやってしまう そこのあなた。ようこそ

Power Query:住所から地域名を表示する

例えば住所を地域別に分類したい時、アプローチの方法は色々ある。アイテムアクセスを使うか列のマージを使うか。一長一短あるので使いどころ次第かと思う。

最初に「住所一覧」と「地域区分」のテーブルがあるものとして、まずはそれぞれのクエリを作成する。この時ある程度、加工しておくと使い勝手がいい。住所一覧には「都道府県名」列を追加しておこう。都道府県名の抽出は、「左から4文字目が『県』だったら4文字、それ以外は3文字を左から抜き出す」でOK。

住所一覧

let     ソース = Excel.CurrentWorkbook(){[Name="住所一覧"]}[Content],     型の変更 = Table.TransformColumnTypes(ソース, {"住所", type text}),     都道府県列の追加 = Table.AddColumn(         型の変更, "都道府県名", each         Text.Start([住所], 3+Number.From(Text.Middle([住所], 3, 1)="県")),         type text     ) in     都道府県列の追加

地域区分表には順番列(最初から入っているなら飛ばしてOK)と地域ごとの連番列を追加する。グループごとに連番を付加する方法は、前回の記事参照のこと。

地域区分

let     ソース = Excel.CurrentWorkbook(){[Name="地域区分"]}[Content],     変更された型 = Table.TransformColumnTypes(ソース, {         {"区分", type text}, {"都道府県名", type text}     }),     都道府県分割 = Table.TransformColumns(         変更された型, {"都道府県名", each Text.Split(_, "、"), type list}     ),     順番列の追加 = Table.AddIndexColumn(         都道府県分割, "順番", 1, 1, Int64.Type     ),     列の展開1 = Table.ExpandListColumn(順番列の追加, "都道府県名"),     行のグループ化 = Table.Group(         列の展開1, {"区分"}, {             "テーブル",             each Table.AddIndexColumn(_, "連番", 1, 1),             type table [都道府県名=text, 順番=number, 連番=number]         }     ),     列の展開2 = Table.ExpandTableColumn(         行のグループ化, "テーブル", {"都道府県名", "順番", "連番"}     ) in     列の展開2

こうしておくことと、後でソートしやすくなる。

ではまず、元の住所の順番通りに地域区分列を追加する場合。列のマージだと展開時に順番がずれてしまうので、アイテムアクセスのほうが便利はいい。


順番そのままで区分列を追加する方法 let     区分列の追加 = Table.AddColumn(         住所一覧, "区分", each             let 都道府県名=[都道府県名]             in 地域区分{[都道府県名=[都道府県名]]}[区分],         type text     ),     列の削除 = Table.RemoveColumns(区分列の追加,{"都道府県名"}) in     列の削除

次は順番を地域区分の順にする場合。こっちはマージしてからソートするのがお勧め。


地域区分の順に区分列を追加する方法1 let     クエリのマージ = Table.NestedJoin(         住所一覧, {"都道府県名"},         地域区分, {"都道府県名"},         "マージ", JoinKind.LeftOuter     ),     マージ列の展開 = Table.ExpandTableColumn(         クエリのマージ, "マージ",         {"順番", "連番", "区分"}     ),     行のソート = Table.Sort(マージ列の展開, {{"順番", 0}, {"連番", 0}}),     列の選択 = Table.SelectColumns(行のソート, {"区分", "住所"}) in     列の選択

「地域区分のほうにマージしてやれば」と思うかもしれないけど、それをやると同じ都道府県の住所の中で順番がずれてしまう。


地域区分の順に区分列を追加する方法1 let     クエリのマージ = Table.NestedJoin(         地域区分, {"都道府県名"},         住所一覧, {"都道府県名"},         "マージ", JoinKind.LeftOuter     ),     マージ列の展開 = Table.ExpandTableColumn(         クエリのマージ, "マージ", {"住所"}     ),     行の抽出 = Table.SelectRows(マージ列の展開, each [住所] <> null),     行のソート = Table.Sort(行の抽出, {{"順番", 0}, {"連番", 0}}),     列の選択 = Table.SelectColumns(行のソート,{"区分", "住所"}) in     列の選択

別に気にしないならこっちでも。

Table.Sortの「Order.Ascending」を「0」(「Order.Descending」は「1」)にするのは横着技なので、お勧めしない。手打ちがめんどくさい時、思わずやっちゃうけど。