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

# 始めに

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

# M言語入門

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

## 例１　ロット一覧

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

```F#
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
```

## 例２　出庫一覧

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

```F#
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

```

## 例３　仕掛一覧

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

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

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

ではでは。