概要
Microsoft Visual Basic for Applications (VBA) マクロを記述するときに、ワークシート上のデータの一覧をループ処理しなければならない場合があります。 このタスクを実行するには、いくつかの方法があります。 この記事の「詳細情報」セクションには、次の種類のリストを検索するために使用できるメソッドに関する情報が含まれています。
- 既知の定数行数を含むリスト。
- 動的リスト、または行数が不明なリスト。
- 特定のレコードを含むリスト。
詳細情報
Microsoft は、例示のみを目的としてプログラミング例を提供しており、明示または黙示にかかわらず、いかなる責任も負わないものとします。 これには、市販性または特定の目的との適合性についての黙示の保証も含まれますが、これに限定はされません。 この記事は、説明されているプログラミング言語、手順を作成およびデバッグするために使用されているツールに読者が精通していることを前提にしています。 マイクロソフト サポート窓口では、特定のプロシージャの機能説明に関するご質問に対して支援いたしますが、本例を特定の目的を満たすために機能を追加したり、プロシージャを構築することは行いません。 次のコード サンプルでは、セル A1 で始まるヘッダー行と、セル A2 で始まるデータがリストにあることを前提としています。
定数の既知の行数でリストを検索するには
次のコードは、列 A をリストの末尾に移動します。
Sub Test1()
Dim x As Integer
' Set numrows = number of rows of data.
NumRows = Range("A2", Range("A2").End(xldown)).Rows.Count
' Select cell a1.
Range("A2").Select
' Establish "For" loop to loop "numrows" number of times.
For x = 1 To NumRows
' Insert your code here.
' Selects cell down 1 row from active cell.
ActiveCell.Offset(1, 0).Select
Next
End Sub
行数が不明な動的リストまたはリストを検索するには
このコードは、列 A をリストの末尾に移動します。 (このコードでは、列 A の各セルに最後までエントリが含まれていることを前提としています)。
Sub Test2()
' Select cell A2, *first line of data*.
Range("A2").Select
' Set Do loop to stop when an empty cell is reached.
Do Until IsEmpty(ActiveCell)
' Insert your code here.
' Step down 1 row from present location.
ActiveCell.Offset(1, 0).Select
Loop
End Sub
手記 データ全体の列 A に空のセルがある場合は、この条件を考慮してこのコードを変更します。 空のセルが一貫した距離離れていることを確認します。 たとえば、列 A の他のすべてのセルが空の場合 (たとえば、すべての "レコード" で 2 つの行が使用され、2 番目の行が 1 つのセルにインデントされている場合にこの状況が発生する可能性があります)、このループは次のように変更できます。
' Set Do loop to stop when two consecutive empty cells are reached.
Do Until IsEmpty(ActiveCell) and IsEmpty(ActiveCell.Offset(1, 0))
' Insert your code here.
'
' Step down 2 rows from present location.
ActiveCell.Offset(2, 0).Select
Loop
特定のレコードのリストを検索するには
次のコードは、列 A をリストの末尾に移動します。
Sub Test3()
Dim x As String
Dim found As Boolean
' Select first line of data.
Range("A2").Select
' Set search variable value.
x = "test"
' Set Boolean variable "found" to false.
found = False
' Set Do loop to stop at empty cell.
Do Until IsEmpty(ActiveCell)
' Check active cell for search value.
If ActiveCell.Value = x Then
found = TRUE
Exit Do
End If
' Step down 1 row from present location.
ActiveCell.Offset(1, 0).Select
Loop
' Check for found.
If found = True Then
Msgbox "Value found in cell " & ActiveCell.Address
Else
Msgbox "Value not found"
End If
End Sub