使用VBA对动态变化列进行求和

时间:2013-05-13 22:03:11

标签: excel vba

我需要计算每列中的值的总和并将其存储在数组中。请注意,列数不固定。它动态变化。这是我完全卡住的地方。这只是我写的一个巨大功能的一部分。

在下面的代码中,我正在求和的“H列”是一个变量。我的意思是计算总和的列数基于Val(i)的值。 对于Eg:如果Val(0)= 10,那么我需要计算从列H到列Q的所有数字的总和,并且将每列的总和存储在一个数组中,即,(0)=列H的总和; sum(1)=第I列的总和;等等。

我被卡住的点是增加列,即在下一次迭代中对“列H”求和之后它应该对“列I”中的元素进行求和----> (Sum(i + k)= Application.WorksheetFunction.Sum(Range(“H2”))

我尝试了类似下面的内容:

Dim i, j, k, l, MaxVal As Integer
Dim objNewSheet As Worksheet
Dim Sum(0 To 1000) As Double

k = 0
For i = 0 To (MaxVal-1)
    Set objNewSheet = ActiveWorkbook.Sheets("Sheet" & (i+1))
    objNewSheet.Select
    For j = 0 To Val(i)
        Sum(i + k) = Application.WorksheetFunction.Sum(Range("H2"))
        k = k + j
    Next j
Next i

1 个答案:

答案 0 :(得分:0)

Tim提到,您可以使用Resize方法修改范围的大小。

Dim rng as Range: Set rng = Range("H2")
Sum(i + k) = Application.WorksheetFunction.Sum(rng.Resize(1, j))

以上内容应创建一个j列宽的新范围。

我添加了Range变量,因为它们更容易使用(IMO)常量,如Range("H2")。您可以使用MsgBox rng.Resize(1,j).Address查看新范围的地址。

以下是您可能需要考虑的其他几点:

  • 您没有正确声明变量,除非您真的 打算i, j, k, l as Variant。你可以这样做:

    Dim i#, j#, k#, l#, MaxValue#(简写符号)或

    Dim i as Integer, j as Integer, k as Integer, l as Integer, MaxValue as Integer

    否则,除非为每个变量指定一个类型,否则它们将是Variant。

  • 为了便于阅读,您可能希望避免在保留或半保留关键字或现有函数(如Sum)之后命名变量。我会将该变量重命名为mySumsumArray或其他显然会向未来用户表明这是变量而非函数的变量。

  • 我在上面的评论中提到,最初使用1000的上限对数组变量进行尺寸标注是一种笨重,如果你遇到需要更大的数组,显然会失败。情况可能并非如此,但它仍然是一种确定数组尺寸的笨重方式。我会在代码中稍后建议Dim mySum() as Double然后ReDim变量,如果需要在运行时真正动态,可以使用ReDim Preserve

更新

这是一个简单的示例,您的代码只是一个代码段/不完整,因此我无法使用它,但此示例应说明其工作原理。

Option Base 1
Sub Test()
    Dim i As Integer
    Dim rng As Range
    Dim mySum() As Double

    '## The initial range ##'
    Set rng = Range("H2")

    '## Do an iterative loop ##'
    For i = 1 To 4

        '## Resize the range within the iteration ##'
        Set rng = rng.Resize(1, i)  '<-- change the 1 in this line to the number of rows in the column that needs to be summed'
        '## Ensure the array is properly dimensioned ##'
        ReDim Preserve mySum(i)
        '## Store the calculation in the array ##'
        mySum(i) = Application.WorksheetFunction.Sum(rng)

    Next

End Sub