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

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

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

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

谢谢。

【问题讨论】:

    标签: vba excel select copy-paste


    【解决方案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))
    
    1. 让我们在第一列中假设以下示例数据:

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

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

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

    【讨论】:

    • 谢谢你,使用它我设法得到了我需要的东西。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多