TL;DR:在这种情况下,您无法避免 Select,因为您需要 ActiveSheet.ExportAsFixedFormat 的后期绑定行为,这显然考虑到了选定的工作表——早绑定Worksheet.ExportAsFixedFormat 不行。
ExportAsFixedFormat 是Excel.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 在运行时。
这就是为什么您通常要避免隐式后期绑定,因此要针对 ActiveSheet 和 Selection 进行编码:因为这些 Object 对象(对于针对 Variant 的成员调用也是如此)不定义编译时接口,使用就是蒙着眼睛写代码,很容易出错。
但早期绑定代码并不总是 100% 等效于后期绑定代码。
这是一种这样的情况:ExportAsFixedFormat 成员在早期绑定时在运行时以一种方式表现,而在后期绑定时表现不同。通过后期绑定调用,您可以导出单个 PDF 文档,其中 Sheets 集合中的每个工作表都有一个页面,而针对 Worksheet.ExportAsFixedFormat 的早期绑定调用仅导出 那个 工作表,因为没有Sheets.ExportAsFixedFormat,您不能直接针对Sheets(Array(...)) 进行后期绑定调用,以避免.Select 调用和随后的ActiveSheet 后期绑定成员调用。
还有许多其他成员,特别是 WorksheetFunction 成员,在后期绑定和早期绑定时表现不同。