范围的动态第一行和最后一行

Posted

技术标签:

【中文标题】范围的动态第一行和最后一行【英文标题】:Dynamic first and last row of a range 【发布时间】:2019-05-21 19:41:25 【问题描述】:

我很惊讶没有答案。我读过Setting Dynamic Ranges in VBA 和Selecting Dynamic Range 和Autofill Dynamic Range Last Row and Last Column 和MSDN

我在一张不同尺寸的工作表上有多个不同的范围。我正在尝试小计column L。我可以使用硬编码的总和(通过subtotal 变量)来做到这一点,但我想在单元格中插入一个公式。这需要知道每个范围的开始行和结束行。我的代码几乎可以工作。当范围仅包含一行时,它会失败。即便如此,我觉得必须有更聪明的方法来做到这一点。

如何确定填充了多个范围的工作表上的范围的开始行和结束行?

For i = 2 To j

    If .Cells(i + 1, "L") = "" And .Cells(i + 2, "L") = "" Then
        b = .Cells(i - 1, "J").End(xlUp).Row
    End If

    subtotal = subtotal + .Cells(i, "L").Value2
    If .Cells(i, 1) = "" And .Cells(i - 1, "B") <> "" Then
        If .Cells(i - 1, "K") = 0 Then
            .Cells(i, "K").Value2 = "Check Payment"
            'Set sumRng = .Range(.Cells(b, "L"), .Cells(i - 1, "L"))
            .Cells(i, "L").Formula = "=sum(L" & b & ":L" & i - 1 & ")"
            .Cells(i - 1, "L").Borders(xlEdgeBottom).LineStyle = xlContinuous
            total = total + subtotal
            subtotal = 0
        ElseIf .Cells(i - 1, "K") = "Checking" Then
            .Cells(i, "K").Value2 = "EFT Payment"
            'Set sumRng = .Range(.Cells(b, "L"), .Cells(i - 1, "L"))
            .Cells(i, "L").Formula = "=sum(L" & b & ":L" & i - 1 & ")"
            .Cells(i - 1, "L").Borders(xlEdgeBottom).LineStyle = xlContinuous
            total = total + subtotal
            subtotal = 0
        End If
    End If
Next

【问题讨论】:

【参考方案1】:

您可以像这样遍历列:

For i = 2 To mySheet.Range("B" & Rows.Count).End(xlUp).Row + 1
    If Range("B" & i).Value <> vbNullString Then
        If Range("B" & i - 1).Value = vbNullString Then
            j = i
        End If
    Else
        If Range("B" & i - 1).Value <> vbNullString And Range("B" & i - 1).Formula <> "=SUM(B" & j & ":B" & i - 2 & ")" Then
            Range("B" & i).Formula = "=SUM(B" & j & ":B" & i - 1 & ")"
        End If
    End If
Next i

【讨论】:

生成的公式是=SUM(L:L3),当它循环到下一行时也会出现type mismatch 错误。代码第 7 行出错。 尝试在循环前添加 j = 1。我假设您的数据上方有空白行,就像您的屏幕截图中一样【参考方案2】:

这使用 Match 来跳过块,因此数量或循环更少

With ActiveSheet
    Dim b As Long
    b = 2

    Do Until b = .Rows.Count

        Dim x As Variant
        x = .Evaluate("Match(True, Index(" & .Range(.Cells(b, "l"), .Cells(.Rows.Count, "l")).Address & " <> """",),0)")
        If Not IsError(x) Then
            b = b + x - 1
        Else
            Exit Sub
        End If

        x = .Evaluate("Match(True, Index(" & .Range(.Cells(b, "l"), .Cells(.Rows.Count, "l")).Address & " = """",),0)")
        Dim i As Long
        i = b + x - 1

        .Cells(i, "l").Formula = "=sum(L" & b & ":L" & i - 1 & ")"

        b = i + 2
     Loop
End With

【讨论】:

以上是关于范围的动态第一行和最后一行的主要内容,如果未能解决你的问题,请参考以下文章

jqgrid删除一行怎么动态更新rowid

动态规划

不确定如何将公式动态粘贴到最后一列和最后一行

使用 Pig 脚本删除文件的第一行和最后一行

#yyds干货盘点# 动态规划专题:跳跃游戏

单元格标签中的最后一行不会出现自动布局和动态单元格高度