vba基于动态范围值的动态和

时间:2017-11-12 06:04:00

标签: excel vba excel-vba

我想感谢大家的反馈,到目前为止它已经帮助了很多。我正在努力解决的一个问题是如何制作我的列值,以便我可以进行动态小计。

    Column k       Column R  Column Y    Column AF     Column AM      Column AT

       1                2         4           2             3              5
       3                9         7           8             2              4
       2                3         6           3             5              8
       3                          3                         2
                                  5
 TOT   9                14       25          13             12             17

Column k       Column R  Column Y    Column AF     Column AM      Column AT

       1                2         4           2             3              5
       3                9         7           8             2              4
       2                3         6           3             5              8
       3                          3                         2
                                  5
 TOT   9                14       25          13             12             17
每月

列值可能会波动,问题是如何使用 VBA根据值最大的列创建动态总和。

Dim Rin As Range
Dim Rout As Range
Dim lRa As Long
lRa = Range("i" & Rows.count).End(xlUp).Row
Set Rin = ws.Range("i" & lRa)
Set Rout = ws.Range("I" & lRa)

aCell.Range("I11:P12", "R12:AY12").Copy

Rout.Offset(2, 0).Resize(1, 28).Formula = "=SUBTOTAL(9," & 
Rin.Address(0, 0) & ")"
lR = ws.Range("I" & Rows.count).End(xlUp).Row - 1 ' Finds the last blank   
row
ws.Range("I" & lR).PasteSpecial xlPasteFormats

1 个答案:

答案 0 :(得分:2)

如果您知道数据的起始位置,可以使用Shai Rado给出的方法。

您不能在该范围内拥有任何完全空的行或列。

然后,您可以将此lastRow变量提供到范围地址中,以添加小计公式。

示例:如果您的数据是从Cell D3开始的一组连续填充列,则以下内容将获取列范围内最后使用的行号:

Option Explicit

Public Sub AddSubTotal()

    Dim lastRow As Long
    Dim lastCol As Long
    Dim firstRow As Long
    Dim rowHeight As Long
    Dim wb As Workbook
    Dim ws As Worksheet

    Set wb = ThisWorkbook
    Set ws = wb.Worksheets("Sheet2")             'change as appropriate

    With ws.Range("D3").CurrentRegion 'change as appropriate
        firstRow = .Rows(1).Row
        lastRow = .Rows(.Rows.Count).Row
        lastCol = .Columns(.Columns.Count).Column
        rowHeight = lastRow - firstRow + 1     
    End With

    With ws
        .Range(.Cells(lastRow + 1, "D"), .Cells(lastRow + 1, lastCol)).FormulaR1C1 = "=SUBTOTAL(9,R[-" & rowHeight & "]C:R[-1]C)"
    End With

End Sub

如果您需要一种不同的方法来查找上次使用的行和上次使用的列,那么网上有很多可用资源,包括我最喜欢的Ron De Bruin Find last row, column or last cell。每种方法的适用性取决于您的范围的形状和属性,例如没有空行列或范围内的行。因此,请选择适合您的数据的方法,或者可以针对不同的可能情况进行测试,并根据需要应用不同的方法。

在不了解数据的性质和可变性的情况下,很难给出一个明确的答案(并且我不想编写许多不同的可能场景)。如果您熟悉查找最后一行和列的方法,您将能够实现那些适合您需求的方法。