需要将所有工作表导出到一个 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
Run Code Online (Sandbox Code Playgroud)
TL;DR:Select在这种情况下您无法避免,因为您需要 的后期绑定行为ActiveSheet.ExportAsFixedFormat,这显然考虑到了选定的工作表- 早期绑定Worksheet.ExportAsFixedFormat不会这样做。
ExportAsFixedFormat是 的成员Excel.Worksheet。
ActiveSheet不是一个Excel.Worksheet,它是一个Object(所以任何成员的反对都必然是迟到的)。这是一个重要的细节。
当你这样做时:
ThisWorkbook.Sheets(Array("Sheet1", "Sheet2")).Select
Run Code Online (Sandbox Code Playgroud)
所述.Select构件呼叫未针对由Worksheet对象:给定的片材名称的数组中,Sheets(或Worksheets)属性返回一个Excel.Sheets集合对象,并且其是什么.Select正在调用对。这也是一个重要的细节。
您可能知道,您在 Excel 对象模型中处理的对象是 COM 对象。在 COM 中,接口是可扩展的,除非另有说明:这就是你可以这样写的:
Debug.Print Application.Sum(2, 2)
Run Code Online (Sandbox Code Playgroud)
并获得输出 - 即使Sum不是类的编译时成员Application:成员调用在运行时解析(这就是“后期绑定”),并且因为 COM 对象使用特定的成员选择进行扩展WorksheetFunction,Application.Sum在运行时工作得很好,虽然你没有得到任何编译时验证:你基本上是蒙着眼睛编码,并且成员名称中的任何错字都会在运行时引发错误 438(但即使编译也很好与Option Explicit指定的),并在参数中的任何错误(错误的类型,错误的顺序,错误的参数数目),将在运行时产生错误,1004。
这就是为什么您通常希望避免隐式后期绑定,从而避免针对ActiveSheetand 进行编码Selection:因为这些Object对象(对于成员调用反对Variant)没有定义编译时接口,使用它们会蒙住眼睛编写代码,并且非常容易出错。
但是早期绑定的代码并不总是 100% 等同于后期绑定的替代方案。
这是一种这样的情况:该ExportAsFixedFormat成员在运行时早期绑定时的行为方式是一种,而后期绑定时的行为方式则不同。使用后期绑定调用,您可以导出单个 PDF 文档,其中包含Sheets集合中每个工作表的页面,而早期绑定调用Worksheet.ExportAsFixedFormat仅导出该工作表,并且由于没有Sheets.ExportAsFixedFormat,因此您无法进行后期绑定调用直接反对Sheets(Array(...))以避免.Select调用和随后的ActiveSheet后期绑定成员调用。
还有许多其他成员,特别是WorksheetFunction成员,在后期绑定和早期绑定时表现不同。
| 归档时间: |
|
| 查看次数: |
360 次 |
| 最近记录: |