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

时间:2014-01-14 03:26:36

标签: excel vba excel-vba

背景

我有一个非常大的data table,在高端64位机器上运行大约100万个输入场景需要长达12个小时。 这些方案基于许多离散的Excel模型,然后将其输入财务模型以进行详细计算

为了改进这个过程,我希望测试并比较以下的速度:

  1. 当前的手动流程
  2. 使用VBA刷新数据表(关闭CalculationScreenUpdating等)
  3. 运行VBS以刷新不可见Excel实例中的数据表
  4. 所以,我正在寻找以编程方式管理数据表的最佳方法

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

    相当令人惊讶的是,在数据表的VBA中似乎很少 - 可能没有 - 直接支持

    我目前的知识和文献搜索

    • QueryTable BeforeRefreshAfterRefresh可以使用此class module code添加事件。 Intellisense不提供此作为数据表的选项
    • 可以像ActiveWorkbookk.Sheets(1).QueryTables(1)那样访问单个数据透视表和QuertyTable。不是那样的数据表
    • this MrExcel主题中建议删除所有其他Data Tables,然后运行RefreshAll作为解决方法。

    解决方法肯定是可行的,因为我只有一个数据表,但如果存在,我更喜欢直接的方法。

    是的,我坚持使用Excel:)

    请不要为此方法建议其他工具,输入模型和使用数据表的总体模型都是

    • 基于Excel的良好的持续流程的一部分,
    • 经过专业审核,
    • 已经由一些经验丰富的Excel设计师精简和优化

    我只是好奇是否有办法通过使用代码刷新特定数据表来调整过程,我上面的初始测试结果已经结束了。

1 个答案:

答案 0 :(得分:1)

因此,您正在寻找以编程方式管理数据表的最佳方法。

嗯,当我手动创建一个数据表时,Excel 2013会为我录制一个宏,它就是

Selection.Table ColumnInput:=Range("G4")

签名是

Range.Table(RowInput as Range, ColumnInput as Range) as Boolean

记录在Range.Table Method中。 Range.Table()函数似乎总是返回true。

这是使用VBA创建数据表的唯一方法。但无论如何,这就是数据表。

AFAIK数据表没有类或对象,因此没有dt.refresh()或类似的方法。并且没有可以查询的数据表集合。您必须刷新工作表或使用Range.Table()重新创建表。

DataTable Interface,但它与图表有关,与Range.Table()无关。

如你所说,你应该关掉通常的嫌疑人,即

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实例并行计算它们。