DataTableの列の並びの変更方法について(その2)

## 皆もすなるQiitaといふものを、儂もしてみむとてするなり。

と言う訳で、こん＊＊は！はなっち！です。

【初めに】
前回、[DataTableの列の並びの変更方法について](https://qiita.com/HANACCHI/items/67463278496df2025071 "DataTableの列の並びの変更方法について")を投稿したのですが、色々と調べていて、もっと楽ちんな方法があったので、これをまとめてみようと思います。

- - - 
## [DataColumn]の[SetOrdinal]メソッドを使用する。
[DataColumn]の[SetOrdinal]メソッドは、DataColumn の序数または位置を、指定された序数または位置に変更するものです(※表現を変えました)。

例えば、
```DataTable.Columns(0).SetOrdinal(3)```
とすると、最左端の列(0番目)を、変更した結果、最左端の列を0番目として数えた3番目の列に据えることを指します（構文はイメージ）。

【例】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/3e5a897f-54b8-c1e3-0abe-6a1a17e07912.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/0c926f75-dfb3-7767-f68f-acf4ff0b1705.png)

この起点となる列番号と、行先の列番号をしっかりコントロールすれば、列の並びをうまく変更できることになります。

- - - 
- ## では、UiPathで仕上げていきましょう！

前提として、列レイアウトの情報は、変数としてString型配列で定義しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/8440825b-42e6-0f6c-9f21-45e32a0414a6.png)
入力のDataTableは、EXCELから読み込んだものとします。レイアウトは、以下の図とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/1c970b82-ffc8-7cc4-d7a9-748cabf5b2ff.png)


### その１）入力DataTableから、不要な列を削除する。
入力のDataTableから、列レイアウトの情報に無い列は、「データ列の削除」アクティビティを使用して、削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/d70f387e-62ad-f933-2690-29ff4de9142f.png)

ここでのポイントは、「繰り返し（コレクションの各要素）」アクティビティの「次のコレクション内の各要素」の指定です。

本来なら、対象とするテーブルに属する列のコレクションを指定するのですが、「データ列の削除」が実行されると対象とするテーブルの列のコレクションが変化し、「繰り返し（コレクションの各要素）」アクティビティに悪影響を与えます。ですので、〔対象とするテーブル〕ではなく、DataTable.Clone メソッドを使って、〔対象とするテーブルの.Cloneされたテーブル〕を指定しています。

### その２）入力DataTableへ、必要な列を追加する。
列レイアウトの情報が、入力のDataTableに無い列は、「データ列の追加」アクティビティを使用して、列を追加します。列の型はObjectでいいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/6ef6e25c-b77b-25fc-a8af-c4248576c763.png)

### その３）入力DataTableの列を、列の情報に合わせて列の並びを変更する。
「メソッドを呼び出し」アクティビティを使用して、DataColumn.SetOrdinal(Int32) メソッドを呼び出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/4f1db3c5-3269-58c7-ca71-d06d3f316000.png)

「メソッドを呼び出し」アクティビティでは、ターゲットオブジェクトは、移動する前の列情報（序数）、コレクションとして、移動先の序数を指定します。

ターゲットオブジェクト：
DT.Columns(DT.Columns(C).Ordinal)
⇒DT.Columns(DT.Columns(列レイアウトの1つ).序数)
コレクション：
DT.Columns.Count - 1
⇒DTの列数 - 1   ... これで最終列の後ろに移動できる。

### 処理結果
入力DataTable
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/1c970b82-ffc8-7cc4-d7a9-748cabf5b2ff.png)
列レイアウトの情報
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/8440825b-42e6-0f6c-9f21-45e32a0414a6.png)
↓
処理結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/851b790e-9940-64a8-b3ea-72c0b04d88c4.png)
はい！完璧ですね！
## 【まとめ】
・不要な列は早めに削除してしまいましょう！
・後の処理で手間が掛からないよう、足りない列は事前に用意しておきましょう！
・SetOrdinalで、サクッと列位置を変更してしまいましょう！
- - - 

## おわりに
いかがでした？

この方法を使うと、変更後の列レイアウトを持った受け側のDataTableの領域を保有する事がなく、メモリの節約になるのではないか？と思うのです。しかも、実際に高速で処理できているのではないか？とも思うわけです。
とはいえ、開発者の好き好き、維持メンテする人の技量に合わせて、その方法は選択してくださいね。

今回も読んでいただきありがとうございました！
是非UiPathでのロボ開発の一助になればと思っています。

ありがとうございました！
## 【参考】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/c5f914d2-cebc-c746-dece-b15d269fa505.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/5ac0ec19-60dd-93d8-ecf8-82395e619bf1.png)