范围的动态第一行和最后一行
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
【讨论】:
以上是关于范围的动态第一行和最后一行的主要内容,如果未能解决你的问题,请参考以下文章