循环通过相同数据列的最有效方法 - 没有重复

时间:2015-10-02 14:41:59

标签: excel-vba vba excel

我编写了一些内容来评估每种可能的输入组合的结果,希望能够优化解决方案。

我有三个相同的输入列,我的循环遍历所有输入以寻找最佳输入组合以产生最高输出。例如:

  1. 475475475
  2. 391391391
  3. 24,24,24
  4. 999999999
  5. 不允许重复。我已经能够为每次迭代纠正错误,但不能迭代v。迭代。作为一个例子,我评估的第一个结果是475 391 24。

    问题:输入的顺序对我评估的结果没有影响。我的数据集太大了,评估475 391 24然后再次评估391 475 24,然后再评估24 391 475是耗时的。有没有办法围绕这个进行设计?我无法操纵源数据。我只有一个适度的VBA技能组,但即使是解决这个问题的基本概念也会有所帮助。我想这是许多编程语言中的常见问题。

2 个答案:

答案 0 :(得分:0)

一种可能的解决方案是以某种方式使用字典:每当您读取3个值时,对它们进行排序,将它们按升序排列在CSV字符串中,然后在字典中查找。

很难确定这是否会加速您的代码,因为您需要确定您的评估函数是否比排序和字典查找操作更高或更低。

另一种可能性是在对数据进行某些转换后从数据中删除重复项。假设您的数据位于A,B和C列中。使用以下方式将数据生成到D,E和F中:

第一列包含min:Di - > =min(Ai:Ci)

第三列是最大值:Fi - > =max(Ai, Ci)

第二列是中间Ei - > =sum(Ai:Ci) - Di - Fi)

之后,选择D,E,F中的范围,将其复制并粘贴为值,删除重复项,最后,对剩余数据应用您的过程。

答案 1 :(得分:0)

如果输入顺序没有影响,您可以先对列表进行排序。然后从第一列中选​​择一个项目,从第二列中选择一个大于第一个项目的项目,从第三个列中选择一个大于第二个项目的项目。这样可以确保每个组合只尝试一次,而不是6次(如果初始排序不太繁琐,那么速度加快~6倍)。