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

问题描述 投票:0回答:1

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

    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
excel vba excel-vba
1个回答
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。每种方法的适用性取决于您的范围的形状和属性,例如没有空行列或范围内的行。因此,请选择适合您的数据的方法,或者可以针对不同的可能情况进行测试,并根据需要应用不同的方法。

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

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.