用VBA总结dynamic变化的列

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

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

我卡住的地方是增加列,即在下一次迭代中求和“列H”之后,它应该在“列I”—->(Sum(i + k)= Application.WorksheetFunction.Sum (范围( “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 

正如Tim提到的那样,您可以使用Resize方法来修改Range的大小。

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

以上应该创build一个新的范围是j列宽。

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

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

  • 你没有正确地声明你的variables,除非你真的打算把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

    否则,除非您为每个variables指定一个types,否则它们将是Variant。

  • 为了便于阅读,您可能希望避免在保留或半保留关键字或Sum等现有函数之后命名variables。 我会将该variables重命名为mySumsumArray或其他的东西,这将明显地向未来的用户表明,这是一个variables,而不是一个函数。

  • 我在上面的评论中提到,最初以1000的上限来标注数组variables是非常笨拙的,如果遇到需要更大的数组的情况,那么显然会失败。 这可能不是这种情况,但它仍然是一个笨重的方式来定义一个数组。 我build议Dim mySum() as Double ,然后在代码中稍后重新使用ReDimvariables,如果在运行时需要真正dynamic的话,可以使用ReDim Preserve

UPDATE

这是一个简单的例子,你的代码只是一个片段/不完整的,所以我不能使用它,但这个例子应该说明这是如何工作的。

 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