【发布时间】:2010-01-22 22:48:19
【问题描述】:
问题:我想知道在 Excel 2003 VBA 中处理数组的最佳解决方案是什么
背景:我在 Excel 2003 中有一个超过 5000 行的宏。我在过去 2 年中构建了它,将新功能添加为新过程,这有助于分割代码并调试、更改或添加到该功能。缺点是我在多个过程中使用了许多相同的基本信息,这需要我多次将其加载到具有微小差异的数组中。我现在遇到了运行时间长度的问题,所以我现在可以进行完全重写。
该文件用于抓取多项制造流程(最多 4 个不同的设置,总共最多 10 个不同的流程,每个流程最多 1000 个步骤),信息是特定于流程的,特定于分组/排序的子流程用途和数据(例如移动、库存、CT、...)
然后,它将数据粘贴到用于管理流程的多张工作表上,利用要阅读的数据表、图表和单元格格式来表示流程能力/历史记录。
流程在 Excel 文件中,而制造数据通过 7 种不同的 OO4O Oracle SQL 拉取读取,其中一些重复使用多次
数组是:
arrrFlow(1 to 1000, 1 to 4) 作为具有 4 个字符串的记录类型
arrrSubFlow(1 到 1000, 1 到 10) 作为记录类型,包含 4 个字符串、2 个整数和 1 个单
arrrData(1 到 1000, 1 到 10) 作为记录类型,具有 1 个字符串、4 个整数、12 个长整数和 1 个单字节
arriSort(1 to 1000, 1 to 4) as Integer(用作指针数组,以组、子组和步骤顺序对流、子流和数据进行排序,同时保持原始数组按步骤顺序)
可能性:
1) 将宏重写为一个大过程,该过程将数据加载到在过程中标注的主数组中一次
Pro:在过程中标注而不是作为模块中的公共变量并且未通过。
缺点:使用一个大型程序而不是多个较小的程序更难调试。
2) 使用多个过程保留宏,但传递数组
优点:使用多个较小的程序更容易调试代码。
缺点:传递数组(昂贵?)
3) 使用多个过程保留宏,但数组是模块中的公共变暗变量
优点:使用多个较小的程序更容易调试代码。
缺点:公共数组(昂贵?)
那么,社区的结论是什么?有谁知道使用公共数组与传递数组的费用?是否值得失去让我的程序专注于一个功能的便利性?
更新:
我在离散级别加载库存数据(每个步骤多个),在聚合级别移动数据(每个步骤一个),在聚合级别加载班次开始库存。我通过逐步将库存数据置于工作状态类别(运行、等待、...)中来聚合库存数据,并根据工作表上已有的数据创建目标。
我有一个按类型显示工作流程的流程图,目前 3 个产品具有相似但不完全相同的流程,2 个产品是不同的流程,它们相似但又不相同。我已经为不同流程中的每组步骤分配了一个组和子组。
我将这些数据放在多张纸上,有些按步骤顺序,有些按组/子组顺序。我还需要按组和产品、组/子组和产品、部分生产线和产品以及产品汇总的数据。
我使用记录类型,所以我实际上有一个可读的三维数组,arrSubFlow(1,1).strStep(第一个设备的第一个步骤的步骤名称),arrData(10,5).lngYest(昨天的移动第 5 个装置的第 10 步)。
我的主要优化点将在我每次从头开始创建 10 个页面的部分。合并单元格、边框、标题……这是一个非常耗时的过程。我将添加一个部分,将我的数据与页面进行比较,以查看是否需要更改,如果需要,则仅重新创建它,否则,我将清除每个数据部分并仅将更改的数据写入工作表。根据我的时间记录数据,这将是巨大的。但是,每当我更新代码时,我总是尝试改进代码的其他方面。我认为将数据加载到结构 (Array, RecordSet, Collection) once 既是一点点优化,但对于数据完整性而言更是如此,所以我没有机会加载它不同的工作表不同。
我现在看到远离数组的主要问题是:
* 已经对它们进行了大量投资,但这不是不改变的充分理由
* 不知道通过它们是否有很多成本,因为它将由 ByRef
* 我使用一个排序函数来创建一个排序的“指针”数组,它让我可以按照步骤流顺序离开数组,同时可以轻松地按组/子组顺序引用它。
由于我一直在尝试为现在和未来编写代码,我并不反对将数组更新为 RecordSet 或 Collections,而不仅仅是为了改变它们来学习一些很酷的东西。我的阵列有效,根据我的研究,它们增加了运行时间,而不是这个 2 分钟报告的大量时间。因此,如果将来另一个结构比记录类型的二维数组更容易更新,那么请告诉我,但是有没有人知道将数组传递给过程的成本,假设你不做 ByVal 传递?
【问题讨论】:
-
克雷格,请您花 5 分钟时间尝试一下我概述的破解代码统计性能方法并将结果发布在这里吗?此外,如果有任何方法可以隐藏您的代码以在此处共享,那将是很棒的。或者,如果你能获得许可与一个人分享,我很高兴看到我能做些什么来提供帮助。你想让我签署保密协议吗?
-
令人失望的是,您从未尝试过我所说的。当人们如此确信自己的正确性以至于他们甚至不会尝试某事时,这真是令人沮丧。
-
对不起,我从这个急需的重写中被拉到其他活动上。他们甚至不会给我时间去做我理解的事情,更不用说学习更好的方法了。现在他们对 Excel 发誓。我非常感谢您为教我更好的方法所付出的努力,我希望其他人也能从中受益。
-
直到今天我才看到您的最终评论。很抱歉,您永远无法在这方面取得更多进展。