如何在 Excel 中使用宏循环浏览工作表上的数据列表

摘要

编写 Microsoft Visual Basic for Applications (VBA) 宏时,可能必须循环遍历工作表上的数据列表。 执行此任务的方法有多种。 本文的“更多信息”部分包含有关可用于搜索以下类型列表的方法的信息:

  • 包含已知恒定行数的列表。
  • 动态列表或行数未知的列表。
  • 包含特定记录的列表。

更多信息

Microsoft 提供的编程示例仅用于进行说明,而不提供明示或默示担保。 这包括但不限于适销性或对特定用途的适用性的默示担保。 本文假设您熟悉正在演示的编程语言和用于创建和调试过程的工具。 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 中的每个其他单元格都为空(例如,如果每个“记录”使用两行,第二行缩进一个单元格,则可能会出现这种情况),则可以按如下方式修改此循环:

     ' 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