本記事では、UiPathやVB.NETでの開発において実務で頻出するメソッドや処理を、Q&A形式で整理しています。
単なる構文の説明ではなく、
- どのような場面で使うのか
- 実務での注意点やよくあるミス
- 設計上どのように扱うべきか
といった観点を重視し、実際の開発でそのまま使える知識としてまとめています。
内容は随時追加していく予定です。
🧩 Q. 文字列を区切り文字で結合するには?
A. String.Joinを使う
機能
- 配列やListの中身を、指定した区切り文字で1つの文字列にできる
- 先頭や末尾に余計な区切り文字が付かないため、手書き連結より安全
構文
String.Join(区切り文字, 文字列の配列またはList)
使用例
Dim list As New List(Of String) From {"A", "B", "C"}
Dim result As String = String.Join("、", list)
実行結果:
A、B、C
例 / ルール
-
String.Join(",", list)とすればカンマ区切り -
String.Join("、", list)とすれば読点区切り - 要素が1件だけなら区切り文字は付かない
- 要素が0件なら空文字
""が返る - 要素の中に
Nothingがある場合、その部分は空文字として扱われる
よくある使いどころ
起動中アプリ名をまとめて表示する
String.Join("、", runningAppNames)
実行結果:
Google Chrome、Excel、Outlook
DataTableから条件に合う値だけ結合する
元データ(DataTableイメージ):
| アプリケーション名 | プロセス名 | ウィンドウ有無 |
|---|---|---|
| Google Chrome | chrome | True |
| Excel | EXCEL | False |
| Outlook | outlook | True |
処理:
String.Join("、",
dtApp.AsEnumerable().
Where(Function(r) CBool(r("ウィンドウ有無"))).
Select(Function(r) r("アプリケーション名").ToString)
)
実行結果:
Google Chrome、Outlook
LINQと組み合わせて ウィンドウ有無=True の行だけを対象にして、アプリケーション名を結合する。
注意
-
CSVの作成にはそのまま使わないこと
→ 値の中にカンマやダブルクォートが含まれる場合、正しいCSV形式にならないため、別途エスケープ処理が必要
🧩 Q. 対象のアプリケーションが開いているかどうか知りたい
A. ProcessのMainWindowHandleを確認する
基本方針
- 対象プロセスが起動しているか確認する
- さらに、そのプロセスがウィンドウを持っているか確認する
- バックグラウンドプロセスではなく、画面として開いているかを判定したい時に使う
構文
System.Diagnostics.Process.GetProcessesByName("プロセス名").
Any(Function(p) p.MainWindowHandle <> IntPtr.Zero)
使用例
Dim isChromeOpen As Boolean
isChromeOpen =
System.Diagnostics.Process.GetProcessesByName("chrome").
Any(Function(p) p.MainWindowHandle <> IntPtr.Zero)
実行結果:
Chromeのウィンドウが開いている場合:True
Chromeのウィンドウが開いていない場合:False
例 / ルール
- プロセス名では
"chrome"のように、拡張子.exeは付けない - プロセス名が分からない場合はコマンドプロンプトの
tasklistなどで確認する例: tasklist | findstr chrome -
MainWindowHandle <> IntPtr.Zeroで、ウィンドウを持っているか確認する - プロセスが存在しても、ウィンドウを持っていなければ
False -
Anyは条件に合うプロセスが1つでもあればTrueを返す
よくある使いどころ
RPA実行前に対象アプリが開いていないか確認する
Dim isTargetAppOpen As Boolean
isTargetAppOpen =
System.Diagnostics.Process.GetProcessesByName("EXCEL").
Any(Function(p) p.MainWindowHandle <> IntPtr.Zero)
isTargetAppOpen=True の場合は、ユーザーへアプリケーションを閉じるよう通知する。
複数アプリケーションの起動状況を確認する
元データ(DataTableイメージ):
| アプリケーション名 | プロセス名 | ウィンドウ有無 |
|---|---|---|
| Google Chrome | chrome | False |
| Excel | EXCEL | False |
| Outlook | outlook | False |
For Each Row アクティビティで各行を確認する。
row("ウィンドウ有無") =
System.Diagnostics.Process.GetProcessesByName(row("プロセス名").ToString).
Any(Function(p) p.MainWindowHandle <> IntPtr.Zero)
その後、開いているアプリ名をまとめる。
String.Join("、",
dtApp.AsEnumerable().
Where(Function(r) CBool(r("ウィンドウ有無"))).
Select(Function(r) r("アプリケーション名").ToString)
)
実行結果:
Google Chrome、Excel
注意
-
Process.GetProcessesByNameはプロセス名で判定するため、画面タイトルでは判定しない -
MainWindowHandleは基本的にメインウィンドウを確認するため、アプリ内部のタブまでは判定できない - Chromeのように複数プロセスを持つアプリでは、ウィンドウを持つプロセスだけが対象になる
- 対象アプリが管理者権限で起動している場合、取得できる情報に制限が出ることがある
知識
-
MainWindowHandleで取得できる値はIntPtr(インタポインター)型でメモリアドレスを表すデータ型のオブジェクト -
IntPtr.ZeroはIntPtr型の初期値であり、MainWindowHandle <> IntPtr.Zeroでアドレスが割り当てられていない、つまり「有効なウィンドウハンドルが無い」状態を表す
一言まとめ
対象アプリが画面として開いているか確認したい場合は、
Process.GetProcessesByNameとMainWindowHandle <> IntPtr.Zeroを使う。
🧩 Q. LINQとは何か?
A. コレクションに対して検索・抽出・変換を行うための仕組み
基本方針
- 配列・List・DataTableなどのコレクションを対象にする
- 条件で絞り込み(Where)、必要な値に変換(Select)などを組み合わせて使う
- 「どう処理するか」ではなく「何を取得したいか」を書く
概要
LINQは、コレクションに対して「検索・抽出・変換」を行うための仕組みである。
従来のように1件ずつループして処理を書くのではなく、
「どの条件のデータを、どのような形で取得したいか」を宣言的に記述できる。
従来の書き方(For Each)
Dim result As New List(Of String)
For Each r In dt.Rows
If CBool(r("フラグ")) Then
result.Add(r("名前").ToString)
End If
Next
LINQでの書き方
dt.AsEnumerable().
Where(Function(r) CBool(r("フラグ"))).
Select(Function(r) r("名前").ToString)
例 / ルール
-
Whereは条件に合うデータだけを抽出する -
Selectは必要な値に変換する -
Anyは条件に合うデータが存在するか判定する - 1要素を表す変数は
For Eachでは「Inの左側」、LINQでは 「Functionの引数(カッコ内)」 で定義する - メソッドをつなげて処理を書く(メソッドチェーン)
イメージ
元データ
↓
Where(条件で絞る)
↓
Select(必要な形に変換)
↓
結果
SQLとの対応イメージ
SELECT 名前
FROM データ
WHERE フラグ = True
↓
dt.Where(...).Select(...)
DataTableでLINQを使う場合
dt.AsEnumerable()
- DataTableはそのままではLINQが使えないため、Enumerableに変換する必要がある
-
List(Of T)や配列は、もともと LINQ対応(IEnumerable) のため、.AsEnumerableは不要。
よくある使いどころ
条件に合うデータだけ取得する
dt.AsEnumerable().
Where(Function(r) CBool(r("有効フラグ")))
必要な列だけ取り出す
dt.AsEnumerable().
Select(Function(r) r("名前").ToString)
条件に合うデータが存在するか確認する
dt.AsEnumerable().
Any(Function(r) CBool(r("エラー有無")))
注意
- LINQはNothingではなく「空のコレクション」を返すため安全に扱える
- DataTableの場合は
AsEnumerableを忘れると使えない - 複雑な処理を書きすぎると可読性が落ちるため、適度に分割する
一言まとめ
LINQは、コレクションに対して「条件で絞り、必要な形に変換する」処理を簡潔に書くための仕組み。
🧩 Q. LINQの結果を変数に格納するにはどのようにすればいいか?
A. 用途に応じて ToList / ToArray / CopyToDataTable を使う
基本方針
- LINQの結果は
IEnumerableとして返る - そのままでも使えるが、用途に応じて型を変換する
- よく使うのは
List、配列、DataTableへの変換
構文
.ToList() ' Listに変換
.ToArray() ' 配列に変換
.CopyToDataTable() ' DataTableに変換(DataRowのみ)
使用例
Listに変換する
Dim list =
dt.AsEnumerable().
Where(Function(r) CBool(r("フラグ"))).
Select(Function(r) r("名前").ToString).
ToList()
配列に変換する
Dim arr =
list.Select(Function(x) x.ToUpper()).
ToArray()
DataTableに変換する
Dim resultDt =
dt.AsEnumerable().
Where(Function(r) CBool(r("フラグ"))).
CopyToDataTable()
例 / ルール
- LINQの結果は
IEnumerable(列挙)として返る -
Listとして扱いたい場合はToList()を使う - 配列にしたい場合は
ToArray()を使う -
DataTableとして扱いたい場合はCopyToDataTable()を使う
イメージ
IEnumerable
├ ToList() → List
├ ToArray() → 配列
└ CopyToDataTable() → DataTable
よくあるミス
-
Selectしただけで結果が保存されると思ってしまう -
ToList()を付けずにListに代入しようとして型エラーになる - 型は通常推論されるため、
ToArray(Of String)などは不要だが、LINQの結果の型が代入先の変数に合わない場合はエラーとなる
LINQの結果を代入しようとして型が合わないケース
Dim arr() As String
arr =
dt.AsEnumerable().
Where(Function(r) r("くだもの").ToString = "りんご").
ToArray()
これはNGとなる
理由:
dt.AsEnumerable.Where → DataRow
ToArray → DataRow()
→ dt.AsEnumerable.Where の結果は DataRow の列挙であり、それを ToArray した結果は DataRow の配列となるため、String の配列には代入できない
DataTable変換時の注意
-
CopyToDataTable()はDataRowの列挙に対してのみ使用できる -
CopyToDataTable()は1件もデータがない場合、例外になる
安全な書き方(DataTable)
Dim rows =
dt.AsEnumerable().
Where(Function(r) CBool(r("フラグ")))
Dim resultDt As DataTable
If rows.Any() Then
resultDt = rows.CopyToDataTable()
Else
resultDt = dt.Clone()
End If
LINQの結果、値の有無を確認した上で、値がある場合のみ CopyToDataTable でDataTable 化してあげる
一言まとめ
LINQの結果は
IEnumerableとして返るため、用途に応じてToList・ToArray・CopyToDataTableで変換する。
🧩 Q. コレクションから条件に合う要素の有無を確認するには?
A. Anyを使う
機能
- コレクションの中に、条件に合う要素が1件でも存在するか確認できる
- 結果は
Boolean型で返る - 1件見つかった時点で判定が終わるため、存在確認に向いている
構文
コレクション.Any(Function(要素) 条件式)
使用例
Dim list As New List(Of String) From {"りんご", "みかん", "ぶどう"}
Dim hasApple As Boolean =
list.Any(Function(x) x = "りんご")
実行結果:
True
例 / ルール
- 条件に合う要素が1件でもあれば
True - 条件に合う要素が1件もなければ
False -
Function(x)のxは、コレクション内の1要素を表す - 存在確認だけなら
Where(...).Any()よりAny(...)の方が簡潔
DataTableで使う場合
元データ(DataTableイメージ):
| 商品名 | 区分 |
|---|---|
| りんご | 果物 |
| にんじん | 野菜 |
| みかん | 果物 |
処理:
Dim hasApple As Boolean =
dt.AsEnumerable().
Any(Function(r) r("商品名").ToString = "りんご")
実行結果:
True
Where + Any との違い
以下の2つは、どちらも「条件に合う行が存在するか」を確認できる。
Whereで絞ってからAny
dt.AsEnumerable().
Where(Function(r) r("商品名").ToString = "りんご").
Any()
Anyに条件を書く
dt.AsEnumerable().
Any(Function(r) r("商品名").ToString = "りんご")
存在確認だけであれば、後者の方が意図が分かりやすい。
よくある使いどころ
エラー行が存在するか確認する
Dim hasError As Boolean =
dt.AsEnumerable().
Any(Function(r) CBool(r("エラー有無")))
対象ステータスの行が存在するか確認する
Dim hasTarget As Boolean =
dt.AsEnumerable().
Any(Function(r) r("ステータス").ToString = "処理対象")
対象アプリケーションのウィンドウが存在するか確認する
Dim isChromeOpen As Boolean =
System.Diagnostics.Process.GetProcessesByName("chrome").
Any(Function(p) p.MainWindowHandle <> IntPtr.Zero)
空のコレクションに対して実行する場合
空のコレクションに対して Any を実行した場合、例外にはならず False が返る。
Dim list As New List(Of String)
Dim hasApple As Boolean =
list.Any(Function(x) x = "りんご")
実行結果:
False
そのため、対象データが0件の可能性がある場合でも、存在確認として安全に使用できる。
注意
-
Anyは存在確認用のメソッドであり、条件に合う要素自体を取得するものではない - 条件に合う要素を取得したい場合は
Whereを使う - DataTableで使う場合は
AsEnumerable()が必要 - 空のコレクションに対して実行した場合は
Falseが返る
一言まとめ
コレクションの中に条件に合う要素が存在するか確認したい場合は、Any(Function(要素) 条件式) を使う。
🧩 Q. コレクションから条件に合う要素をコレクションとして抜き出すには?
A. Whereを使う
機能
- コレクションの中から、条件に合う要素だけを抽出できる
- 条件に合う要素が複数ある場合は、複数件そのまま取得できる
- 条件に合う要素が0件の場合は、空のコレクションが返る
構文
コレクション.Where(Function(要素) 条件式)
使用例
Dim list As New List(Of String) From {"りんご", "みかん", "ぶどう", "りんご"}
Dim apples =
list.Where(Function(x) x = "りんご")
実行結果:
りんご
りんご
例 / ルール
- 条件に合う要素だけが残る
- 条件に合わない要素は除外される
- 条件に合う要素が0件の場合は、空のコレクションが返る
-
Function(x)のxは、コレクション内の1要素を表す -
Whereは「存在確認」ではなく「条件に合う要素を抽出する」ために使う
DataTableで使う場合
元データ(DataTableイメージ):
| 商品名 | 区分 |
|---|---|
| りんご | 果物 |
| にんじん | 野菜 |
| みかん | 果物 |
| ぶどう | 果物 |
処理:
Dim fruitRows =
dt.AsEnumerable().
Where(Function(r) r("区分").ToString = "果物")
実行結果:
りんご
みかん
ぶどう
区分=果物 の行だけを抽出する。
Whereの結果はIEnumerableになる
Where の結果は、元のコレクションと同じ型ではなく、基本的に IEnumerable として返る。
Dim apples =
list.Where(Function(x) x = "りんご")
この場合、apples は List(Of String) ではなく、IEnumerable(Of String) として扱われる。
List(Of String)
↓ Where
IEnumerable(Of String)
そのため、Listや配列として変数に格納したい場合は、用途に応じて ToList() や ToArray() を使う。
Whereで絞り込んだコレクションを応用する
Where は条件に合う要素を抽出するため、抽出した結果に対してさらに処理をつなげることができる。
絞り込んだ結果が存在するか確認する
Dim hasApple As Boolean =
list.Where(Function(x) x = "りんご").
Any()
Where で絞り込んだ結果に1件でも要素があれば True になる。
ただし、存在確認だけが目的であれば、以下のように Any に直接条件を書く方が簡潔。
Dim hasApple As Boolean =
list.Any(Function(x) x = "りんご")
絞り込んだ結果の件数を確認する
Dim appleCount As Integer =
list.Where(Function(x) x = "りんご").
Count()
Where で絞り込んだ結果が何件あるか確認したい場合は Count() を使う。
絞り込んだ結果をListにする
Dim appleList =
list.Where(Function(x) x = "りんご").
ToList()
Where の結果を List として扱いたい場合は ToList() を使う。
絞り込んだ結果を配列にする
Dim appleArray =
list.Where(Function(x) x = "りんご").
ToArray()
配列として扱いたい場合は ToArray() を使う。
絞り込んだ結果をDataTableにする
Dim rows =
dt.AsEnumerable().
Where(Function(r) r("区分").ToString = "果物")
Dim resultDt As DataTable
If rows.Any() Then
resultDt = rows.CopyToDataTable()
Else
resultDt = dt.Clone()
End If
CopyToDataTable() は0件の場合に例外になるため、事前に Any() で確認する。
よくある使いどころ
エラー行だけ取得する
Dim errorRows =
dt.AsEnumerable().
Where(Function(r) CBool(r("エラー有無")))
処理対象ステータスの行だけ取得する
Dim targetRows =
dt.AsEnumerable().
Where(Function(r) r("ステータス").ToString = "処理対象")
特定条件に合うアプリケーションだけ取得する
Dim runningApps =
dtApp.AsEnumerable().
Where(Function(r) CBool(r("ウィンドウ有無")))
空のコレクションになる場合
Dim list As New List(Of String) From {"みかん", "ぶどう"}
Dim apples =
list.Where(Function(x) x = "りんご")
条件に合う要素がない場合でも、例外にはならない。
結果は空のコレクションになる。
注意
-
Whereは条件に合う要素を抽出するメソッド - 存在確認だけなら
Any(Function(要素) 条件式)を使う方が簡潔 - 1件だけ取得したい場合は
FirstOrDefaultなどを使う - DataTableで使う場合は
AsEnumerable()が必要 -
Whereの結果はIEnumerableのため、ListやDataTableとして扱いたい場合は変換が必要
一言まとめ
コレクションから条件に合う要素を抜き出したい場合は、Where(Function(要素) 条件式) を使う。