【问题标题】:Aggregating part of a 2d array in a column in said array在所述数组的列中聚合二维数组的一部分
【发布时间】:2020-09-17 11:55:15
【问题描述】:

我有一个二维数组,尺寸灵活:

arr_emissions(1 to n, 0 to m) 

其中n 为 22 或更大,m 为 6 或更大。

在最小的情况下,列m = 6 应该包含列m = 2 - 5 的总和。 我当然可以简单地添加它们,但由于数组的维度很灵活,我想实现一个更健壮的方法,最好不要循环整个数组。

我希望实现原生的application.WorksheetFormula.Sum()。我在this answer 中看到了一个实现,但它只适用于完整的行或列。

示例: 我有arr_emissions(0 to 111,1 to 6)。它以从 1 到 111 的循环填充。

数组中的数据如下:

(1,1) #3-4-2020#  'a date value
(1,2) 1,379777
(1,3) 0
(1,4) Empty
(1,5) Empty

【问题讨论】:

  • @SJR 不知道,需要注册
  • 它是免费的。 Application.Sum(Application.Index(MyArray, Evaluate("ROW(50:15000)"), Array(2, 3))) 对 MyArray 的第 2 列和第 3 列的第 50-15000 行求和。
  • 你能澄清你想要做什么吗?在您的示例中,n 代表行,而不是列。我看看能不能模拟一个例子。

标签: arrays excel vba sum


【解决方案1】:

不知道这是否有帮助,但这需要一个源数组v,然后用v 对应行的第2-4 列的总和填充一个新数组w

Sub x()

Dim v, i As Long, w()

'just to populate source array
v = Range("A1").CurrentRegion.Value

ReDim w(1 To UBound(v, 1))

For i = 1 To UBound(w)
    'each element of w is sum of columns 2-4 of corresponding row of v
    w(i) = Application.Sum(Application.Index(v, i, Array(2, 3, 4)))
Next i

'write w to sheet
Range("G1").Resize(UBound(w)) = Application.Transpose(w)

End Sub

【讨论】:

【解决方案2】:

感谢answer from SJR,我找到了一个可行的解决方案。这一切都在一段较大的代码中,但在这个例子中,我用固定数字填充了一些变量,以匹配我的问题中的示例。

Dim days as Integer
days = 111
Dim emissions_rows as Integer
emissions_cols = 6
ReDim arr_emissions(0 To days, 1 To emissions_cols) As Variant
Dim arr_sum As Variant
Dim sum_str As String
sum_str = "Transpose(row(2:" & emissions_rows - 1 & "))"
arr_sum = Application.Evaluate(sum_str) '= Array(2,3,4,5)

arr_emissions(emissions_index, emissions_cols) = Application.Sum(Application.Index(arr_emissions, emissions_index + 1, arr_sum))

代码写入一个包含变量的字符串,因此取第二列直到倒数第二列,然后将其计算为一个数组。
然后在 sum 函数中使用该数组,仅对这些列求和。
然后将结果写入arr_emissions() 的最后一列。

emissions_index 是一个用于遍历数组的索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-24
    • 2021-06-17
    • 2022-10-05
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多