【问题标题】:How to avoid select/active statements in VBA in this example?在此示例中如何避免 VBA 中的选择/活动语句?
【发布时间】:2020-03-25 05:08:53
【问题描述】:

需要将所有工作表导出到一个 PDF 文件中,所以我找到了这段代码,它可以工作(导出一个 PDF,每个工作表都有一个页面)。但我不想使用 select / active 语句,我更喜欢使用存储对象的变量。

问题: 如何避免在这段代码中选择/ ActiveSheet?

ThisWorkbook.Sheets(Array("Sheet1", "Sheet2")).Select

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
    "C:\tempo.pdf", Quality:= xlQualityStandard, IncludeDocProperties:=True, _
     IgnorePrintAreas:=False, OpenAfterPublish:=True

【问题讨论】:

标签: excel vba


【解决方案1】:

TL;DR:在这种情况下,您无法避免 Select,因为您需要 ActiveSheet.ExportAsFixedFormat 的后期绑定行为,这显然考虑到了选定的工作表——早绑定Worksheet.ExportAsFixedFormat 不行。


ExportAsFixedFormatExcel.Worksheet 的成员。

ActiveSheet 不是Excel.Worksheet,但它是Object(因此任何反对的成员都必须是后期绑定的)。这是一个重要的细节。

当你这样做时:

ThisWorkbook.Sheets(Array("Sheet1", "Sheet2")).Select

.Select 成员调用不是针对 Worksheet 对象进行的:给定工作表名称数组,Sheets(或 Worksheets)属性返回一个 Excel.Sheets 集合对象, .Select 被调用的对象。这也是一个重要的细节。

您可能知道,您在 Excel 对象模型中处理的对象是 COM 对象。在 COM 中,接口是可扩展的,除非另有说明:你可以这样写:

Debug.Print Application.Sum(2, 2)

并获得输出 - 即使Sum 不是Application 类的编译时成员:成员调用在运行时解析(这就是“后期绑定”),并且因为 COM对象被扩展,具有特定选择的WorksheetFunction 成员,Application.Sum 在运行时工作得非常好,尽管你没有得到任何编译时验证:你基本上是蒙着眼睛编码,并且成员名称中的任何拼写错误都会在运行时引发错误 438(但即使指定了 Option Explicit 也会编译得很好),并且参数中的任何错误(错误的类型、错误的顺序、错误的参数数量)都会引发错误1004 在运行时。

这就是为什么您通常要避免隐式后期绑定,因此要针对 ActiveSheetSelection 进行编码:因为这些 Object 对象(对于针对 Variant 的成员调用也是如此)不定义编译时接口,使用就是蒙着眼睛写代码,很容易出错。

但早期绑定代码并不总是 100% 等效于后期绑定代码。

这是一种这样的情况:ExportAsFixedFormat 成员在早期绑定时在运行时以一种方式表现,而在后期绑定时表现不同。通过后期绑定调用,您可以导出单个 PDF 文档,其中 Sheets 集合中的每个工作表都有一个页面,而针对 Worksheet.ExportAsFixedFormat 的早期绑定调用仅导出 那个 工作表,因为没有Sheets.ExportAsFixedFormat,您不能直接针对Sheets(Array(...)) 进行后期绑定调用,以避免.Select 调用和随后的ActiveSheet 后期绑定成员调用。

还有许多其他成员,特别是 WorksheetFunction 成员,在后期绑定和早期绑定时表现不同。

【讨论】:

  • 感谢您的回答!
【解决方案2】:

这个呢?这行得通吗:

For Each w In ThisWorkbook.Sheets(Array("Sheet1", "Sheet2"))
  w.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"C:\tempo.pdf", Quality:=xlQualityStandard, IncludeDocProperties:=True, _
 IgnorePrintAreas:=False, OpenAfterPublish:=True
Next w

【讨论】:

  • 否:消息:对象不支持此属性或方法我尝试将它们组合起来,但它不起作用
  • 不,它不起作用。它保存第一个工作表,然后用 pdf 替换 pdf 文件,仅包含 sheet2 带有 select / activeSheet 的代码使 1 pdf 包含所有工作表
猜你喜欢
  • 2016-06-12
  • 2023-01-30
  • 1970-01-01
  • 2013-06-17
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多