2016-12-31 3 views
1

У меня есть Microsoft Office 365 Business, установленный на моем ПК, и я пытаюсь запустить Access VBA для создания объекта Excel. Это мой Access VBA синтаксис Я используюОшибка Active X с Excel 2016 и поздняя привязка

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

Set xl = CreateObject("Excel.Application") 

Однако она попадает в CreateObject линии и бросает изображение ниже, но ТОЛЬКО на моем компьютере работает Office 365 Business. Если я запустил такой же синтаксис на компьютере, на котором работает Office 2010, он выполняется точно так, как должен, и создает ошибку объекта Excel без ошибок.

Что я должен изменить, чтобы иметь возможность запускать этот синтаксис с помощью Microsoft Office 365 Business?

Error Message

EDIT
Это единственный ключ реестра, который я вижу - это близко, но не совсем то, что было сказано в комментариях.
Registry Key

+1

Чтобы активировать ActiveX с помощью 'Excel.Application', необходима следующая запись реестра:' HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ Excel.Application'. Это указывает на 'CLSID'. Можете ли вы проверить, существует ли это? Для меня с помощью 'Microsoft Office 365 ProPlus' он работает, поэтому работает' CreateObject («Excel.Application»). Если он не существует, вам может понадобиться переустановка Office. Но, возможно, это просто не предоставляется «Microsoft Office 365 Business»? Я не нашел подробных сведений об этом. Может быть, попросите «Microsoft»? –

+0

@AxelRichter - см. Мое редактирование, у меня есть ключ, похожий, но не совсем. Пожалуйста, порекомендуйте. –

+0

Попробуйте 'CreateObject (« Excel.Application.16 »)'. –

ответ

0

Одним из вариантов было бы проверить, если CLSID существует, прежде чем пытаться вызвать CreateObject. Вы можете использовать функцию OLE32.dll CLSIDFromString, чтобы проверить его (это также используется VBA для внутренних CreateObject и GetObject вызовов):

'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 
+0

Это не вопрос ** почему ** общая запись в реестре 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ Excel.Application' не существует. Обычно ** обе записи реестра должны существовать, если версия Office поддерживает автоматизацию «COM». 'Excel.Application' является общим, а' Excel.Application.16' ('Excel.Application. [Nn]') указывает на текущую версию Office. Поэтому, хотя ваш ответ работает, я не думаю, что это будет хорошей практикой в ​​целом, так как вам нужно будет проверить все возможные номера версий. –