【问题标题】:How do I find the last row that contains data where cells may contain empty text ""?如何找到包含单元格可能包含空文本“”的数据的最后一行?
【发布时间】:2016-05-30 22:15:52
【问题描述】:

我正在尝试查找列的最后一行。

列中的每个单元格都有公式=IF(ISERROR(AVERAGE(F5:G5));"";AVERAGE(F5:G5))

我正在使用下面的 VBA 代码来查找最后一行。

lastrow= Worksheets("SPONSOR ENGAGEMENT").Cells(Worksheets("SPONSOR ENGAGEMENT").Rows.Count, trendcnt).End(xlUp).Row

但是,该代码还计算公式产生的具有空文本“”的单元格。

我怎样才能只计算有数据而不是空文本的单元格?

【问题讨论】:

标签: excel vba


【解决方案1】:

我使用了 Gary 的第一个代码,并且速度很快:

Function LastRowWithNonNullData() as Long
Dim LastRow As Variant
Dim i As Long
LastRow = Range(Cells(1, 1), Cells(Rows.Count, 1)).Value2
For i = Rows.Count To 1 Step -1
        If LastRow(i, 1) <> vbNullString Then
            'MsgBox i
            LastRowWithNonNullData = i
            Erase LastRow
            Exit Function
        End If
Next i
Erase LastRow
End Function

例如,在我的电脑上,如果我只在单元格“A1”中放一些东西,则需要 0,125 秒(而不是 4,3 秒)。

我也做了一个函数,更有用。

【讨论】:

    【解决方案2】:

    这个可以用,但是很慢:

    Sub LastRowWithNonNullData()
        Dim LastRow As Variant, i As Long
            For i = Rows.Count To 1 Step -1
                If Cells(i, "A").Value <> "" Then
                    MsgBox i
                    Exit Sub
                End If
            Next i
        End Sub
    

    这并没有那么慢:

    Sub IsThisAnyBetter()
        MsgBox Evaluate("IF(COUNTA(A:A)=0,"""",MAX((A:A<>"""")*(ROW(A:A))))")
    End Sub
    

    两者都将忽略列 A 底部的 Null。如果您直接在工作表单元格中使用 Evaluate() 的参数,则必须以数组形式输入。

    编辑#1:

    两个子都在 A 列上工作。假设我们要修改第二个 sub 中的公式以处理 77 列(即 BY 列)。这是一种方法:

    Sub AnyColumn()
        Dim s1 As String, s2 As String, iCol As Long, iColAlpha As String
        Dim s3 As String, s4 As String, s5 As String
    
        iCol = 77
        s1 = "IF(COUNTA(A:A)=0,"""",MAX((A:A<>"""")*(ROW(A:A))))"
        s2 = Cells(1, iCol).Address(0, 0)
        s3 = Left(s2, Len(s2) - 1)
        s4 = s3 & ":" & s3
        s5 = Replace(s1, "A:A", s4)
    
        MsgBox s5
    End Sub
    

    编辑#2:

    我在Evaluate()中使用的公式改编自Chip Perason

    【讨论】:

    • 嗨,加里,这段代码似乎运行得完美而快速。但我还有一个问题。我如何传递像 Cells(initc, trendcnt), Cells(Target, trendcnt) 这样的范围,其中 initc、trendcnt、target 是变量?
    • @cube2016 您需要拼接一个新字符串,以便 Evaluate() 根据您的参数进行处理。
    • 您好 Gary,如果您能为您的解决方案提供一个我可以使用变量的小示例,我将不胜感激。示例:我必须读取范围 A1:A2 但我想将其提供为 range(cells(1,1),cells(1,2))
    • @cube2016 查看我的EDIT#1
    • 加里,工作就像一个魅力。非常感谢。你能解释一下函数在 Evaluate("IF(COUNTA(A:A)=0,"""",MAX((A:A"""")*(ROW(A:A) )))") 以便我可以将其扩展为其他内容
    猜你喜欢
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多