Excel vba - 比较三个范围

时间:2011-10-21 07:26:57

标签: vba loops for-loop excel-2007

我需要一些帮助来遍历三个范围(工作表)并来回检查数据。但是这些For循环正在杀死我。三个循环对我来说有点太多了,我甚至不确定如何在逻辑上展开代码,什么在哪里等等。

好的,基本上我将这三个范围收集到他们自己的Variants数组中:

  • 摘要
  • 用户
  • 文章

我有这张表,可供在线观看。不需要下载或任何东西。我有宏代码,如果摘要表是空的,它会收集数据。这是应该做的。 https://skydrive.live.com/view.aspx?cid=5D018DB0458F03ED&resid=5D018DB0458F03ED%21164

电子表格中有一些挪威语单词,但这并不重要:)它基本上是Oppsummering(摘要),Brukere(用户)和Artikler(文章)。

无论如何,我想确保摘要表包含每个用户的次数与文章一样多。基本上它应该是镜像的。如果我从“用户”工作表中删除一行(名称),那么这些行也应该从“摘要”表中删除。但同时我也要保留摘要表中D列的数据。因此,我需要将这些数据与用户ID和文章ID一起保存,以确保D列中的数据位于正确的位置。

这是我的(坏)代码,因为它现在是..

    With shtSummary
    ReDim tempArr(1 To UBound(arrUsers) * UBound(arrarticles), 1 To 6)
    If Not .Range("A2") = "" Then
        arrsummary = .Range("A2", .Cells(Rows.Count, "A").End(xlUp)).Resize(, 6)

        ' Start collecting data, make sure summary sheet contains refreshed data while keeping the amount of each item for that particular user
        For u = 1 To UBound(arrsummary)
            For i = 1 To UBound(arrUsers)
                For p = 1 To UBound(arrarticles)
                    j = j + 1
                    ' Check ID
                    If arrsummary(u, 1) = arrUsers(i, 1) And arrsummary(u, 3) = arrarticles(p, 1) Then
                        ' ID
                        tempArr(j, 1) = arrUsers(u, 1)
                        ' Name
                        tempArr(j, 2) = arrUsers(u, 2)
                        ' Article Number
                        tempArr(j, 3) = arrarticles(i, 1)
                        ' Article Name
                        tempArr(j, 4) = arrarticles(i, 2)
                        ' Amount of that item
                        tempArr(j, 5) = arrsumary(u, 5)
                        ' Price of that article
                        tempArr(j, 6) = arrarticles(i, 3)
                    End If
                Next
            Next
        Next

    Else
        ' If summary sheet is empty, add all data from the two other sheets
        For u = 1 To UBound(arrUsers)
            For i = 1 To UBound(arrarticles)
                j = j + 1
                ' ID
                tempArr(j, 1) = arrUsers(u, 1)
                ' Name
                tempArr(j, 2) = arrUsers(u, 2)
                ' Article number
                tempArr(j, 3) = arrarticles(i, 1)
                ' Article name
                tempArr(j, 4) = arrarticles(i, 2)
                ' Article price
                tempArr(j, 6) = arrarticles(i, 3)
            Next
        Next
        ' Finally add data to spreadsheet Summary
        .Range("A2").Resize(j, 6).Value = tempArr
    End If
End With

注意有三个For循环,这对我来说有点太多了我认为..我之前在Stackoverflow有一个类似的线程,有人建议我添加另一张表来基本复制摘要表中的数据。这样我就可以在最后从摘要表中擦除数据。但我不明白为什么人们需要这样做,我的意思是,无论如何,我保留shtSummary中摘要表中的所有数据,它只是在一个数组中。但是,这是相同的数据呢?

编辑:这样简化了这个东西的运作方式。在文章表中为每个项重复每个用户名。意思是,如果有10篇文章,重复用户名10次。文章可在文章表中找到,用户可在用户表中找到。但是,摘要表中D列中的数据不是从另一张表中收集的,而是直接输入到摘要表中。这就是问题,如果我只清空摘要表并从用户和文章表中重新导入数据,那么数据就会丢失。因为这很容易(在上面的宏中完成)。它只是记住每个用户的每个项目的数量数据是问题。如果userID为“2”,articleNumber“452”在D列中的值为2,那么我想保留它并确保ColumnD中的值“2”被“粘合”到userID“2”的行,articleNumber“452 ”

1 个答案:

答案 0 :(得分:1)

一个快速说明:在您的问题中,它表示金额在D列中,但在您的示例文件中,它位于E列中,因此在引用该列时我将使用E列。

我同意这些评论,在Access中可能更容易,但是看看大多数用户喜欢使用Excel,这里是我用来解决这个问题的算法:

  • 将列A(用户ID),C(文章ID)和E(金额)复制到临时工作表以保留金额,以便我们以后再添加它们
  • 清除摘要表的内容(这比手动检查需要删除哪些用户和/或文章更容易)
  • 使用两个嵌套的for循环迭代用户和文章表的内容,并将用户ID(带有关联名称)和文章ID(以及相关名称和价格)的所有组合输入到A,B,C列中和摘要表的F
  • 对摘要表进行迭代,并使用用户ID和文章ID作为搜索关键字在临时表中查找原始金额以填写E列

我希望这会有所帮助,即使我没有找到确切的VBA代码。如果您在代码中需要帮助,请告诉我们。