【问题标题】:VBA Looping through Worksheets fails when Cells.Find is performed as code当 Cells.Find 作为代码执行时,VBA 循环通过工作表失败
【发布时间】:2015-08-15 04:02:41
【问题描述】:
    Sub Macro1()

    Dim ws As Worksheet

    For Each ws In ActiveWorkbook.Worksheets

    Cells.Find(What:="abc", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
    xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
    , SearchFormat:=False).Activate
    ActiveCell.Offset(rowOffset:=1, columnOffset:=0).Activate
    ActiveCell.Value = "xyz"

    Next ws

    End Sub

我正在使用以下代码循环遍历 Excel 工作簿中的所有工作表。我想在工作表中查找“abc”。如果我在特定工作表上找到“abc”,我希望将其下方单元格的值设置为“xyz”。 例如,如果在 Worksheet1 的单元格 A2 上找到“abc”,我希望单元格 A3 为“xyz”。同样,如果在 Worksheet2 的单元格 B4 上找到“abc”,我希望单元格 B5 为“xyz”。必须对整个工作簿执行此操作。然而,整个工作簿的循环不会发生,代码只是循环通过 worksheet1。

【问题讨论】:

  • 您使用ActiveCell 的方式存在一些问题,可能会导致意外结果,但我看不到任何情况会导致循环无法运行。您是否收到任何类型的错误消息?工作簿中是否有多个工作表? (图表不包含在worksheets 集合中)
  • 我的工作簿中有多个工作表(不包括图表)。正如答案中的 user5228244 所提到的,在工作簿循环中使用 ws.Activate 可以使代码正常工作。

标签: excel vba


【解决方案1】:
For Each ws In ActiveWorkbook.Worksheets
    ws.Activate

Cells.Find(What:="abc", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate
ActiveCell.Offset(rowOffset:=1, columnOffset:=0).Activate
ActiveCell.Value = "xyz"

Next ws

【讨论】:

  • 完美运行。谢谢!
  • 如果找不到匹配项,这将引发错误。当未找到匹配项时,.Find 的返回值是空的(空引用指针),因此尝试直接在返回值上使用 .Activate 会给您一个找不到对象或空引用的运行时错误。除此之外,即使没有找到匹配项,使用activecell.offset 也会在某个单元格中写入123。最后,见how to avoid using select (or activate)
猜你喜欢
  • 2018-02-28
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
相关资源
最近更新 更多