我有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.
2条答案
按热度按时间bjg7j2ky1#
每次访问Cell(i,j)时都有大量开销
为了避免这种情况,你需要用一条语句把数据放入一个变量数组,然后循环这个数组,如果需要的话,再把它放回去:下面是一些演示代码
ax6ht2ek2#
你需要做的是实现某种类型的变量排序启发式算法来对矩阵中的元素进行排序(从最低到最高,等等)。
如果我有一个数组
a = [1,8,16]
(从最小到最大排序)和另一个数组b = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
(再次排序),我可以引入一个规则,即每次搜索迭代都发生在上一次搜索的结束位置。这样做的效果是,每次匹配一个值时,你可以搜索一个越来越小的迭代空间,希望这是有意义的--尽管对
b
矩阵应用变量排序可能很坚韧。