在VBA中条件下汇总数组的特定条目

时间:2016-02-25 12:57:35

标签: arrays vba excel-vba if-statement sum

我在汇总VBA中数组的特定条目时遇到问题。我举一个例子说明我的矩阵是什么样的(让我们称之为矩阵“startMatrix”)

Date      ticker      value
2005.01   200         1000
2005.01   300         2222
2005.01   400         2000
2005.02   200         1100
2005.02   300         3000
2005.02   400         5555

在VBA中,矩阵的读入方式如下:

startMatrix(1,1) = 2005.01
startMatrix(1,2) = 200
startMatrix(1,3) = 1000
startMatrix(2,1) = 2005.01
startMatrix(2,2) = 300
....
startMatrix(6,3) = 5555

因此,如果股票代码为200或300,我想总结每个日期的值并保存这个新数组(让我们称之为finalMatrix)。 finalMatrix应该是这样的:

Date      Value
2005.01   3222
2005.02   4100

finalMatrix最终应该在VBA中看起来像这样:

finalMatrix(1,1) = 2005.01
finalMatrix(1,2) = 3222
finalMatrix(2,1) = 2005.01
finalMatrix(2,2) = 4100

我不习惯这些操作,所以我真的非常感谢你的帮助。 提前谢谢你,祝你有个愉快的一天 埃利奥

1 个答案:

答案 0 :(得分:2)

最好使用字典而不是数组作为输出。

  

启用Microsoft Scripting Runtime参考

使用字典时,您可以输入日期作为键。然后,您可以评估startMatrix数组的每次迭代,该日期是否已作为键存在。如果没有,则创建一个新密钥并添加该值。如果它确实存在,则获取分配给键的值,并从数组中添加其他值。

Option Explicit

Public Sub sum_values()

    Dim wb As Workbook, ws As Worksheet
    Dim dict As Scripting.Dictionary
    Dim startMatrix() As Variant
    Dim i As Long

    Set wb = ThisWorkbook
    Set ws = wb.Sheets(1)

    startMatrix = ws.Range("A2:C7")

    Set dict = New Scripting.Dictionary

    For i = LBound(startMatrix, 1) To UBound(startMatrix, 1)

        If Not dict.Exists(startMatrix(i, 1)) Then

            dict(startMatrix(i, 1)) = startMatrix(i, 3)

        Else

            dict(startMatrix(i, 1)) = dict(startMatrix(i, 1)) + startMatrix(i, 3)

        End If

    Next i

End Sub

像上面这样的东西对你有用。 Here是字典的阅读材料。

你甚至可以排除If语句,只需在For...Next语句中包含这一行:

dict(startMatrix(i, 1)) = dict(startMatrix(i, 1)) + startMatrix(i, 3)