excel 如何加快将数组中的每个值与列中的每个值进行比较的循环?

y1aodyip  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(222)

我有8对数据集。
每一对由通常具有400个串元素的1维阵列和通常具有2000个串元素的列组成。
在每一对数据集中,我希望对照列的每个元素检查数组的每个元素是否匹配。
我的方法的简化版本:

For i = 1 to 8
    For j = 0 to 400
        For k = 0 to 2000
           If Cells(k,i) = myArray[1, then 2, then 3, etc.](j) then [action]
        next K
    next j
next i

我循环A列的前2000个单元格400次,然后循环B列的前2000个单元格400次,以此类推,这似乎是多余的,大约检查了640万个单元格。
实际的代码。它寻找同样具有限定布尔值的重复项。当这些条件满足时,它将获取它们关联的整数值和行号。
它对所有整数值求和,并将这些整数替换为它们的和。
它对每个唯一的名称都这样做,然后(未示出)对剩余的7个数据集重复此操作。

For i = 0 To j - 1 'starts with the first unique element and searches for dupes...
    v = 0 'initial qty value 
    r = 0 'initial number of rows with dupes
    For k = 2 To WULastRow 'go though each cell in the first column
        If Cells(k, colPair + 2) = True And Cells(k, colPair).Text = uniqueNames(i) Then '...if one is found and the row's boolean is true...
            v = v + Cells(k, colPair + 1).Value '...sum it's qty with previous dupes qty's...
            r = r + 1 'increment number of dupes found
            ReDim Preserve rngMatch(r - 1) 'increase the size of the array that will hold the row numbers of the dupes.
            rngMatch(r - 1) = k '...and input dupe's row number to said array.
        End If
    Next k

    k = 0
    
    'if 1 or more duplicate is found for the given unique item name is found...
    If r > 1 Then
        k = 0
        For k = 0 To r - 1
            Cells(rngMatch(k), colPair + 1).Value = v '...input the summed quantity in their qty cells...
        Next k
    End If
Next i 'then regardless, move on to the name unique name and repeat this process.
bjg7j2ky

bjg7j2ky1#

每次访问Cell(i,j)时都有大量开销
为了避免这种情况,你需要用一条语句把数据放入一个变量数组,然后循环这个数组,如果需要的话,再把它放回去:下面是一些演示代码

Option Base 1
dim vArr as variant
varr=Range("A1").resize(Lastrow,LastCol).Value2
for j=1 to LastRow
for k=1 to LastCol
if vArr(j,k) .... then Varr(j,k)= ...
next k
next j
Range("A1").resize(Lastrow,LastCol)=Varr
ax6ht2ek

ax6ht2ek2#

你需要做的是实现某种类型的变量排序启发式算法来对矩阵中的元素进行排序(从最低到最高,等等)。
如果我有一个数组a = [1,8,16](从最小到最大排序)和另一个数组b = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16](再次排序),我可以引入一个规则,即每次搜索迭代都发生在上一次搜索的结束位置。

index = 0
for i in a:
   for j in range(index, len(b)):
      if a == b:
          do something
          index = j

这样做的效果是,每次匹配一个值时,你可以搜索一个越来越小的迭代空间,希望这是有意义的--尽管对b矩阵应用变量排序可能很坚韧。

相关问题