“新”Excel.Application vs Excel.Application

我正在寻求澄清“新”对对象和剧本的影响。

我的理解是,如果我需要在Excel文档上执行操作,并且应用程序已closures,那么我应该使用New Excel.Application。

如果我保持这个应用程序处于活动状态(例如通过工作簿之类的对象),并且稍后在脚本中我决定打开另一个工作簿,那么我仍然应该使用New Excel.Application还是使用Excel.Application?

我的担心在于我要写一个长的脚本,至less在5个工作簿上执行操作。 我将不得不从一个工作簿切换到另一个,然后回到前…

如果每次脚本创build一个新的Excel.Application,我可能最终会有相当多的人在运行,我担心这个混乱会产生问题。

写下这样的东西比较合适吗?

Dim NxlApp as New Excel.Application Dim xlApp as Excel.Application NxlApp.Workbooks.Open "C:\Users\...\WorkbookA.xlsx" NxlApp.Visible = True 'Perform actions on WorkbookA (keep it open) Set ExcelApp = GetObject("", "Excel.Application.14") xlApp.Workbooks.Open "C:\Users\...\WorkbookB.xlsx" xlApp.Visible = True 'Perform actions on WorkbookB (keep it open) 'Go back to WorkbookA (using the xlApp variable this time) xlApp.Workbook("A.xlsx")... 

Excel应用程序可以同时打开几个工作簿,因此您不需要实例化一个新的工作簿。 如果你在Excel里面,你不需要引用应用程序来打开工作簿。 您可能希望创build几个工作簿实例,例如

 Dim wbWorkbookA As Workbook Dim wbWorkbookB As Workbook Set wbWorkbookA = Workbooks.Open("C:\Users\...\WorkbookA.xlsx") Set wbWorkbookB = Workbooks.Open("C:\Users\...\WorkbookB.xlsx") 

这将打开工作簿并给出一个参考,以便您可以使用您的代码来操作它们。

我将写一个长的脚本,至less在5个工作簿上执行操作

好问题,简单的答案是你可以在一个Application对象中打开5个工作簿。

如果你在Excel中(另见下文),那么你已经有了一个Excel.Application。 然后,您可以将每个工作簿设置为不同的对象或通过名称引用它们:

 dim wb1, wb2 as Excel.Workbook, wb3 as New Excel.Workbook 'blank is same as Variant set wb1 = application.open("path/wb.xlsx") msgbox wb1.name 'ref by object msgbox workbooks("wb.xlsx").name 'ref by name 

我的理解是,如果我需要在Excel文档上执行操作,并且应用程序已closures,那么我应该使用New Excel.Application

如果您在Excel之外(如在Access中),那么您可能需要创build一个Excel.Application对象,这里有一些提示:

 Dim nXlApp as New Excel.Application 

具有与以下相同的效果:

 Dim xlApp as Excel.Application Set xlApp = New Excel.Application 'Early Binding Set xlApp = CreateObject(“Excel.Application”) 'Late Binding 

不要在循环中定义(暗淡),但是可以根据需要多次实例化(设置)相同的对象。 如果你在一个控件(button等)中使用一个全局对象(这是不推荐,但有时是方便的),你可以使用这样的东西:

 if xlApp is Nothing then set xlApp = CreateObject(“Excel.Application”) 

当你完成后,不要忘记打扫房子!

 wb1.Close False set wb1 = Nothing 'do this once for each defined object, anything using New/Set 

也可以看看,