复制范围直到最后一行值等于 0

Posted

技术标签:

【中文标题】复制范围直到最后一行值等于 0【英文标题】:copy range until last row value equal 0 【发布时间】:2018-07-10 07:31:26 【问题描述】:

我正在尝试使用 VBA/Macro 复制和粘贴一系列单元格。我需要一个代码来根据最后一行的总和选择一系列单元格。行数可能会发生变化,但列将始终为 9 并以“I”结尾。

虽然第 7 行没有数据,但我需要查看过去并继续(可能直到 3 行连续的 0)。我已经突出显示了我要复制/选择的区域。

这可能不是实现结果的最佳过程,我欢迎任何和所有帮助。我很抱歉没有包含代码,但我不知道如何实现这一点。

谢谢。

【问题讨论】:

【参考方案1】:

此公式应为您提供 I 列中最后一个值的行号,即 >0=LOOKUP(2,1/(I:I>0), ROW(I:I)),您可以在 VBA 中通过 Evaluate() 函数使用它。

Option Explicit

Public Sub FindLastValueGreaterZeroInColumnI()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    Dim LastRow As Long
    LastRow = ws.Evaluate("=LOOKUP(2,1/(I:I>0), ROW(I:I))")

    Dim CopyRange As Range
    Set CopyRange = ws.Range("A1", ws.Cells(LastRow, "I"))

    Debug.Print CopyRange.Address
End Sub

然后您可以使用它来复制和粘贴您的范围。


解释为什么这个公式有效:

=LOOKUP(2,1/(I:I>0), ROW(I:I))

    让我们在第一列中假设以下示例数据:

    28, 28, 29, 0, 30, 30, 28, 0, 0
    

    I:I>0 返回一个由TrueFalse 组成的数组,其中True 的值为>0,否则为False,因此它返回以下数组:

    True, True, True, False, True, True, True, False, False
    

    因为True = -1False = 0 1/(I:I>0) 返回-1 或错误#Div/0!,所以它返回以下数组:

    -1, -1, -1, #Div/0!, -1, -1, -1, #Div/0!, #Div/0!
    

    LOOKUP(lookup_value, lookup_vector, [result_vector]) 如果我们现在查找lookup_value = 2LOOKUP 函数找不到lookup_value,则该函数匹配lookup_vector 中小于或等于@ 的最大值987654345@。在这种情况下,它将找到最后一个-1。 因为result_vector = ROW(I:I)会返回它的行号,也就是最后一个值>0的行号。

【讨论】:

谢谢你,使用它我设法得到了我需要的东西。非常感谢您的帮助。

以上是关于复制范围直到最后一行值等于 0的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询不等于空白值如何写

Range的值等于先前范围的值和地址VBA

确定范围中的所有项目是否等于特定值

DecimalFormat不格式化值等于0的double

excel常用技巧

填写公式直到列中的最后一行