如何在此示例中避免使用VBA中的选择/激活语句?

7
需要将所有工作表导出为一个PDF文件,因此我找到了这段代码,它可以工作(每张工作表都导出一个PDF)。但是我不想使用选择/活动语句,而是更喜欢使用存储对象的变量。
问题: 如何在此代码中避免使用select/ActiveSheet?
ThisWorkbook.Sheets(Array("Sheet1", "Sheet2")).Select

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

1
这个回答解决了你的问题吗?如何在Excel VBA中避免使用Select - Nacorid
4
@Nacorid 不,这个案件比那个更复杂。 - Mathieu Guindon
2个回答

10
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的成员调用也是如此)没有定义编译时接口,使用它们就像是盲目编码一样容易出错。

但是早期绑定的代码并不总是与晚期绑定的替代方案完全等效。

这是一个这样的例子:当早期绑定时,ExportAsFixedFormat成员在运行时表现一种方式,并且在晚期绑定时表现不同。使用晚期绑定调用,您可以将单个PDF文档导出为Sheets集合中每个工作表的一个页面,而针对Worksheet.ExportAsFixedFormat的早期绑定调用仅导出工作表,由于没有Sheets.ExportAsFixedFormat,因此您无法直接针对Sheets(Array(...))进行晚期绑定调用以避免.Select调用和随后的ActiveSheet晚期绑定成员调用。

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


非常感谢您的回答! - thereal_92

0

这个怎么样?这个可行吗:

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

对象不支持此属性或方法 我尝试将它们组合,但是不起作用。 - thereal_92
2
不,它不起作用。它保存第一个工作表,然后用仅包含sheet2的pdf文件替换pdf文件。 使用select / activeSheet的代码会生成包含所有工作表的1个pdf文件。 - thereal_92

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接