この記事を読むと
- List型変数で使えるメソッド31選を網羅できる
- Uipathでの具体的な実装方法が分かる
- List型変数のIndexエラー回避方法が分かる
UiPathでの自動化プロセス開発において、データを効率的に扱うために欠かせないのがList型変数です。
特に複数のデータを操作する場合、そのメソッドを理解することでコードがシンプルになり、処理速度も向上します。
本記事では、UiPathで使用できるList型変数のメソッドを初心者にも分かりやすく徹底解説します。

UiPathにおけるList型変数とは

そもそもList型変数って?



同じ型の複数のデータを順序付きで格納できる変数です



配列みたいなイメージですね。
でも配列と何が違うの?
List型 VS 配列型
List型の特徴
- 要素数を動的に変更可能
- 要素追加・削除・検索・並べ替えなど豊富なメソッドがある
- 大量データだとややパフォーマンスが低下
配列型の特徴
- 要素数は変更不可
- 配列は便利なメソッドはない
- 大量データでも高速かつ軽量
要素数が固定でパフォーマンス重視の場面は配列を、動的な追加/削除や豊富なメソッドでの柔軟な操作が必要な場面はList型を選びましょう。
List型変数を作成する
UiPathではVB.NET基盤のため、System.Collections.Generic
名前空間のList<T>
クラスが使われています。
List型変数を宣言するには
' 文字列のリスト
Dim strList As New List(Of String)
' 整数のリスト
Dim numList As New List(Of Integer)
' データテーブルのリスト
Dim dtList As New List(Of DataTable)
Uipathでの実装


基本操作メソッド
Add | リストに要素を追加する
構成:Add(引数: 追加する要素)
リストの末尾に単一の要素を追加します。
UiPathでデータを収集して後で処理する場合によく使用します。
使用例
myList.Add("UiPath") → ["UiPath"] (空のリストに文字列を追加)
myList.Add(42) → [10, 20, 30, 42] (既存の数値リストに新しい数値を追加)
UiPathでの使い方
「コレクションに項目を追加」アクティビティを使用します。


AddRange | 複数の要素をまとめてリストに追加する
構成:AddRange(引数: 追加するコレクション)
既存コレクション(配列やリストなど)の要素をすべてリストに追加します。1つずつAddするよりも効率的です。
使用例
myList.AddRange(New Integer() {1, 2, 3}) → [1, 2, 3] (空のリストに配列の要素を追加)
myList.AddRange(anotherList) → [10, 20, 30, 40, 50, 60] (既存のリストに別のリストの要素を追加)
Add と AddRange の使い分け
・Add:単一要素の追加に使用。シンプルで直感的に使えます。
・AddRange:複数要素をまとめて追加する場合に使用。Add を繰り返し呼ぶよりも効率的です。
UiPathでの使い方
「メソッドを呼び出し」アクティビティを使用します。
以下のように「メソッドを呼び出し」で配列型変数「Array」の要素を、List型変数「List」に格納できます。


実行結果


メソッドを呼び出しアクティビティの公式ドキュメント
https://docs.uipath.com/ja/activities/other/latest/legacy-integrations/amazoncomprehend-invoke-method
Clear | リストのすべての要素を削除する
構成:Clear()
リストからすべての要素を削除し、要素数を0にします。
メモリ割り当ては保持されるため、再利用する予定のリストをリセットする際に便利です。
Clearを実行しても、リストの容量(Capacity)は変更されません。
使用例
myList.Clear() → [] (要素がすべて削除された空のリスト)
Count | リスト内の要素数を取得する
構成:Count (プロパティ)
リスト内の要素数を返します。ループの条件や条件分岐での判断によく使用されます。
使用例
myList.Count → 5 (リストに5つの要素がある場合)
myList.Count → 0 (空のリストの場合)
Capacity | リストの容量を取得または設定する
構成:Capacity (プロパティ)
リストが再割り当てなしで格納できる要素の数を取得または設定します。
大量のデータを扱う場合、あらかじめ容量を設定しておくとパフォーマンスが向上します。
使用例
myList.Capacity → 8 (現在の容量が8の場合)
myList.Capacity = 100 → 容量が100に設定される
UiPathでの使い方
変数パネルでListを宣言する際にNew List(Of String)(CapacityCount)
のように設定可能です。





