VBA数组确定下一步放置值的位置

时间:2014-06-06 14:44:30

标签: sql arrays excel vba recordset

我有一个来自en SQL server的记录集。我不知道需要检索的确切数据量,因此我创建了一个动态数组。 我需要做的是在将数据放入数组时对数据进行单独排序。但我不知道这方面的最佳做法是什么。

E.g。我有一组数据,其中客户ID在一列中,收入在第二列中。假设我只有2个客户,并且有一个如下所示的列表:

Customer ID     Revenue
1               604
2               669
2               732
2               629
1               897
2               530

我希望我的数组有两个维度(客户1和2),并且最大长度与一个客户的最大购买量相匹配。在这种情况下,客户2进行了四次购买,而客户1进行了两次购买。因此,我的理想数组将是这样的:myArray(1到2,4)。

我将如何做到最好?

然后在我定义了我的数组之后,我想用我的数据填充它,但是数据没有排序,那么我如何确定我应该在哪个地方放下数据呢?如果这样做了吗?

例如,我最初的想法是运行数据集并执行以下操作:

i = 1

do until dataset.eof
if dataset.field("customerid") = 1 then 
   myArray(1, i) = dataset.field("customerid").value
else if dataset.field("customerid") = 2 then
   myArray(1, i) = dataset.field("customerid").value
end if

i = i + 1
dataset.movenext
loop

在客户ID发生变化之前,这一切都很好。如果第一行到客户1,那么数据将放在myArray(1,1)和myArray(1,2)中。但是,如果下一行的客户ID是客户2,则客户2的第一个条目将在myArray(2,3)中,而不是myArray(2,1),因为我希望如此。 如果我根据我的第一个问题定义了数组,我将超过数组的限制: - )

这一切都有意义吗?

提前致谢: - )

2 个答案:

答案 0 :(得分:0)

您可以使用脚本字典,其中客户ID为关键字,收入数组为值。

未测试:

dim dict as object, id, rev, tmp, k
set dict = createobject("scripting.dictionary")

do until dataset.eof
    id = dataset.fields("customerid").Value
    rev = dataset.fields("revenue").Value

    if dict.exists(id) then
        tmp = dict(id)
        ub = ubound(tmp)+1
        redim preserve tmp(0 to ub)
        tmp(ub) = rev
        dict(id) = tmp
    else
        dict(id) = Array(rev)
    end if

    dataset.movenext
loop

for each k in dict
    debug.print k, join(dict(k),", ") 
next k

答案 1 :(得分:0)

我认为数组不是此目标的最佳数据结构。我会使用一组类。这为存储和排序数据提供了极大的灵活性。例如,我创建了以下内容:

- 在工作表中(作为数据源,替换你的记录集):

data_source

-Code模块Module1:

Option Explicit

Sub jzz()

Dim Customers As Collection
Dim cust As cls_customer
Dim i As Long
Dim arr() As Long

Set Customers = New Collection
i = 1
Do Until Cells(i, 1) = vbNullString
    'check if the customer is already in the collection:'
    For Each cust In Customers
        If cust.id = Cells(i, 1) Then Exit For
    Next cust
    'check if the customer was found; if not, create new and add to collection'
    If cust Is Nothing Then
        Set cust = New cls_customer
        cust.id = Cells(i, 1)
        Customers.Add cust
    End If
    cust.Revenue = Cells(i, 2)
    i = i + 1
Loop

For Each cust In Customers
    Debug.Print cust.id, cust.Revenue_count
Next cust

Set Customers = Nothing

End Sub

-Class module cls_customer:

Option Explicit


Public id As Long
Private p_revenue_collection As Collection

Public Property Let Revenue(value As Long)
    'accepts a long (value) and adds it to the collection'
    p_revenue_collection.Add value
End Property

Public Property Get Revenue_count() As Long
    Revenue_count = p_revenue_collection.Count
End Property

Private Sub Class_Initialize()
    Set p_revenue_collection = New Collection
End Sub

该类仅包含revenue_count属性,该属性返回集合中的条目数量,但您可以随意添加自己的属性以返回已排序的数据等。