0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Power Automate DesktopでDataTableから特定の複数列を抽出する

0
Last updated at Posted at 2026-03-15

概要

Power Automate Desktopで DataTable を扱う際、「必要な列だけを取り出したい」というケースがあります。
ただし、PAD の標準アクションでは「列の削除」は可能なものの、不要な列を1つずつ削除していく必要があり、列数が多い場合はループ処理が煩雑になりがちです。

本記事では、「.NET スクリプト実行(VB.NET)」アクションを利用して、Datatableから特定の複数列をまとめて抽出する方法を紹介します。
※Power Fxを有効化した状態で説明しています。

やりたいこと

たとえば、以下のような DataTable があるとします。

  • 0列目:社員番号
  • 1列目:氏名
  • 2列目:部署
  • 3列目:メールアドレス

このとき、1列目 と 2列目 だけを取り出して、新しい DataTable として保持したい、というイメージです。

実装概要

「.NET スクリプト実行」アクションを使用し、言語には「VB.NET」を指定します。
本実装では、以下を行います。

  1. 抽出対象の列インデックス文字列を分割し、列番号の一覧を作成する
  2. 指定された列だけを持つ新しい DataTable を作成する
  3. 元の DataTable の各行から、必要な列の値だけを新しい DataTable にコピーする

この方法を使うことで、不要な列を削除していくのではなく、必要な列だけを新しい DataTable として作成できるため、処理をシンプルにできます。


'--------------------------------------------
' strKeepIndexes に「残したい列のインデックス」を ; 区切りで渡す想定
' 例: "0;2;5"  → 0列目, 2列目, 5列目を残す
'--------------------------------------------

' 残す列インデックスを格納する List
Dim indexes As New System.Collections.Generic.List(Of Integer)

' 文字列を ; で分割して1つずつ処理
For Each s As String In strKeepIndexes.Split(";"c)
    ' 空文字や空白だけの要素は無視
    If s.Trim() <> "" Then
    ' "2" などの文字を Integer に変換して List に追加
        indexes.Add(System.Int32.Parse(s.Trim()))
    End If
Next


'--------------------------------------------
' 出力用の DataTable を新規作成
'--------------------------------------------
Dim dt As New System.Data.DataTable()


'--------------------------------------------
' 1) 出力DataTable(dt) に「残す列」だけ作成する
'    dtInput から列名と型(DataType)を引き継ぐ
'--------------------------------------------
For Each idx As Integer In indexes
    dt.Columns.Add(dtInput.Columns(idx).ColumnName, dtInput.Columns(idx).DataType)
Next


'--------------------------------------------
' 2) dtInput の各行を走査して、残す列だけコピーする
'--------------------------------------------
For Each row As System.Data.DataRow In dtInput.Rows
    ' 出力用DataTable(dt) の新しい行を作成(まだ dt には追加されない)
    Dim newRow As System.Data.DataRow = dt.NewRow()

    ' indexes に入っている「残す列」だけを順番にコピー
    ' ※ newRow(i) は出力側の i列目(0~)を意味する
    For i As Integer = 0 To indexes.Count - 1
    ' 入力行 row の「指定列(indexes(i))」の値を、出力行 newRow の i列目へ
        newRow(i) = row(indexes(i))
    Next
    ' 作成した行を出力DataTableに追加
    dt.Rows.Add(newRow)
Next


'--------------------------------------------
' 最終結果を dtOutput に返す
'--------------------------------------------
dtOutput = dt

スクリプトパラメーター設定

以下のように 入力値(In)と出力値(Out)を設定します。

入力値(In)

  • dtInput
    抽出元となる DataTable

  • strKeepIndexes
    抽出したい列インデックスを ; 区切りで指定した文字列
    例:1;2

出力値(Out)

  • dtOutput
    抽出後の DataTable

実行イメージ

たとえば、元の DataTable の列構成が以下だったとします。

  • 0列目:社員番号
  • 1列目:氏名
  • 2列目:部署
  • 3列目:メールアドレス

この状態で strKeepIndexes "1;2"を指定すると、出力される dtOutput には、次の2列だけが含まれます。

  • 氏名
  • 部署

また、strKeepIndexes の指定順がそのまま出力列の順番になるため、"2;1"と指定すれば、出力列も 部署 → 氏名 の順になります。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?