【发布时间】:2017-10-30 16:21:52
【问题描述】:
我正在用 Excel-VBA 编写一个带有几个按钮的管理器。
其中之一是使用另一个 Excel 文件(我称之为T)作为输入生成一个选项卡。
T的一些属性:
-
~90MB尺寸 -
~350K行 - 包含最近
14个月的销售额数据(无序)。 - 相关栏目:
year/month- 总金额
- 卖家名称
- 家庭产品
- 客户名称
- 没有 id 列(如:cod-client、cod-vendor 等)
主要关系:
- 卖家向许多客户销售许多产品
我正在生成一个新的 Excel 选项卡,其中包含来自卖家分组的最后一个 year/month 中的 T 的数据。
重要提示:
-
T是唯一可用的输入/源。 - 如果两个或多个卖家向同一个客户销售相同的产品,
total-money应计入所有这些卖家。
这就够了,现在你知道我已经编码过了。
我的代码可以运行,但是,它需要大约 4 分钟的运行时间。
我已经使用较小的源(不大于2MB)编写了一些其他按钮,这些源在 5 秒内运行。
考虑到T 的大小,4 分钟的运行时间是可以接受的。
但我并不为此感到自豪,至少现在还没有。
我的代码主要是基于Scripting.Dictionary从T映射数据,然后我使用for each key in obj ... next key将分组数据设置到新创建的标签页。
我不确定,但这是我的想法:
- 如果
N是Scripting.Dictionary中的总键,我需要在聚合total-money之前检查obj.Exists(str)。它将运行N字符串比较返回false。 - 类似地,当我执行
Set seller = obj(seller_name)时,它会运行最大N字符串比较。
我想弄错我的想法。但如果我没记错的话,我减少此函数运行时间的下一步(也是最后的希望)是使用Tries编写我自己的类对象。
我明天才开始编码,我想要的只是确认我的方法是否正确,或者如果我的方法错误,我需要一些建议。
你有什么建议吗?提前致谢。
【问题讨论】:
-
既然您有工作代码但想要改进,这个问题是否更适合代码审查网站?
-
反问:你在用
Dictionary做什么,这是数组无法完成的?如果您关心的是性能,那么除非您需要诸如键查找之类的功能,否则数组很难被击败。 -
@danieltakeshi。你在这里链接的非常有趣的帖子。我现在正在上下班,我很可能很快就会开始使用 Tries 编写我的字典类。 @ sous2817,斯科特霍尔兹曼。关于 CodeReview,我没有在那里发帖,因为我只是想知道我的想法是否正确,或者即使有人以前遇到过这样的问题并以不同的方式处理它,我也不会给出一些要求改进它的代码。何时以及如果我可以减少运行时间,我会发布答案。
-
字典的唯一缺点是每个键都必须是唯一的,并且您不能像在数组中那样在一行中读取大范围。但它的使用速度更快,并且有
.exists和.remove之类的方法。基本上我总是使用字典,除非没有唯一的键,或者我在小范围内工作。
标签: excel dictionary vba