如何使用VBA在Excel 2010中查找行中最后一个有颜色且为空的单元格?

3
我是新手VBA程序员,正在编写一个宏来查找特定行中最后一个填有特定颜色的空单元格。根据我目前的阅读和尝试:
  1. 当试图确定最后一个单元格/行/列时,最好从底部或右侧开始。
  2. 使用查找方法比使用循环更快。
  3. 关于(因此使用)Find的问题集中在识别具有(有时没有)数据的最后一行或列,或者最后使用的单元格(通常在列中,并包含数据)。
  4. 最好在使用Find方法之前指定内部颜色,因为它可能具有先前使用(由代码或用户)的某些其他内部颜色的值。
以下是迄今为止我所编写的代码:
Sub FindLastEmptyTurquoiseCellOnRow18()
Dim rngFindColorCell As Range
    Range("XFD18").Select
    With Application.FindFormat.Interior
        .Color = 16763955
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
    End With
    Set rngFindColorCell = Range("A18:XFD18").Find(What:="", After:=Range("XFC18"), _
     LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, _
     MatchCase:=False, SearchFormat:=True)
    rngFindColorCell.Select
End Sub

在我这个新手的眼中,After参数似乎与我想要的搜索方向存在明显冲突(After指向右侧(?),而xlPrevious则表示向左移动)。如果确实需要在继续向左移动之前从右边的第一个单元格开始搜索,则应该指定行中倒数第二个单元格。
此外,我还可以将对该行的搜索限制为前8785列。
最后(这次使用Select),我试图确定代码是否识别了正确的单元格。在通过代码时,我遇到了错误:
“运行时错误'91':对象变量或 With 块变量未设置”
1. 我该如何确定代码是否识别了正确的单元格?(我已尝试过MsgBox和将找到的单元格的内部颜色设为不同的颜色,但也会出现错误。) 2. 代码中是否存在导致其无法识别正确单元格的错误? 3. 我应该使用其他方法来代替查找方法吗?
期待(并非常感谢)任何可以解决这个小问题的“大师”!

2
错误是由于“查找”未产生结果而引起的。在您的情况下,rngFindColorCell = Nothing,因此您无法选择它。 - Tom Collins
1个回答

2

问题提得很好,布局也很清晰。

  1. 测试是否找到匹配项,使用If Not rngFindColorCell Is Nothing(参见下面的新代码)
  2. 你现在的代码首先查找XFB18,因为你使用了xlPrevious,然后查找XFA18等(最终到达XFD18,最后是XFC18
  3. 你的Select行是不必要的。
  4. 最好在匹配整个字符串时使用xlWhole而不是xlPart(在这种情况下不会有影响)
  5. 使用xlFormulas而不是xlValues将匹配隐藏列(xlValues跳过它们)

代码

Sub FindLastEmptyTurquoiseCellOnRow18()
Dim rngFindColorCell As Range

With Application.FindFormat.Interior
        .Color = 16763955
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
End With

Set rngFindColorCell = Range("A18:XFD18").Find(vbNullString, Range("XFC18"), xlFormulas, xlWhole, xlByRows, xlPrevious, , True)

If Not rngFindColorCell Is Nothing Then
  MsgBox "found in " & rngFindColorCell.Address(0, 0)
Else
  MsgBox "No matching cells found"
End If

End Sub

MsgBox 返回了XFB18,这表示像Tom所说的那样,在行中没有空的"turquoise"单元格。 原来用户没有使用颜色16763955,而是使用了颜色16763904。 注意:我在原始代码中替换了16763904颜色,最后的Select行将我放在了正确的单元格上(下一个子程序的跳出点)。太好了!出于好奇,我在上面修改过的代码中输入了正确的颜色,但是MsgBox仍然返回XFB18,所以不确定发生了什么。无论如何,现在我可以按照您在答案第3点中提到的指示删除选择行了。 - JOATrades
如果我之前版本的 MsgBox 返回了一个单元格,那么就意味着有一个有效的匹配(因为只有在查找成功时才会执行 MgsBox)。 - brettdj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接