测试 3 个不连续区域以确定是否所有单元格都为空

Test 3 non-contiguous ranges to determine if all cells are empty

提问人:TheEndUK 提问时间:11/17/2023 更新时间:11/17/2023 访问量:64

问:

我需要检查 3 个不连续的范围,以确定它们是否填充了日期 - 如果没有,则返回一条消息,通知用户他们需要检查。

这就是我想出的(原谅我,我是 VBA 的初学者!)但它调试时出现运行时错误“424”:“If Range(”T2“)...”阶段。

Sub DateChecker()

Dim tlastRow As Long
Dim ulastRow As Long
Dim wlastRow As Long

tlastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
ulastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
wlastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row

If Range("T2" & tlastRow) Is Empty And Range("U2" & ulastRow) Is Empty And Range("W2" & wlastRow) Is Empty Then GoTo NoDates
NoDates:
MsgBox "Dates have not been populated", vbExclamation
Exit Sub

End Sub

希望有人能告诉我哪里出了问题。

提前非常感谢。

TE公司

Excel VBA

评论

1赞 Notus_Panda 11/17/2023
取而代之的是(你可以adTrim(),但如果这是你想要的,idk)或在这里查看这个问题。你不能只说“空”。 例如,tlastRow 为 100 将为您提供 T2100 的值,顺便说一句;)If Len(Range("T" & tlastRow)) = 0T2 & tlastRow
1赞 Foxfire And Burns And Burns 11/17/2023
您需要检查整个范围,因此您需要.其余范围相同Range("T2" & tlastRow)Range("T2:T" & tlastRow)
1赞 CDP1802 11/17/2023
您想检查 3 列中第一行和最后一行之间的任何单元格是否为空吗?
1赞 FaneDuru 11/17/2023
Is Empty应仅用于对象。尝试。现在,您要检查是否有任何相应的单元格为空吗?如果是这样,则应使用 .然后,如上所述,您是否只想检查这三列中每一列的最后一行?If Range("T2" & tlastRow).value = ""OrAnd
0赞 TheEndUK 11/17/2023
感谢大家的评论,并帮助我了解我哪里出了问题。Black Cat 现已发布解决方案。再次感谢 TE :)

答:

1赞 Black cat 11/17/2023 #1

在此上下文中,VBA 中不使用 Is Empty。此外,IsEmpty 函数不能用于具有多个单元格的区域。

尝试像这样使用函数 sg。WorksheetFunction.Counta

If WorksheetFunction.Counta(Range("T2:T" & tlastRow))=0 And _ 
WorksheetFunction.Counta(Range("U2:U" & ulastRow))=0 And _ 
WorksheetFunction.Counta(Range("W2:W" & wlastRow))=0 Then
    MsgBox "Dates have not been populated", vbExclamation
End If


End Sub

只有当所有范围都完全为空时,您才会收到该消息。

评论

0赞 TheEndUK 11/17/2023
非常感谢 - 这非常有效!
3赞 CLR 11/17/2023 #2

我可能会建议做这样的事情:

Sub DateChecker()

    Dim lastRow As Long
    Dim rngT As Range, rngU As Range, rngW As Range
    
    With ActiveSheet
    
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        
        Set rngT = .Range("T2:T" & lastRow)
        Set rngU = .Range("U2:U" & lastRow)
        Set rngW = .Range("W2:W" & lastRow)
        
        If Application.WorksheetFunction.CountA(rngT, rngU, rngW) = 0 Then
            MsgBox "Dates have not been populated", vbExclamation
        End If
    
    End With

End Sub

注意:我只用一个替换了你的三个 lastRow 变量,因为每个变量都包含与读取 A 列相同的值。如果您愿意,可以撤消任何简单的更改。

评论

0赞 Domenic 11/17/2023
虽然,在这种情况下,您实际上不需要使用 Union。
0赞 CLR 11/17/2023
没错,我忘记了 COUNTA 处理多个范围。我将删除它。
0赞 TheEndUK 11/17/2023
非常感谢 - 这个解决方案也运行良好。:)