いまいち使うメリットが分かりませんね



主なメリットはパフォーマンスの向上です
- Capacityを適切に設定すると、内部配列の再割り当て(サイズ変更)回数が減少
- 大量データ(1000件以上)の追加時に最大30%程度の処理速度向上
- メモリ使用量は一時的に増加するが、大量のAddやAddRange操作が予想される場合は有効
Capacity と Count の違い
- Count:実際にリストに含まれている要素数を取得
- Capacity:リスト内部で確保されているメモリ領域のサイズを取得・設定可能
Capacityの活用場面
・事前にデータ量が分かっている場合、設定しておくとパフォーマンスが向上
' CSVファイルから1000行を読み込む予定の場合
Dim lines As New List(Of String)(1000)
・大量データの追加前
' 後から大量データを追加する場合
myList.Capacity = 10000
' データ追加処理...
CopyTo | リストの要素を配列にコピーする
構成:CopyTo(引数1: コピー先の配列, 引数2: コピー先の開始インデックス)
リストの要素を既存の配列にコピーします。
UiPathの特定のアクティビティが配列しか受け付けない場合に便利です。
Uipathで使う場合は.ToArrayを使った方が良いです。
コピー先の配列のサイズが十分でない場合、例外が発生します。
コピー先の配列のサイズをNew String(3){}
のように定義する必要があります
使用例
myList.CopyTo(myArray, 0) → リストの全要素が配列の0番目から順にコピーされる
myList.CopyTo(myArray, 2) → リストの全要素が配列の2番目から順にコピーされる
検索関連メソッド
Contains | 要素がリストに含まれているか確認する
構成:Contains(引数: 検索する要素)
指定した要素がリストに含まれているかをチェックし、真偽値を返します。データの存在確認によく使用されます。
使用例
myList.Contains("UiPath") → True ("UiPath"が含まれている場合)
myList.Contains(99) → False (99が含まれていない場合)
BinarySearch | 要素をバイナリサーチで検索する
構成:BinarySearch(引数: 検索する要素)
バイナリサーチアルゴリズムを使用して、リスト内の要素を検索します。
要素が見つかった場合はそのインデックスを、見つからない場合は負の値を返します。
リストは事前にソートされている必要があります。そうでない場合、正しい結果が得られません。
使用例
myList.BinarySearch(30) → 2 (ソート済みリスト[10, 20, 30, 40]の中で30のインデックス=2を返す)
myList.BinarySearch("UiPath") → -3 (要素が見つからない場合、挿入ポイントを示す負の数)
ElementAtOrDefault | 指定したインデックスの要素または既定値を取得する
構成:ElementAtOrDefault(引数: 取得するインデックス)
指定したインデックスにある要素を返します。
インデックスが範囲外の場合は、型の既定値(数値型なら0、参照型ならnullなど)を返します。
Listや配列の存在しないインデックスを指定すると、「オブジェクト参照が存在しません」というエラーになりますが、このメソッドを使うと回避可能です。
使用例
myList.ElementAtOrDefault(2) → 30 (リスト[10, 20, 30, 40]のインデックス2の要素) myList.ElementAtOrDefault(10) → 0 (インデックスが範囲外の場合、int型リストでは0を返す) strList.ElementAtOrDefault(5) → null (インデックスが範囲外の場合、文字列リストではnullを返す)
Uipathでの使い方
存在しないインデックスを指定するとエラーになりますが


このように指定するとエラーにならず、nullを返します。


ElementAtOrDefaultで「オブジェクト参照が存在しません」エラーを回避する
上記性質を活かして条件分岐で使用することで、インデックスが範囲外のエラーを回避することができます。
条件式:Not String.IsNullOrEmpty(List.ElementAtOrDefault(10))
※ListはList型変数です


String.IsNullOrEmptyメソッドの詳細はこちらを参考にしてください。


