Excel VBA使用带有条件的序列将值分配给多维数组

时间:2019-06-27 13:37:42

标签: excel vba performance time coding-efficiency

我正在VBA for Excel中寻找一种方法,该方法比将数组group 1或2中的序列分配给数组match的速度更快,取决于{{1 }}值和group的值。

匹配条件/过程:

  1. match(a,2)数组最初为空
  2. 来自match列表的
  3. 序列必须与serial1列表中的序列匹配。
  4. serial2列表相对应的match(a,2)的值必须为空(即vbnullstring)才能被考虑-否则将考虑下一个serial1的值。
  5. 如果match(a,2)列表中的序列的serial2具有对应的值1,则该组值的位置-group在{{1 }}对应于pos列表。
  6. 如果match(a,1)列表中的序列的serial1具有对应的值serial2,则该组值的位置-2在{{1 }}对应于group列表。

我尝试使用scripting.dictionary但被卡住(如链接的问题)。

下面的示例数据和当前代码。 posmatch(a,2)的值是唯一的,应视为具有相同数量的值(计数)

当前有超过23000行数据,并且该数据将在未来几个月内逐渐增加。

当前,以下代码在i7处理器上不到8分钟。 主要目的是在可能的情况下减少时间。一个公式可能会更快,但同时也在寻找其他解决方案,例如词典,馆藏等。

不能使用数据库-客户不允许这样做。

这是一个来自以下问题,但与以下问题无关:Excel VBA updating dates efficiently with non-unique string values and boolean data

样本输入数据:

serial1

预期的输出数据:

serial1

当前代码:

serial2

未尝试的字典代码-不知道如何构造它

match1    match2    serial1    serial2    group    pos
(blank)    (blank)    ABC001   ABC002    1    1    
(blank)    (blank)    ABC002   ABC004    2    2  
(blank)    (blank)    ABC003   ABC003    1    3  
(blank)    (blank)    ABC005   ABC006    2    4  
(blank)    (blank)    ABC007   ABC001    2    5  
(blank)    (blank)    ABC004   ABC005    1    6  
(blank)    (blank)    ABC006   ABC007    1    7  

1 个答案:

答案 0 :(得分:0)

在预期的输出示例中,第3行数据是否不正确?

如果是这样,您应该可以使用公式而不是VBA轻松解决此问题。例如,假设标题行存在并且数据从第2行开始,则第一行列的代码为...

=IF(E2=1,"",MATCH(C2,D:D,0)-1)        =IF(E2=2,"",MATCH(C2,D:D,0)-1)