排序列表不打印:VBA到Excel

时间:2016-10-18 19:26:26

标签: arrays excel vba excel-vba

我有一个数组,它从多个工作表中获取数据,以打印到单个工作簿中的摘要表。单步执行代码时,数组似乎正在通过所有工作表抓取正确的数据。然后,数组应该在每次循环中保存信息到排序列表。

源数据由两个并排(水平)部分组成,代表两个工人。就形成而言,每个工人的数据是相同的。

我的列表未打印到摘要页面,而list.count似乎存在问题。如果我有list.count -1那么for循环根本不运行。如果我省略-1,那么我得到一次循环。

列表中存储的数组和/或汇总表的列表输出有什么问题?

Dim arTemp
Dim arTemp1
Dim d As Date
Dim x As Long, Y As Integer
Dim ws As Worksheet
Dim list As Object, list1 As Object

Set list = CreateObject("System.Collections.SortedList")
Set list1 = CreateObject("System.Collections.SortedList")

For Each ws In Worksheets
    If ws.Name <> "Summary" And ws.Name <> "SheetX" Then
        With ws
            For y = 3 to 7
                d=DateSerial(Year(.Cells(3,y)), Month(.Cells(3,y)),1
                If List.containskey(d) then
                    arTemp = list(d)
                    arTemp1 = list1(d)
                Else
                    ReDim arTemp(13)
                    ReDim arTemp1(13)
                End If
                arTemp(0) = arTemp(0) + .Cells(4,y)
                arTemp(1) = arTemp(1) + .Cells(5,y)
                arTemp(2) = arTemp(2) + .Cells(6,y)
                .
                .
                .
                arTemp(12) = arTemp(12) + .Cells(16,y)
                arTemp(13) = arTemp(13) + 1
                list(d) = arTemp

                arTemp1(0) = arTemp1(0) + .Cells(4,y + 11)
                arTemp1(1) = arTemp1(1) + .Cells(5,y + 11)
                arTemp1(2) = arTemp1(2) + .Cells(6,y + 11)
                .
                .
                .
                arTemp1(12) = arTemp1(12) + .Cells(16,y + 11)
                arTemp1(13) = arTemp1(13) + 1
                list1(d) = arTemp1
            Next
        End With
    End If
Next

With Worksheets("Summary")
    .Cells.Delete
    For x = 0 To list.Count - 1
        d = list.getkey(x)
        .Cells(x + 43, 1) = Year(d)
        .Cells(x + 43, 2) = Month(d)
        .Cells(x + 43, 3) = list(d)(0)
        .Cells(x + 43, 4) = list(d)(1)
        .
        .
        .
        .Cells(x +43, 15) = list(d)(12)
    Next

    For x = 0 To list.Count - 1
        d = list1.getkey(x)
        .Cells(x + 43, 1) = Year(d)
        .Cells(x + 43, 2) = Month(d)
        .Cells(x + 43, 3) = list1(d)(0)
        .Cells(x + 43, 4) = list1(d)(1)
        .
        .
        .
        .Cells(x +43, 15) = list1(d)(12)
    Next
End With

1 个答案:

答案 0 :(得分:0)

由于这是一个庞大的电子表格,我将我的初始测试字段缩小为两个数组。问题是我的列表计数器没有递增,因为它们指向的列表在我的实际代码中已被注释用于测试目的。因此,后续列表(list1,list2,list3 ......)仅限于“初始”列表中的记录数。因此,没有任何东西可以触发数据输出的For循环:list.Count - 1没有值,因此跳过For循环。

由于每个列表具有相同数量的记录,我的初始条件只是使用第一个列表的索引作为所有后续列表的边界。但是,如果未运行第一个列表(在测试期间),则会中断。最好的解决方案是让每个列表的循环检查它自己的个别边界。

For x=0 to list.Count -1
  d=list.getkey(x)
  do stuff
Next

For X=0 to list1.Count-1
 d=list1.getkey(x)
 do stuff
Next