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

时间:2018-07-10 07:31:27

标签: excel vba excel-vba select copy-paste

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

Image of my excel sheet/example

尽管第7行没有数据,但我需要仔细检查并继续(可能直到连续3个连续的0行)。我已突出显示要复制/选择的区域。

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

谢谢。

1 个答案:

答案 0 :(得分:0)

此公式应为您提供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))
  1. 让我们假设第一列中的以下示例数据:

    {28, 28, 29, 0, 30, 30, 28, 0, 0}
    
  2. I:I>0返回一个数组TrueFalse,其中对于值True>0False,否则为{True, True, True, False, True, True, True, False, False} ,因此它返回以下数组:

    True = -1
  3. 由于False = 01/(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])
  4. lookup_value = 2如果现在查找LOOKUP,而lookup_value函数找不到lookup_vector,则该函数匹配{{1 }}小于或等于lookup_value。在这种情况下,它将找到最后一个-1。 并且由于result_vector = ROW(I:I)将返回它的行号,即最后一个值>0的行号。

相关问题