Exists | 条件に一致する要素があるか確認する
構成:Exists(引数: 判定用のラムダ式や述語)
指定した条件に一致する要素が、リスト内に1つ以上存在するかを確認します。戻り値はTrue/Falseです。
使用例
myList.Exists(Function(x) x > 50) → True (50より大きい要素が存在する場合)
myList.Exists(Function(s) s.StartsWith("Ui")) → True ("Ui"で始まる文字列が存在する場合)
Uipathでの使い方
「コレクション内での有無」アクティビティで完全一致のチェックが可能です。(部分一致などは不可)
完全一致のみチェック可能なので、複雑な条件の場合はExistsメソッドを使うと良いでしょう。


ExistsメソッドをUipathで使用し、ログに結果を出力しています。
1行目がListの中身で、2行目がListに「配列」を含む要素があるか、3行目がListに「配列」という要素があるかの結果です。


UiPathでのラムダ式の書き方
UiPathの式エディタでラムダ式を記述する際の基本パターン
' 基本形
リスト変数.メソッド(Function(x) 条件式)
' 型指定の例(明示的に型を指定する場合)
intList.Exists(Function(x As Integer) x > 50)
' 複数条件(AND条件)
strList.Exists(Function(s) s.Length > 3 AndAlso s.StartsWith("A"))
' 複数条件(OR条件)
numList.Exists(Function(n) n < 0 OrElse n > 100)
' オブジェクトのプロパティを参照する例
userList.Exists(Function(user) user.Age >= 20 AndAlso user.Name.Contains("田中"))
複数行の条件を書く場合は、改行せずに一行で記述する必要があります。
Find | 条件に一致する最初の要素を取得する
構成:Find(引数: 判定用のラムダ式や述語)
指定した条件に一致する最初の要素を返します。複雑な条件での検索に便利です。



ExistsはTrue/Falseを返すけど、Findは要素を返すんですね
使用例
myList.Find(Function(x) x Mod 2 = 0) → 2 (最初の偶数を返す)
myList.Find(Function(s) s.Contains("Path")) → "UiPath" ("Path"を含む最初の文字列)
Uipathでの使い方


FindAll | 条件に一致するすべての要素を取得する
構成:FindAll(引数: 判定用のラムダ式や述語)
指定した条件に一致するすべての要素を含む新しいリストを返します。フィルタリングに最適です。
使用例
myList.FindAll(Function(x) x > 20) → [30, 40, 50] (20より大きいすべての数値を含む新しいリスト)
myList.FindAll(Function(s) s.Length > 5) → ["UiPath", "Studio"] (長さが5を超える文字列のリスト)



