LoginSignup
7
7

More than 5 years have passed since last update.

Excelで関数型プログラミングに目覚めたかもしれない。(M言語編)

Last updated at Posted at 2017-12-17

始めに

いや、本当に力尽きてたから。(基礎編、応用編なのは)

M言語入門

Excelに付いているM言語は、本当は簡単なのです。
只、自動生成機能に少し馬鹿なところがあるだけなのです。
詳細エディターで決まり切った関数を並べるだけで、複数のテーブルを操作して
新しいテーブルを簡単に作り出せます。

例1 ロット一覧

3つのテーブル M01_,T01_,T02_ から、年 機械番号、連番(NO)、製品長さ(w)、製品番号(O)、製品名、計画の
データを取ってきます。
M01_ は T01_ の明細で、1ロットで異なる長さのパイプを製造できるので、製品長さ(W) がデータにあります。
関数 Table.Combine で3つのテーブルを結合させます。
関数 Table.SelectRows で不必要なデータを削ります。
関数 Table.Sort でSortし、出てきた結果をテーブルに出力します。
簡単ですよね。お馬鹿なクエリーエディターの不要な型変換を削除し、日本語変数名を、意味の通る短い英文に直し、
入れ子にして変数の数を減らすと綺麗な形が見えてくるでしょう。

let
    M01  = Table.SelectColumns( Excel.CurrentWorkbook(){[Name="M01_"]}[Content],{"年", "機", "NO", "W", "O", "製品名", "計画"}),
    T01  = Table.SelectColumns( Excel.CurrentWorkbook(){[Name="T01_"]}[Content],{"年", "機", "NO", "O", "製品名", "計画"}),
    T02  = Table.SelectColumns( Excel.CurrentWorkbook(){[Name="T02_"]}[Content],{"年", "機", "NO", "O", "製品名", "計画"}),
    M01C = Table.Combine({M01,T01,T02}),
    M01F = Table.SelectRows(M01C, each [製品名] <> null and [製品名] <> ""),
    M01S = Table.Sort(M01F,{{"NO", Order.Descending}, {"年", Order.Descending}})
in
    M01S

例2 出庫一覧

なんかすごい数のテーブルを扱っているように見えますが、テーブル設計を失敗しただけなのです。
T02_ の中に出庫データが6個入っているので、テーブルは、M01_、T02_ の2個しかありません。
Table.RenameColumns で名前を同じにします。
Table.Combineで全部結合するとちゃんと意図した通りのデータができます。
Table.SelectRows で不要なデータを削除します。
Table.Sort でソートした結果をテーブルに書き出します。

let
    M01   = Table.SelectColumns( Excel.CurrentWorkbook(){[Name="M01_"]}[Content],{"年", "機", "NO", "W", "O","日付" , "出庫" ,"済"}),
    T021S = Table.SelectColumns( Excel.CurrentWorkbook(){[Name="T02_"]}[Content],{"年", "機", "NO",      "O","日付1", "出庫1","1" }),
    T022S = Table.SelectColumns( Excel.CurrentWorkbook(){[Name="T02_"]}[Content],{"年", "機", "NO",      "O","日付2", "出庫2","2" }),
    T023S = Table.SelectColumns( Excel.CurrentWorkbook(){[Name="T02_"]}[Content],{"年", "機", "NO",      "O","日付3", "出庫3","3" }),
    T024S = Table.SelectColumns( Excel.CurrentWorkbook(){[Name="T02_"]}[Content],{"年", "機", "NO",      "O","日付4", "出庫4","4" }),
    T025S = Table.SelectColumns( Excel.CurrentWorkbook(){[Name="T02_"]}[Content],{"年", "機", "NO",      "O","日付5", "出庫5","5" }),
    T026S = Table.SelectColumns( Excel.CurrentWorkbook(){[Name="T02_"]}[Content],{"年", "機", "NO",      "O","日付6", "出庫6","6" }),

    T021R = Table.RenameColumns( T021S,{{"日付1","日付"},{"出庫1","出庫"},{"1","済"}}),
    T022R = Table.RenameColumns( T022S,{{"日付2","日付"},{"出庫2","出庫"},{"2","済"}}),
    T023R = Table.RenameColumns( T023S,{{"日付3","日付"},{"出庫3","出庫"},{"3","済"}}),
    T024R = Table.RenameColumns( T024S,{{"日付4","日付"},{"出庫4","出庫"},{"4","済"}}),
    T025R = Table.RenameColumns( T025S,{{"日付5","日付"},{"出庫5","出庫"},{"5","済"}}),
    T026R = Table.RenameColumns( T026S,{{"日付6","日付"},{"出庫6","出庫"},{"6","済"}}),
    M01C = Table.Combine({M01,T021R,T022R,T023R,T024R,T025R,T026R}),
    M01F = Table.SelectRows(M01C, each [日付] <> null and [日付] <> "" and [年] = 2017),
    M01S = Table.Sort(M01F,{{"日付", Order.Descending}, {"機", Order.Ascending}})
in
    M01S

例3 仕掛一覧

SK_ は、仕掛一覧で作成したテーブルです。
わざと一部、エディターで自動生成する名前を残しています。(いや、面倒だったし)
これで、どれだけ理解を妨げてられているのか判ると思います。
変数名を書き換えたり、入れ子に直したりしても、文法的に間違っていなければ、
クエリーエディタは使えるのです。

let
    M01   = Excel.CurrentWorkbook(){[Name="SK_"]}[Content],
    フィルターされた行 = Table.SelectRows(M01, each ([済] = 0)),
    並べ替えられた行 = Table.Sort(フィルターされた行,{{"機", Order.Ascending}, {"日付", Order.Ascending}}),
    削除された列 = Table.RemoveColumns(並べ替えられた行,{"済"})
in
    削除された列

まとめ

お馬鹿な、クエリーエディタの改善を望みます。
あの意味不明な日本語変数名は何とかして下さい。
詳細エディタでまともな形に直してから、クエリーエディタを使うしかありませんよね。

ではでは。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7