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

bre*_*tdj 10 excel vba excel-vba

背景

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

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

  1. 目前的手工流程
  2. 使用VBA刷新数据表(使用Calculation,ScreenUpdating等关闭)
  3. 运行a VBS以在不可见的Excel实例中刷新数据表

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

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

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

我目前的知识和文献搜索

  • 可以使用此类模块代码添加QueryTable BeforeRefreshAfterRefreshEvents .Intellisense不会将此作为数据表的选项提供
  • 可以像这样访问单个数据透视表和QuertyTable ActiveWorkbookk.Sheets(1).QueryTables(1).不是那样的数据表
  • 这个 MrExcel线程中建议消除所有其他Data Tables然后运行a 作为解决方法.RefreshAll

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

是的,我坚持使用Excel :)

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

  • 一个完善的持续流程的一部分,将保持Excel为基础,
  • 经过专业审核,
  • 由一些经验丰富的Excel设计师精简和优化

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

Wol*_*ehn 1

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

好吧,当我手动创建数据表时,Excel 2013 确实为我记录了一个宏,它是

Selection.Table ColumnInput:=Range("G4")
Run Code Online (Sandbox Code Playgroud)

签名是

Range.Table(RowInput as Range, ColumnInput as Range) as Boolean
Run Code Online (Sandbox Code Playgroud)

这记录在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
Run Code Online (Sandbox Code Playgroud)

尽量减少工作簿中的公式。删除与数据表所基于的单元格不相关的所有公式。删除任何中间结果。最好有一个单元格有一个(可能很大)公式。

示例:G4 是您的 ColumnInput,它包含 =2*G3,其中 G3 包含 =G1+G2,那么最好将 =2*(G1+G2) 放入 G4。

您的高端机器可能有 6 个核心。将您的场景分为 6 个块,并让 6 个 Excel 实例并行计算它们。