如何在不设置引用的情况下从其他Office应用程序打开Excel?

如何在不设置引用的情况下从其他Office应用程序打开Excel?,excel,vba,ms-word,Excel,Vba,Ms Word,在Word和Outlook中,我尝试使用GetObject方法打开Excel,但我需要先设置引用。我收到编译错误:未定义用户定义的类型。为了手动修复此问题,我需要转到工具>参考>Microsoft Excel XX.X对象库。有没有办法不必手动设置参考值 我从不同的会话访问相同的文件本地会话、citrix、具有不同版本Excel的VM软件 迄今为止的代码 Sub Macro1() ' Dim Excel As Object Dim wkbkXLBook As Excel.Wor

在Word和Outlook中,我尝试使用GetObject方法打开Excel,但我需要先设置引用。我收到编译错误:未定义用户定义的类型。为了手动修复此问题,我需要转到工具>参考>Microsoft Excel XX.X对象库。有没有办法不必手动设置参考值

我从不同的会话访问相同的文件本地会话、citrix、具有不同版本Excel的VM软件

迄今为止的代码

Sub Macro1()
'
    Dim Excel As Object

    Dim wkbkXLBook As Excel.Workbook
    Dim wkSheet As Excel.worksheet

    Set Excel = GetObject(, "Excel.Application")

    If Excel Is Nothing Then

        MsgBox ("Excel was not found")

    End If

    Selection.WholeStory
    Selection.WholeStory
    Selection.Copy
End Sub

如果不向类型库添加引用,则不能使用该类型库中定义的早期绑定类型

Excel是Excel类型库的编程名称,工作簿是该库中定义的类的名称。工作表也一样。由于Excel未被引用,VBA无法解析这些类型,因此会出现编译错误

您需要使用后期绑定代码,即在黑暗中工作,没有IntelliSense、自动完成或参数快速信息,并且不进行任何键入,以免遇到运行时错误438和1004

延迟绑定意味着在运行时解决。无论何时将某个对象声明为对象,都会发生这样的情况:

Dim wkbkXLBook As Object
Dim wkSheet As Object
除非引用Excel类型库,否则不能使用任何Excel类型。这也包括任何xl*常量

我强烈建议将此重命名为例如xlApp

注意隐式对象引用:

Dim someRange As Object
Set someRange = xlApp.ActiveWorkbook.Worksheets("Sheet1").Range("A1")
上述操作将起作用,但也会泄漏ActiveWorkbook对象、其工作表集合和检索到的工作表对象;这些泄漏的对象可能而且通常确实会阻止EXCEL.EXE进程正确关闭,即使在执行xlApp之后也是如此。退出并设置xlApp=Nothing:避免像这样的双点引用对象。改为这样做:

Dim books As Object
Set books = xlApp.Workbooks

Dim wb As Object
Set wb = books("workbook name")

Dim wbSheets As Object
Set wbSheets = wb.Worksheets

Dim ws As Object
Set ws = wbSheets("sheet name")

Dim rng As Object
Set rng = ws.Range("A1")

由于所涉及的每个对象都明确地限定在本地过程的范围内,所以一切都应该正常。

如果不向类型库添加引用,则不能使用该类型库中定义的早期绑定类型

Excel是Excel类型库的编程名称,工作簿是该库中定义的类的名称。工作表也一样。由于Excel未被引用,VBA无法解析这些类型,因此会出现编译错误

您需要使用后期绑定代码,即在黑暗中工作,没有IntelliSense、自动完成或参数快速信息,并且不进行任何键入,以免遇到运行时错误438和1004

延迟绑定意味着在运行时解决。无论何时将某个对象声明为对象,都会发生这样的情况:

Dim wkbkXLBook As Object
Dim wkSheet As Object
除非引用Excel类型库,否则不能使用任何Excel类型。这也包括任何xl*常量

我强烈建议将此重命名为例如xlApp

注意隐式对象引用:

Dim someRange As Object
Set someRange = xlApp.ActiveWorkbook.Worksheets("Sheet1").Range("A1")
上述操作将起作用,但也会泄漏ActiveWorkbook对象、其工作表集合和检索到的工作表对象;这些泄漏的对象可能而且通常确实会阻止EXCEL.EXE进程正确关闭,即使在执行xlApp之后也是如此。退出并设置xlApp=Nothing:避免像这样的双点引用对象。改为这样做:

Dim books As Object
Set books = xlApp.Workbooks

Dim wb As Object
Set wb = books("workbook name")

Dim wbSheets As Object
Set wbSheets = wb.Worksheets

Dim ws As Object
Set ws = wbSheets("sheet name")

Dim rng As Object
Set rng = ws.Range("A1")

由于所涉及的每个对象都显式地作用于本地过程,所以一切都应该正常。

您是否尝试了CreateObjectExcel.Application而不是GetObject?我认为您的问题来自变量声明中的Excel.xxxx。与Excel对象一样,dim As object and try???@fbueckert可以在If Excel Is Nothing分支中使用CreateObject,在现有实例不存在时创建一个新实例。您是否尝试了CreateObjectExcel.Application而不是GetObject?我想您的问题来自变量声明中的Excel.xxxx。与Excel对象一样,dim As object and try???@fbueckert CreateObject可用于If Excel Is Nothing分支,在现有实例不存在时创建新实例