Vba &引用;新";Excel.Application与Excel.Application

Vba &引用;新";Excel.Application与Excel.Application,vba,excel,instance,excel.application,Vba,Excel,Instance,Excel.application,我正在寻求澄清“新”对对象和脚本的影响 我的理解是,如果我需要对excel文档执行操作,并且应用程序关闭,那么我应该使用新的excel.application 如果我保持此应用程序处于活动状态(例如通过工作簿之类的对象),并且稍后在脚本中我决定打开另一个工作簿,我应该仍然使用新的Excel.application还是使用Excel.application更好 我担心的是,我将编写一个长脚本,在至少5本工作簿上执行操作。我将不得不从一个工作簿切换到另一个工作簿,然后返回到前一个工作簿 如果每次脚本

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

我的理解是,如果我需要对excel文档执行操作,并且应用程序关闭,那么我应该使用新的excel.application

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

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

如果每次脚本创建一个新的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内部打开,则不需要引用应用程序来打开工作簿。您可能希望创建多个工作簿实例,例如

Dim wbWorkbookA As Workbook
Dim wbWorkbookB As Workbook

Set wbWorkbookA = Workbooks.Open("C:\Users\...\WorkbookA.xlsx")
Set wbWorkbookB = Workbooks.Open("C:\Users\...\WorkbookB.xlsx")
这将打开工作簿并提供参考,以便您可以使用代码操作它们

我将写一个长脚本,在上执行操作 至少5本工作手册

好问题,简短的回答是您可以在一个应用程序对象中打开5个工作簿

如果您使用的是excel(其他请参见下文),那么您已经有了一个excel.com应用程序。然后,您可以将每个工作簿设置为不同的对象或按名称引用它们:

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上执行操作 文档和应用程序关闭后,我应该使用新的 Excel.Application

如果您在Excel之外(如Access),则可能需要创建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
不要在循环中定义(dim),但是可以根据需要多次实例化(设置)同一对象。如果您在控件(按钮等)内使用全局对象(不推荐,但有时很方便),您可以使用以下内容:

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
另见

  • (GetObject和CreateObject行为)

OP有一个很好的观点。。。我一直注意到Microsoft脚本运行时要求FileScriptingObject使用新关键字,但其他库则不需要。为什么有些需要新的,有些不需要?我需要清洁的最后一部分。谢谢