TL;DR:你无法避免Select
在这种情况下,因为您需要后期绑定行为ActiveSheet.ExportAsFixedFormat
,这显然考虑到了选定的床单——早期绑定的Worksheet.ExportAsFixedFormat
不行。
ExportAsFixedFormat
是的成员Excel.Worksheet
.
ActiveSheet
不是一个Excel.Worksheet
不过,这是一个Object
(因此任何成员反对的要求都必然是后期绑定的)。这是一个重要的细节。
当你这样做时:
ThisWorkbook.Sheets(Array("Sheet1", "Sheet2")).Select
The .Select
成员呼叫不是针对Worksheet
对象:给定一个工作表名称数组,Sheets
(or Worksheets
) 属性返回一个Excel.Sheets
集合对象,以及that是什么.Select
正在被援引反对。这也是一个重要的细节。
您可能知道,您在 Excel 对象模型中处理的对象是 COM 对象。在 COM 中,接口是可扩展的,除非另有说明:这就是你可以这样写:
Debug.Print Application.Sum(2, 2)
并得到一个输出 - 即使Sum
不是编译时成员Application
类:成员调用在运行时解析(这就是“后期绑定”),并且因为 COM 对象是extended与特定的选择WorksheetFunction
会员,Application.Sum
在运行时工作得很好,尽管你没有得到任何编译时验证:你基本上是蒙着眼睛编码,并且成员名称中的任何拼写错误都会在运行时引发错误 438 (但即使使用Option Explicit
指定),并且参数中的任何错误(错误的类型、错误的顺序、错误的参数数量)都会在运行时引发错误 1004。
That's为什么你通常希望避免隐式后期绑定,因此编码ActiveSheet
and Selection
: 因为这些Object
对象(对于成员调用相同Variant
)没有定义编译时接口,使用它们就是蒙着眼睛编写代码,而且非常容易出错。
但早期绑定代码并不总是 100% 等同于晚期绑定替代方案。
这是一个这样的案例:ExportAsFixedFormat
当早期绑定时,成员在运行时的行为方式是一种,而当后期绑定时,成员的行为方式不同。通过后期绑定调用,您可以导出单个 PDF 文档,其中包含每个工作表的页面Sheets
集合,而早期绑定的调用Worksheet.ExportAsFixedFormat
只出口that工作表,并且由于没有Sheets.ExportAsFixedFormat
,你不能直接进行后期绑定调用Sheets(Array(...))
以避免.Select
调用和后续ActiveSheet
后期绑定会员呼叫。
还有许多其他成员,特别是WorksheetFunction
成员,在晚绑定和早绑定时表现不同。