以编程方式控制/拦截数据表刷新

背景

我有一个非常大的数据表 ,在一台高端的64位机器上需要长达12个小时才能运行大约100万个input场景。 这些scheme基于一些离散的Excel模型,然后将其input财务模型进行详细计算

为了改善这个过程,我正在testing和比较以下的速度:

  1. 目前的手动过程
  2. 使用VBA刷新数据表(与CalculationScreenUpdating等closures)
  3. 运行VBS刷新不可见的Excel实例中的数据表

所以,我正在寻找以编程方式pipe理数据表的最佳方法

更新:使用(2)和(3)中的代码没有提供testing带有单个大型数据表的工作簿的简单示例的好处

而令人惊讶的是,在VBA中对于数据表的直接支持似乎很less(可能没有)

我目前的知识和文献检索

  • QueryTable BeforeRefreshAfterRefresh事件可以用这个类模块代码添加。 智能感知不提供这个作为数据表的选项
  • 单个数据透视表和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实例并行计算它们。