![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/合算.jpg)
今回は上の画像のようにデータが複数シートに散らばっており、しかも行見出し位置/ヘッダー行が不規則なデータを一括で取得します
今回の最大のポイントは、List関数で行見出しの位置を取得する点です
そこさえクリアすれば、意外と簡単にできます
では、今回使用するデータと行いたい事の確認から解説を始めます
今回使用するデータと行いたい事
今回使用するのは次のファイルです
このファイルの中には3つのシートがあります
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/image-66.png)
但し、前述のように3つのシートそれぞれの行見出し位置が違います
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/合算.jpg)
2020年1月のデータは1行目から始まっていますが、2月のデータは2行目から始まります
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/2-2.jpg)
そして、3月のデータは3行目からです
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/3.jpg)
この3つのシートからM関数を組み合わせてデータを一括で取得するのが、今回行いたい事です
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/image-68.png)
今回のポイント
今回の最大のポイントは、前述のようにList関数で行見出し位置を取得することです
行見出し位置を取得するには、行見出しにある「客先コード」をキーにして、M関数「List.PositionOf」を使います
List.PositionOf関数の他にも2つM関数を組み合わせます
List.PositionOf
List.PositionOf関数はリストの中から、指定の値の位置を取得します
書き方は、次の通りとなります
List.PositionOf(リスト名,取得したい値)
ここで、注意点が1点あります
M言語は0ベースである点です
例えば、List.PositionOf関数を使用すると、次の画像の「客先コード」の位置は1ではなく「0」とでます
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/1-2.jpg)
これは、M言語が0で始まる仕組みになっているからです
Table.RemoveFirstN
Table.RemoveFirstNは、テーブルから指定した行数を削除するM関数です
書き方は次のように書きます
Table.RemoveFirstN(テーブル名, 削除する行数)
Table.PromoteHeaders
Table.PromoteHeadersは、1行目を見出しに昇格させるM関数です
Power Queryエディタ内にも同じメニューがあります
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/image-82.png)
今回の内容は、後述しますがM関数で行った方がベターです
このM関数の書き方は、次の通りとなります
Table.PromoteHeaders(テーブル名)
今回のポイントである、3つのM関数の内容を確認したところで、本格的な解説をはじめます
ファイルの読込
まず最初に、前述のサンプルファイルの読込処理を行います
サンプルファイルとは別のファイルで、下の画像の処理を行います
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/image-69.png)
上の画面の「ブックから」で前述のサンプルファイルを指定した後、Power Queryエディタ(以降、エディタ)が開くと次の画像のような状態になっています
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/image-70-644x105.png)
上の画像の左から2つ目の列にある「Data」が今回のポイントの一つです
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/image-71.png)
各行にある「Table」の文字の横をクリックすると、次のGIF画像のように中味が見れます
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/マイビデオ-6.gif)
次からはこの「Data」列を活用して、カスタム列をM関数により作成します
カスタム列の作成
List.PositionOf関数で行位置を抽出
では、カスタム列・作成画面を開きましょう
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/image-72.png)
ここで確認ですが、行位置を取得する対象は下の画像の「客先コード」の文字です
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/image-73.png)
上の画像を見ると、「客先コード」にはⅰ)Data/Table➡ⅱ)Column1➡ⅲ)客先コードの順で指定するとたどり着けるようになっています
カスタム列・作成画面でも、M関数/List.PositionOfでの引数設定時に上の流れを使用して指定します
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/image-74.png)
上の画像のようにList.PositionOf関数の引数を次の様に指定します
第一引数:[Data][Column1]
第二引数:”客先コード”
そして、カスタム列・作成画面の下にあるOKボタンを押すと次の画像のように客先コードの位置が出力されます
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/image-75.png)
あくまでM言語は0から始まるので、その点についてはご注意ください
1行目の内容では、客先コードは1行目にありますがM言語のベースに従って0と出力されています
Table.RemoveFirstNで不要な行の削除
List.PositionOf関数により行見出しの位置は抽出できましたので、「行見出しの位置-1」分の行数をM関数/Table.RemoveFirstNを使用して削除します
Table.RemoveFirstN関数の書き方は、前述の通り次の通りです
Table.RemoveFirstN(テーブル名, 削除する行数)
今回は上の第一引数のテーブル名には、[Data]を入力します
そして、第二引数には上のList.PositionOf関数をー1をせずにそのまま設定します
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/image-76.png)
上の画像の通りに数式を指定してOKボタンを押すと、「本来、行見出しにするべき行/客先コードのある行」が次の画像のように1行目に来ています
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/image-77.png)
但し、このまま作成されたテーブルを展開すると不都合な点が1点あります
本来、行見出しにするべき行が行見出し/ヘッダーになっていませんので、このまま展開作業をすると不要な行見出しがデータとして入り込んでしまいます
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/image-78.png)
ですので、もう一つのM関数で不要な行を削除できるようにします
Table.PromoteHeadersで見出し行を作成
では、最後の仕上げとして各テーブルの1行目を見出し行/ヘッダーにします
こちらは、M関数/Table.PromoteHeadersの()の中にこれまでの内容を入れるだけです
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/image-79.png)
Table.PromoteHeaders関数の内容を反映した結果が次の画像です
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/image-80.png)
上の画像の内容で、各テーブルを展開処理すればいいのですが、その前に既存の列は削除しておきましょう
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/image-81.png)
「他の列の削除」が終了したら、後は各テーブルを展開するだけ終了です
![](https://analytic-vba.com/wp/wp-content/uploads/2021/06/tennkai.gif)
<まとめ>
今回は、List.PositionOf関数をはじめとする3つのM関数を組み合わせて、不規則なデータを一括で処理できるようにしました
最大のポイントは、不規則な行見出しの位置をM関数で取得する点です
それさえできれば、後は機械的にM関数を組み合わせるだけで一括処理ができるようになりました
今回の題材は、M関数の魅力、そしてM言語の魅力を知るのにいい題材だったと思います
ぜひ手を動かして体験してみてください
長文に最後までお付き合いいただきありがとうございました
参考までに、今回の内容の完成版のファイルを添付します
![にほんブログ村 資格ブログ ビジネススキルへ](http://qualification.blogmura.com/businessskill/img/businessskill88_31.gif)
![にほんブログ村 IT技術ブログ VBAへ](http://it.blogmura.com/vba/img/vba88_31.gif)