Findは最初の要素しか返しませんが、FindAllは全ての要素を返すんですね
FindAll vs LINQ Where
UiPathでは、FindAll
メソッドとLINQのWhere
メソッドどちらも使用できますが、使い分けが重要です。
' FindAllの例
Dim resultList = myList.FindAll(Function(x) x > 20)
' Whereの例(ToListが必要)
Dim resultList = myList.Where(Function(x) x > 20).ToList()
それぞれの利点
- FindAll
- List型のネイティブメソッドで、結果も直接List型として返される
- コードが短く、シンプルな条件のフィルタリングでは若干高速
- 型変換が不要
- Where (LINQ)
- 他のLINQメソッド(Select, OrderBy, GroupByなど)と組み合わせて使える
- 遅延評価されるため、大規模データの段階的処理に有利
- より複雑なクエリが書ける
選択の目安
- シンプルなフィルタリングだけが目的なら →
FindAll
- 複数の操作を連鎖させたい場合 →
Where
を含むLINQ
FindIndex | 条件に一致する最初の要素のインデックスを取得する
構成:FindIndex(引数: 判定用のラムダ式や述語)
指定した条件に一致する最初の要素のインデックスを返します。条件付き検索と位置特定の組み合わせに便利です。
使用例
myList.FindIndex(Function(x) x > 30) → 3 (リスト[10, 20, 30, 40, 50]で30より大きい最初の要素のインデックス)
myList.FindIndex(Function(s) s.StartsWith("S")) → 1 ("S"で始まる最初の文字列のインデックス)
FindLast | 条件に一致する最後の要素を取得する
構成:FindLast(引数: 判定用のラムダ式や述語)
指定した条件に一致する最後の要素を返します。リストの末尾から検索したいケースに便利です。
使用例
myList.FindLast(Function(x) x < 40) → 30 (リスト[10, 20, 30, 40, 50]で40未満の最後の要素) myList.FindLast(Function(s) s.Contains("i")) → "UiPath" ("i"を含む最後の文字列)
FindLastIndex | 条件に一致する最後の要素のインデックスを取得する
構成:FindLastIndex(引数: 判定用のラムダ式や述語)
指定した条件に一致する最後の要素のインデックスを返します。
使用例
myList.FindLastIndex(Function(x) x < 40) → 2 (リスト[10, 20, 30, 40, 50]で40未満の最後の要素のインデックス) myList.FindLastIndex(Function(s) s.EndsWith("o")) → 3 ("o"で終わる最後の文字列のインデックス)
IndexOf | 指定した要素の最初のインデックスを取得する
構成:IndexOf(引数: 検索する要素)
指定した要素が最初に現れるインデックスを返します。要素が見つからない場合は-1を返します。
使用例
myList.IndexOf(30) → 2 (リスト[10, 20, 30, 40, 30]で30の最初のインデックス)
myList.IndexOf("UiPath") → 0 (リストの最初に"UiPath"がある場合)
myList.IndexOf(99) → -1 (要素が見つからない場合)
LastIndexOf | 指定した要素の最後のインデックスを取得する
構成:LastIndexOf(引数: 検索する要素)
指定した要素が最後に現れるインデックスを返します。要素が重複している場合に便利です。
使用例
myList.LastIndexOf(30) → 4 (リスト[10, 20, 30, 40, 30]で30の最後のインデックス)
myList.LastIndexOf("UiPath") → 3 (複数ある"UiPath"の最後のインデックス)
変更・操作メソッド
Insert | 指定した位置に要素を挿入する
構成:Insert(引数1: 挿入するインデックス, 引数2: 挿入する要素)
指定したインデックス位置に要素を挿入します。既存のリストの途中にデータを追加する必要がある場合に便利です。
インデックスが範囲外の場合、例外が発生します。事前にインデックスが範囲内かチェックしましょう。
使用例
myList.Insert(2, 25) → [10, 20, 25, 30, 40] (インデックス2に25を挿入)
myList.Insert(0, "First") → ["First", "Second", "Third"] (リストの先頭に挿入)
Uipathでの使い方
「メソッドを呼び出し」アクティビティを使用します。


InsertRange | 指定した位置に複数の要素を挿入する
構成:InsertRange(引数1: 挿入するインデックス, 引数2: 挿入するコレクション)
指定したインデックス位置に複数の要素を一度に挿入します。リストのマージに使用できます。
使用例
myList.InsertRange(1, New Integer() {15, 25}) → [10, 15, 25, 20, 30] (インデックス1に複数の要素を挿入)
myList.InsertRange(0, anotherList) → [リストの内容がマージされる]
Uipathでの使い方
挿入場所を指定しない場合は「コレクションを結合」アクティビティで代替可能です。


