以编程方式控制/拦截数据表刷新
背景
我有一个非常大的数据表 ,在一台高端的64位机器上需要长达12个小时才能运行大约100万个input场景。 这些scheme基于一些离散的Excel模型,然后将其input财务模型进行详细计算
为了改善这个过程,我正在testing和比较以下的速度:
- 目前的手动过程
- 使用VBA刷新数据表(与
Calculation
,ScreenUpdating
等closures) - 运行
VBS
刷新不可见的Excel实例中的数据表
所以,我正在寻找以编程方式pipe理数据表的最佳方法
更新:使用(2)和(3)中的代码没有提供testing带有单个大型数据表的工作簿的简单示例的好处
而令人惊讶的是,在VBA中对于数据表的直接支持似乎很less(可能没有)
我目前的知识和文献检索
- QueryTable
BeforeRefresh
和AfterRefresh
事件可以用这个类模块代码添加。 智能感知不提供这个作为数据表的选项 - 单个数据透视表和QuertyTables可以像
ActiveWorkbookk.Sheets(1).QueryTables(1)
一样被访问。 不是那么数据表 - 在这个 MrExcel线程中build议删除所有其他
Data Tables
,然后运行RefreshAll
作为解决方法。
解决方法肯定是可行的,因为我只有一个数据表,但我更喜欢直接的方法,如果存在。
是的,我坚持Excel的:)
请不要build议这种方法的其他工具,input模型和使用数据表的总体模型
- 作为一个完善的持续过程的一部分,将保持基于Excel,
- 已经过专业审计,
- 已经被Exceldevise师的一些经验精简和优化
我只是好奇,是否有办法通过使用代码来刷新特定的数据表来调整过程,我的初步testing结果已经得出了不可能的结论。
所以,您正在寻找以编程方式pipe理数据表的最佳方法。
那么,当我手动创build一个数据表时,Excel 2013logging了一个macros
Selection.Table ColumnInput:=Range("G4")
签名是
Range.Table(RowInput as Range, ColumnInput as Range) as Boolean
这在Range.Table方法中有logging 。 Range.Table()函数似乎总是返回true。
这是使用VBA创build数据表的唯一方法。 但无论如何这就是数据表。
AFAIK没有类或对象的数据表,所以没有dt.refresh()或类似的方法。 没有可以查询的数据表的集合。 您必须刷新工作表或使用Range.Table()重新创build表。
有一个DataTable接口 ,但它与图表有关,并且与Range.Table()无关。
正如你所说,你应该closures通常的嫌疑犯,即
Application.ScreenUpdating = False Application.DisplayStatusBar = False Application.Calculation = xlCalculationManual Application.EnableEvents = False
尝试在工作簿中使用小公式。 删除所有与您基于数据表的单元格不相关的公式。 删除任何中间结果。 最好有一个细胞,一个可能是大的公式。
例如:G4是您的ColumnInput,它包含= 2 * G3,G3包含= G1 + G2,则更好的放置= 2 *(G1 + G2)到G4中。
您的高端机器可能有6个内核。 将您的场景划分为6个块,并有6个Excel实例并行计算它们。