【问题标题】:Active X Error With Excel 2016 And Late BindingExcel 2016 和后期绑定的 Active X 错误
【发布时间】:2020-11-07 01:27:17
【问题描述】:

我的 PC 上安装了 Microsoft Office 365 Business,并尝试运行 Access VBA 来创建 Excel 对象。这是我正在使用的 Access VBA 语法

Dim xl As Object, wb As Object, ws As Object, ch As Object

Set xl = CreateObject("Excel.Application")

但是,它会点击CreateObject 行并抛出下图,但在我运行 Office 365 商业版的 PC 上。如果我在运行 Office 2010 的计算机上运行相同的语法,它会完全按照应有的方式执行并创建没有错误的 Excel 对象。

为了能够使用Microsoft Office 365 Business 运行此语法,我必须进行哪些更改?

编辑
这是我看到的唯一注册表项 - 它很接近,但与 cmets 中所述的不完全一致。

【问题讨论】:

  • 要使用Excel.Application 运行 ActiveX,需要以下注册表项:HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Excel.Application。这指向CLSID。你能检查这是否存在吗?对我来说使用Microsoft Office 365 ProPlus 确实如此,所以CreateObject("Excel.Application")works。如果它不存在,重新安装 Office 可能会有所帮助。但也许它根本没有提供Microsoft Office 365 Business?我还没有找到有关此的详细信息。也许问Microsoft
  • @AxelRichter - 查看我的编辑,我有一个类似但不完全一样的密钥。请指教。
  • 试试CreateObject("Excel.Application.16")
  • @AxelRichter - 使用“Excel.Application.16”现在可以工作,但并不理想。我正在使用后期绑定,以便在 2007 - 2016 年运行的计算机上执行语法。我有一种感觉,如果我添加 .16 会限制它到运行 Office 2016 的计算机...
  • 你说的没错,16 指向的是当前版本。因此,您缺少通用注册表项Excel.Application。您可以手动插入它并让它指向相同的CLSID。但我不知道 为什么 它不见了。您是否尝试过重新安装 Office?

标签: excel ms-access vba office365


【解决方案1】:

一种选择是在尝试调用CreateObject 之前检查CLSID 是否存在。您可以使用 ole32.dll 函数 CLSIDFromString 对其进行测试(这也被 VBA 内部用于 CreateObjectGetObject 调用):

'Note, this is the 32bit call - use PtrSafe for 64bit Office.
Private Declare Function CLSIDFromString Lib "ole32.dll" _
    (ByVal lpsz As LongPtr, ByRef pclsid As LongPtr) As Long

您可以将它包装在一个简单的“存在”测试中,如下所示:

Private Function ClassIdExists(clsid As String) As Boolean
    Dim ptr As LongPtr
    Dim ret As Long
    ret = CLSIDFromString(StrPtr(clsid), ptr)
    If ret = 0 Then ClassIdExists = True
End Function

这让您可以在尝试创建类之前测试它们(并避免使用错误处理程序来捕获错误的 CLSID):

Dim xl As Object
If ClassIdExists("Excel.Application") Then
    Set xl = CreateObject("Excel.Application")
ElseIf ClassIdExists("Excel.Application.16") Then
    Set xl = CreateObject("Excel.Application.16")
Else
    MsgBox "Can't locate Excel class."
End If

【讨论】:

  • 这不是回答问题为什么一般注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Excel.Application 不存在。如果 Office 版本支持 COM 自动化,通常应该存在 两个 注册表项。 Excel.Application 是通用的,Excel.Application.16 (Excel.Application.[nn]) 指向当前的 Office 版本。因此,尽管您的答案有效,但我认为这样做通常不是一个好习惯,因为您必须检查所有可能的版本号。
猜你喜欢
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多