Remove | 指定した要素を削除する
構成:Remove(引数: 削除する要素)
リストから指定した要素の最初の出現を削除します。成功した場合はTrue、要素が見つからなかった場合はFalseを返します。
使用例:
myList.Remove(30) → [10, 20, 40, 50] (30がリストから削除される)
myList.Remove("UiPath") → True ("UiPath"が正常に削除された場合)
myList.Remove(99) → False (存在しない要素の削除を試みた場合)
RemoveAt | 指定したインデックスの要素を削除する
構成:RemoveAt(引数: 削除するインデックス)
指定したインデックス位置の要素を削除します。インデックスが確実に分かっている場合に便利です。
インデックスが範囲外の場合、例外が発生します。事前にインデックスが範囲内かチェックしましょう。
使用例:
myList.RemoveAt(2) → [10, 20, 40, 50] (インデックス2の30が削除される)
myList.RemoveAt(0) → [20, 30, 40] (先頭要素の削除)
RemoveAll | 条件に一致するすべての要素を削除する
構成:RemoveAll(引数: 判定用のラムダ式や述語)
指定した条件に一致するすべての要素をリストから削除します。条件付き一括削除に便利です。
使用例:
myList.RemoveAll(Function(x) x > 30) → [10, 20, 30] (30より大きいすべての要素が削除される)
myList.RemoveAll(Function(s) s.Contains("error")) → [エラーを含まない文字列のみが残る]
RemoveRange | 指定した範囲の要素を削除する
構成:RemoveRange(引数1: 開始インデックス, 引数2: 削除する要素数)
指定したインデックスから指定した数の要素を削除します。連続した要素を一度に削除するのに便利です。
インデックスや要素数が範囲外の場合、例外が発生します。事前にインデックスが範囲内かチェックしましょう。
使用例:
myList.RemoveRange(1, 2) → [10, 40, 50] (インデックス1から2つの要素が削除される)
myList.RemoveRange(0, 3) → [40, 50] (先頭から3つの要素が削除される)
Reverse | リストの要素の順序を反転する
構成:Reverse()
リスト内のすべての要素の順序を反転します。データを逆順で処理したい場合に便利です。
使用例:
myList.Reverse() → [50, 40, 30, 20, 10] (元のリスト[10, 20, 30, 40, 50]の順序が反転)
Sort | リストの要素をソートする
構成:Sort()
リスト内の要素をデフォルトの比較子を使用して昇順にソートします。データを順番に処理する前の準備によく使われます。
使用例:
myList.Sort() → [10, 20, 30, 40, 50] (数値リストを昇順にソート)
myList.Sort() → ["Apple", "Banana", "Orange"] (文字列リストをアルファベット順にソート)
Uipathでの使い方
「メソッドを呼び出し」で簡単にソート可能です。引数は不要です。


ForEach | すべての要素に対して処理を実行する
構成:ForEach(引数: 実行するアクション)
リスト内のすべての要素に対して指定したアクションを実行します。反復処理を簡潔に記述できます。
使用例
myList.ForEach(Sub(x) Console.WriteLine(x)) → 各要素が1行ずつコンソールに出力される
myList.ForEach(Sub(item) item = item.ToUpper()) → 文字列リストの各要素が大文字に変換される
[繰り返し (コレクションの各要素)]アクティビティ vs ForEachメソッド
UiPathでは「繰り返し (コレクションの各要素)」アクティビティとForEach
メソッドの2つの選択肢があります。
・For Each アクティビティの利点
- 視覚的に分かりやすく、処理の流れが見える
- デバッグが容易(各ステップで変数の値を確認可能)
- 例外処理を Try Catch アクティビティで囲むだけで実装可能
- 複雑なアクティビティの組み合わせが必要な場合に適している
・ForEach メソッドの利点
- コードが簡潔になる(1行で記述可能)
- ワークフロー図が煩雑にならない
- シンプルな処理には高速
- 式エディタで完結する
Uipathでの使い方
以下のように「繰り返し (コレクションの各要素)」アクティビティを使うか、「コードを呼び出し」アクティビティでForEachメソッドを呼び出すこともできます。
基本的にUipathでは「繰り返し (コレクションの各要素)」アクティビティを使うと良いでしょう。


