(Power BI) エクセルのシートを選択して複数のブックのデータを結合する ：Mから始めよう #13

　「[Mから始めよう #11 Excel 複数のブックの複数のシートのデータを取り出す](https://qiita.com/spumoni/items/6c9d249514b0a26e2f60)」の続きです。

　全部のシートを結合する場合は、前に説明したとおりですが、シートを選択して結合したい場合の方が多いと思います。その場合のやり方です。

# シート名を指定する

## シート名を直接指定する

 シート名を指定する方法は、#11の途中でフィルターをかけるステップを追加してやればできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/13a17603-aaec-a424-0356-69a9b4d53e57.png)

　Combineを使ったファイル名、シート名なしの場合は、一旦シート名を表示させ、フィルターをかけてからCombineします。

```
let
    Source = Folder.Files(folder),
    // Excelデータソースへのアクセス
    Workbook = 
        Table.TransformColumns(
            Source,
            {
                "Content",
                each
                    Excel.Workbook(_, true)
            }
        ),
    // シートをばらす（シート名付き）
    Expand = 
        Table.ExpandTableColumn(
            Workbook, 
            "Content", 
            {"Name", "Data"}, 
            {"Sheet", "Data"}
        ),
    // Sheet1とSheet2を選択
    FilteredRows = 
        Table.SelectRows(
            Expand, 
            each ([Sheet] = "Sheet1" or [Sheet] = "Sheet2")
        ),
    // 各シートのデータを結合
    Combine = Table.Combine(FilteredRows[Data])

in
    Combine
```

## シート名をパラメータで指定する

　選択するシートをパラメータで指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/2b026ab6-16c9-9b46-6713-43b28c756adc.png)
　ここでは、複数のシートを選択できるように、カンマで区切って入力しています。１つだけの場合は、そのシート名だけでいいです。

```
let
    Source = Folder.Files(folder),
    // Excelデータソースへのアクセス
    Workbook = 
        Table.TransformColumns(
            Source,
            {
                "Content",
                each
                    Excel.Workbook(_, true)
            }
        ),
    // シートをばらす
    Expand = 
        Table.ExpandTableColumn(
            Workbook, 
            "Content", 
            {"Name", "Data"}, 
            {"Sheet", "Data"}
        ),
    // シート選択
    FilteredRows = 
        Table.SelectRows(
            Expand, 
            each List.Contains(Text.Split(SheetNames, ","), [Sheet])
        ),
    // 各シートのデータを結合
    Combine = Table.Combine(FilteredRows[Data])

in
    Combine
```
　パラメータの文字列をText.Splitでリストに変換し、List.Containsでシート名と比較する処理をしています。

# シート番号で選択する
## シート番号を直接指定する１

　1番最初のシートのデータだけを結合するとか、２番目のシートだけ結合するとかしたい場合は、シート番号を直接指定してやります。

```
let
    Source = Folder.Files(folder),
    // ファイル名とデータ項目を取得
    RemovedOtherColumns = 
        Table.SelectColumns(
            Source,
            {"Content", "Name"}
        ),
    // NameをFileNameに変更
    Rename = Table.RenameColumns(
        RemovedOtherColumns,
        {"Name", "FileName"}
    ),
    // FileNameを１番目に移動
    Reorder = Table.ReorderColumns(
        Rename,
        {
            "FileName",
            "Content"
        }
    ),
    // Excelデータソースへのアクセス
    Workbook = 
        Table.TransformColumns(
            Reorder, 
            {
                "Content", 
                each Excel.Workbook(_, true)
            }
        ),
    // Contentからシート名とシートデータを取得
    RenameColumn = 
        Table.RenameColumns(
            Workbook,
            {{"Content", "Data"}}
        ),
    ExpandSheets = 
        Table.TransformColumns(
            RenameColumn,
            {
                "Data",
                each _{0}[Data]   // １番目のシートを選択
            }
        ),
    // シートデータを結合
    Expand = 
        Table.ExpandTableColumn(
            ExpandSheets,
            "Data",
            List.Union(                       // 個別のリスト項目の和集合を作成
                List.Transform(               // 変換関数をリストに適用して新しいリストを返す
                    ExpandSheets[Data],
                    each Table.ColumnNames(_)
                )
            )
        )
in
    Expand
```

　 each _{0}[Data] の部分で、0から始まるのがシート番号です。２番目のシートを選択したい場合は、each _{1}[Data]となります。
　ただし、２番目のシートが存在しない場合は全体がエラーになってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/f62374ba-474b-3b91-d7e1-813623fa3783.png)

## シート番号を直接指定する
　シート番号を表示する項目を追加してやります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/8ca89a53-2fc9-050a-97ee-1147789bf2ce.png)
　この項目に対してフィルターをかけてやれば、上記のエラーは発生しません。

```
let
    Source = Folder.Files(folder),
    // Excelデータソースへのアクセス
    Step1 = Table.TransformColumns(
        Source,
        {
            "Content",
            each Excel.Workbook(_, true)
        }
    ),
    // Contentにファイル名を埋め込む
    Step2 = Table.AddColumn(
        Step1,
        "Workbooks",
        (x)=>
            Table.AddColumn(
                x[Content],
                "File",
                each x[Name]
            )
    ),
    AddSheetNo = Table.TransformColumns(
        Step2,
        {
            {
                "Workbooks",
                each Table.AddIndexColumn(_, "SheetNo", 1)
            }
        }
    ),

    // ファイル名が埋め込まれたテーブルを結合
    Step3 = Table.Combine(
        AddSheetNo[Workbooks]
    ),
    // Dataにファイル名、シート名を埋め込む
    Step4 = Table.AddColumn(
        Step3,
        "Worksheets",
        (x)=>
            Table.AddColumn(
                x[Data],
                "File Sheet",
                each [File = x[File], Sheet = x[Name], SheetNo = x[SheetNo]]
            )
    ),
    // ファイル名、シート名が埋め込まれたテーブルを結合
    Step5 = Table.Combine(Step4[Worksheets]),
    // ファイル名、シート名を展開
    Step6 = Table.ExpandRecordColumn(
        Step5,
        "File Sheet",
        {"File", "Sheet", "SheetNo"}
    ),
    FilteredRows = Table.SelectRows(Step6, each ([SheetNo] = 1))
in
    FilteredRows
```
　Step2の後、AddSheetNoのステップで、Workbooksの中のテーブルに対してTable.AddIndexColumnで１番から始まるシート番号を付与しています。そのあと、最後のFilteredRowsのステップで、シート番号１を指定してフィルターをかけています。

## シート番号をパラメータで指定する
　パラメータ SheetNosを以下のように設定し、１～３番めのシートのデータを結合します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/9c67942c-ff49-bc6e-ae84-94b51397da40.png)

```
    FilteredRows = 
        Table.SelectRows(
            Step6, 
            each List.Contains(Text.Split(SheetNos, ","), Number.ToText([SheetNo]))
        )
```
　先のコードの FilterdRows のステップを書き換え、パラメータを分割して SheetNo の値と比較しています。