パワークエリ備忘録(市町人口を取ってみる)

20231111パワークエリ備忘録(市町人口を取ってみる)

こちらは、パソコン素人です。
久々にパワークエリ(エクセル)をしたのですが、やはり素人です。汗。
(これらは自分用のメモです。)
不都合あれば削除いたします。

 

先日、
ネット(「エクセルの学校」さんの質問・回答『毎月アドレスが変わるwebページからデータを取得したい』について検証しました。

そこでは、気象庁の毎日のデータをパワークエリで取得(欲しい日~最新まで)するものでした。(勉強になりました。感謝。)

 

それを他のwebの記事を取れるように直そうと勉強しています。

 

ということで、隣県●●県内の市町人口のデータを取得するのを作りました。
(注意:この県のデータ、2023年3月からしか同じアドレスにはなかったので、2022年などは遡れません。扱えたのは、2023年3月から。他の県にすればよかった。)

 

気になったことを先に書くと、通常PQは、テーブルからデータを取得して、加工の場合、同じテーブルに書き込むことはできません。
(「クエリの結果をテーブルまたはXMLの対応付けと重ねることはできません。他の場所を選択してください」エラー)
今回、シートは1枚です。テーブルのA2セルの日付(ここは手入力)を使っているのですが、
元データは、webから取るためか、M言語やテーブル名を手作業で修正したためか、
テーブルを増やさずに実行可能でした。

 

他にもいろいろやってみないと分からないこと多い。

ヘッダー(表題)のリネームも、パワークエリのステップで作業していくと、別の月データで試した際、
"2023/04/01"がそのデータでは"2023/05/01"だったりして、変数に置き換えるなど。

パワークエリは、各データを直すようにはできていないので、一部を直すのでなく、列ごとに直したり、
結構変な作業をステップ上でしています。(隔靴掻痒)

あと、詳細エディターで完了を押したり、きちんと読み込んで保存したりしないと、せっかくのコードが保存されてなかったりします。

パラメータは、カッコをなくし、コメントアウトしたりして、なんとなく仕組みを知れました。
(年 as number,月 as number) as table =>

 

あとあと、#が変数名だったり、//がコメントアウトだったり(chatGPT3.5は間違ってました)
半角スペースが不用意に入っていたり、初心者レベルです。

 

分からない場合は、1個1個見本の「気象庁」のクエリを振り返るしかなかったです。
(でも最後の方は、かなり変わりました。)

 

<覚えている違いなど>
元の気象庁データはhtmlだが、これはPDF取得。(取得の仕方も、テーブルの整理も違う)
元の気象庁データは、日単位だが、人口は月単位。年月日の作り方違います。

 

(テーブル:名前も変えます)

 


(下記は自分用コードです。)

*******************************
クエリ名:fnテーブル取得
(年 as number,月 as number) as table =>

let
    和暦年 = 年 - 2018,    //いったん和暦に直す必要)
    ソース = Pdf.Tables(Web.Contents("https://www.pref.●●.jp/〇〇/documents/r" & Text.From(和暦年) & "_" & Text.From(月) & "jukijinko.pdf"), [Implementation="1.2"]),
    フィルターされた行3 = Table.SelectRows(ソース, each ([Name] = "Table001 (Page 1)")),
    削除された他の列 = Table.SelectColumns(フィルターされた行3,{"Data"})
in
    削除された他の列


*******************************
クエリ名:住民基本台帳更新
let
    ソース = Excel.CurrentWorkbook(){[Name="住民基本台帳更新"]}[Content],
    開始tbl = Table.Buffer(ソース),
    見出し = Table.ColumnNames(開始tbl),

    開始年月日 = Date.From(Table.Column(開始tbl,見出し{0}){0}),
    取得日 = Date.AddMonths(Date.StartOfMonth(開始年月日),-1),
    開始年 = Date.Year(取得日),
    開始月 =Date.Month(取得日),
   
    今月末 = Date.EndOfMonth(DateTime.Date(DateTime.LocalNow())),
    WEBから = List.Generate(
        ()=>[年 = 開始年,月 = 開始月, 取得月 = 取得日,tbl = #table({},{})], 
        each [取得月] <= 今月末,
        each[
            取得月 = Date.AddMonths([取得月],1),  
            年 = Date.Year(取得月),
            月 = Date.Month(取得月),
            tbl = fnテーブル取得(年,月) 
        ],
        each [[取得月],[tbl]]
),
    テーブルに変換済み = Table.FromList(WEBから, Splitter.SplitByNothing(), null, null, ExtraValues.Error),  //自動
    削除された最初の行 = Table.Skip(テーブルに変換済み,1),
    #"展開された Column1" = Table.ExpandRecordColumn(削除された最初の行, "Column1", {"取得月", "tbl"}, {"取得月", "tbl"}),
    削除されたエラー = Table.RemoveRowsWithErrors(#"展開された Column1", {"tbl"}),  //列名右クリック削除
    #"展開された tbl" = Table.ExpandTableColumn(削除されたエラー, "tbl", {"Data"}, {"Data"}), //tbl.Data名直し

 
    #"展開された Data" = Table.ExpandTableColumn(#"展開された tbl", "Data", Table.ColumnNames(#"展開された tbl" [Data]{0})),
    フィルターされた行 = Table.SelectRows(#"展開された Data", each ([Column1] <> null and [Column1] <> "合計" and [Column1] <> "市合計" and [Column1] <> "町合計")),
    昇格されたヘッダー数 = Table.PromoteHeaders(フィルターされた行, [PromoteAllScalars=true]),

    firstColumnName = Table.ColumnNames(昇格されたヘッダー数){0},   //修正追加
    
    
    #"名前が変更された列 2" = Table.RenameColumns(昇格されたヘッダー数,{{firstColumnName, "年月日"}}),

    
    変更された型 = Table.TransformColumnTypes(#"名前が変更された列 2",{{"年月日", type date}, {"市町", type text}, {"男", type text}, {"女", type text}, {"計", type text}, {"世帯数", type text}}),
    フィルターされた行1 = Table.SelectRows(変更された型, each ([市町] <> "市町")),

 
    追加されたカスタム = Table.AddColumn(フィルターされた行1, "カスタム", each Date.EndOfMonth([年月日])),
    並べ替えられた列 = Table.ReorderColumns(追加されたカスタム,{"カスタム", "年月日", "市町", "男", "女", "計", "世帯数"}),
    削除された列 = Table.RemoveColumns(並べ替えられた列,{"年月日"}),
    変更された型1 = Table.TransformColumnTypes(削除された列,{{"カスタム", type date}}),
    #"名前が変更された列 1" = Table.RenameColumns(変更された型1,{{"カスタム", "年月日"}})
in
    #"名前が変更された列 1"

 

**********************