繰り返し(コレクションの各要素)アクティビティの公式ドキュメント
https://docs.uipath.com/ja/activities/other/latest/workflow/for-each
GetRange | 指定した範囲の要素を取得する
構成:GetRange(引数1: 開始インデックス, 引数2: 取得する要素数)
指定したインデックスから指定した数の要素を含む新しいリストを返します。リストの一部だけを処理したい場合に便利です。
使用例
myList = [10,20,30,40]
myList.GetRange(1, 3) → [20, 30, 40] (インデックス1から3つの要素を含む新しいリスト)
myList.GetRange(0, 2) → [10, 20] (最初の2つの要素を含む新しいリスト)
変換・確認メソッド
ToArray | リストを配列に変換する
構成:ToArray()
リストの要素を新しい配列にコピーします。UiPathのアクティビティで配列が必要な場合に便利です。
使用例
myList.ToArray() → [10, 20, 30, 40, 50] (リストと同じ要素を持つ配列が完成)
TrimExcess | リストの容量を実際の要素数に合わせる
構成:TrimExcess()
リストの容量(Capacity)を実際の要素数(Count)に減らします。メモリ使用量を最適化する場合に便利です。
要素数が容量の90%未満の場合のみ実行されます。
使用例
myList.TrimExcess() → 容量が実際の要素数に調整される
TrimExcessの条件と効果
要素数が容量の90%未満かどうかは以下のように確認できます:
' 90%未満かどうかを確認
If myList.Count / CDbl(myList.Capacity) < 0.9 Then ' TrimExcessが効果を発揮する条件を満たしている
myList.TrimExcess() ' 実行後にCapacityとCountを確認
Console.WriteLine("Capacity: " & myList.Capacity & ", Count: " & myList.Count)
End If
メモリ効果の具体例
- 10,000要素の容量を持つリストに500要素しか入っていない場合
- 実行前: 約40KB (10,000要素分のメモリ)
- 実行後: 約2KB (500要素分のメモリ)
- 節約: 約38KB (9,500要素分のメモリ)
実用的な使用場面
- 大量データを処理した後、リストの多くの要素を削除した場合
- 初期容量を大きく設定したが、実際に格納されたデータが少なかった場合
- 長時間実行されるプロセスでメモリ効率を最適化したい場合
ConvertAll | すべての要素を別の型に変換する
構成:ConvertAll(引数: 変換用のラムダ式や関数)
リスト内のすべての要素を指定した変換を使用して別の型に変換し、新しいリストを返します。
データ型の一括変換に便利です。
使用例
' 1) 元の数値リストを用意
Dim nums As New List(Of Integer) From {10, 20, 30}
' 2) ConvertAll で文字列に変換
Dim strList As List(Of String) = nums.ConvertAll(Function(x) x.ToString())
' 3) 文字列リストになる
strList → ("10","20","30")
TrueForAll | すべての要素が条件を満たすか確認する
構成:TrueForAll(引数: 判定用のラムダ式や述語)
リスト内のすべての要素が指定した条件を満たすかどうかをチェックします。データ検証に便利です。
使用例:
myList.TrueForAll(Function(x) x > 0) → True (すべての要素が正の数の場合)
myList.TrueForAll(Function(s) s.StartsWith("Ui")) → False (すべての要素が"Ui"で始まるわけではない場合)
よくある質問
- UiPathでリスト型変数と配列はどう使い分ければいいですか?
-
要素数が固定で変わらない場合は配列、動的に要素を追加・削除する場合はリスト型変数が適しています。
またUiPathの多くのアクティビティは配列を受け付けるため、最終的にはToArray()
メソッドでリストを配列に変換する場合も多いです。 - パフォーマンスを向上させるためのベストプラクティスはありますか?
-
大量のデータを扱う場合はCapacityプロパティで事前に容量を設定し、不要になったリストはClear()やTrimExcess()でメモリを最適化しましょう。また条件に基づいた一括処理には、専用メソッド(FindAll、RemoveAllなど)を使用すると効率的です。
- 「Index was out of range. Must be non-negative and less than the size of the collection」や「オブジェクト参照がオブジェクトインスタンスに設定されていません」エラーの対処法はありますか?
-
CountやElementAtOrDefaultメソッドで事前にインデックスが存在するか確認するのが良いでしょう。
まとめ



これでList型変数のメソッド紹介を終わります



知らなかったメソッドがたくさんありました!
これらのメソッドを適切に活用することで、UiPathでのデータ処理がより効率的になり、コードの可読性も向上します。
初心者の方は基本的なメソッド(Add、Remove、Contains、IndexOfなど)から始めて、徐々に高度なメソッド(FindAll、RemoveAll、ConvertAllなど)を習得していくことをおすすめします。




コメント