【问题标题】:Disable Screen Updating, Auto Calculation in Excel from Access VBA从 Access VBA 禁用屏幕更新、Excel 中的自动计算
【发布时间】:2020-03-04 12:19:33
【问题描述】:

如何从 Access VBA 更新 Excel 工作簿中的 .Application 属性?

我正在使用 Access VBA 将数据导出到 Excel、打开文件并格式化文件(添加公式等)。

代码很慢。我想禁用屏幕更新并将 Excel 计算更改为手动。

.ScreenUpdating = false 不会产生运行时错误,但屏幕会更新,就像忽略代码一样。

.Application.Calculation 产生运行时错误 1004。

Dim Xl As Excel.Application
Dim XlBook As Excel.Workbook

Set Xl = CreateObject("Excel.Application")
Set XlBook = GetObject(Forms!Main!Final_filepath)
XlBook.Activate
XlBook.Windows(1).Visible = True

'Hide alerts to prevent interruptions when running code
Xl.Application.DisplayAlerts = False  '<---- No errors
Xl.Application.ScreenUpdating = False '<---- No errors, but screen updating isn't disabled. 
Xl.Application.Calculation = xlCalculationManual  '<---- Run-Time Error 1004 

【问题讨论】:

  • 如果XlExcel.Application(并且代码可以编译),那么Xl.Application 是多余的。 Xl.ScreenUpdating = False 工作得更好吗? (没想到会这样,因为Xl.Application 应该正好指向Xl 对象)
  • FWIW Set Xl = CreateObject("Excel.Application") 是一种相当迂回的方式来做Set Xl = New Excel.Application(同样,不是问题,只是指出来)
  • 缺少一些代码,对吧?我无法理解在创建的Excel.Application 实例中没有打开任何工作簿的事实,但是XlBook 被分配得很好......GetObject 似乎是一种奇怪的方式来做到这一点。 Set XlBook = Xl.Workbooks.Open(Forms!Main!Final_filepath) 似乎更简单。
  • 我怀疑丢失的代码是答案 - 很可能,有一个隐含的 Excel.Application 实例在某处意外创建,不知何故(这很容易做到!只需忘记 @987654338 @qualifier 某处和繁荣,隐式应用程序引用,以及宏完成后在任务管理器中挥之不去的幽灵 EXCEL.EXE 进程)。
  • 嗨,Mathieu,感谢您提出的所有精彩建议。我同意我使用的代码有点笨拙,感谢您提供更简洁语法的建议。我不是一个受过正规训练的宏观作家;这些年来,我从零碎中学到了所有东西,并通过了很多很多谷歌搜索。我使用的代码被无耻地复制和科学怪人一起完成最终目标。

标签: excel vba ms-access


【解决方案1】:

我想通了!我的原始代码实际上是打开两个 Excel 实例——“Xl”和“XlBook” Xl 以 Excel 形式打开,但没有任何打开的工作簿。 XlBook 以 Excel 形式打开,并加载了工作簿(来自 Access 表单中的文件路径)。

Xl.Application 试图将工作簿属性应用到 Excel 窗口,但未加载工作簿。因此.Calculation 的运行时错误。由于没有打开的工作簿,.DisplayAlerts 和 .ScreenUpdating 没有意义,但不会产生运行时错误 - 只是代码实际上无法将其应用于工作簿,因为实际上没有打开工作簿。我想如果我随后在事后打开了一个工作簿,那么这些属性会被应用吗?

因此,我没有引用 Xl,而是引用了 XlBook,因此这些属性可以应用于打开的工作簿。我删除了对 Xl 的所有引用,因为我意识到它是一个多余的 Excel 窗口并且无论如何都不需要。

Dim XlBook As Excel.Workbook
'Open Excel workbook, and set reference to worksheet
    Set XlBook = GetObject(Forms!main!Final_filepath)
    XlBook.Activate
    XlBook.Windows(1).Visible = True

'Disable calcs and screen updating to increase speed
    XlBook.Application.Calculation = xlCalculationManual
    XlBook.Application.ScreenUpdating = False

【讨论】:

  • 干得好!验证 EXCEL.EXE 进程是否正确关闭 - 您需要通过 Xlbook.Application 调用 Excel.Application.Quit
  • 绝对是在使用这些代码行来关闭子末尾的所有内容。 :)
【解决方案2】:

您使用没有 Excel 枚举的后期绑定。尝试改用 -4135 值。或者 -4105 表示 xlcalculationAutomatic

【讨论】:

  • OP 没有使用后期绑定。 Dim Xl As Excel.Application 使 Xl 在编译时解析,并且要使 Dim 语句甚至编译,必须引用 Excel 类型库。 CreateObject 与后期绑定无关,该指令也可以Set Xl = New Excel.Application。 OP 代码中的每个成员调用都是提前绑定的。
  • 实际上 - 不正确。 Forms!Main!Final_filepathis 隐式后期绑定,因为第一个 bang 运算符 (!) 之后的所有内容都无法在编译时解析。 Application.Calculation = 0(这将是常量 if Excel 未被引用 and Option Explicit 丢失的值)不会抛出错误 1004... 它很高兴0xlCalculationManual
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多