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?

【VB.NET / UiPath】実務で使うメソッド・処理まとめ

0
Last updated at Posted at 2026-04-30

本記事では、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.GetProcessesByNameMainWindowHandle <> 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の結果、値の有無を確認した上で、値がある場合のみ CopyToDataTableDataTable 化してあげる


一言まとめ

LINQの結果は IEnumerable として返るため、用途に応じて ToListToArrayCopyToDataTable で変換する。


🧩 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 = "りんご")

この場合、applesList(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(要素) 条件式) を使う。


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?