执行SAP RFC的VBA程序可以在Excel 2016中运行,但不能在Office 365中运行(运行时错误20080



首先让我说,我看到了另外两个线程在这里和这里提到了这个问题,但它们并没有帮助我解决问题。

我已经在prem Excel 2016环境(32位(中测试了一个程序好几个星期了,没有任何问题。我的公司即将迁移到Office 365,所以我决定也在那里进行测试。在那个系统上,我在Functions.Connection = objConnection线上收到一个运行时错误

Option Explicit
Public Functions As SAPFunctionsOCX.SAPFunctions
Private LogonControl As SAPLogonCtrl.SAPLogonControl
Private objConnection As SAPLogonCtrl.Connection
Public Func As SAPFunctionsOCX.Function
Public Commit As SAPFunctionsOCX.Function
Public TableFactory As SAPTableFactory
Public silentLogon As Boolean
Public tblReadTableOptions, tblReadTableFields, tblReadTableData As SAPTableFactoryCtrl.Table
Sub ExtractProjectData()
If objConnection Is Nothing Then LogonToSAP
InitiateSAPVariables
Set Func = Functions.Add("BBP_RFC_READ_TABLE")
Set tblReadTableOptions = Func.Tables("OPTIONS")
Set tblReadTableFields = Func.Tables("FIELDS")
Set tblReadTableData = Func.Tables("DATA")
'extract/transform data from SAP tables
End Sub
Function InitiateSAPVariables()
Set Functions = Nothing
Set TableFactory = Nothing
Set Func = Nothing
Set Functions = CreateObject("SAP.Functions")
Set TableFactory = CreateObject("SAP.TableFactory.1")
Functions.Connection = objConnection 'run-time error here in Office 365 but not in on-prem
End Function
Function LogonToSAP()
Dim establishConnection As Boolean
silentLogon = false
Set LogonControl = CreateObject("SAP.LogonControl.1")
Set objConnection = LogonControl.NewConnection
objConnection.Client = "###"
objConnection.Language = "EN"
objConnection.SystemNumber = "##"
objConnection.User = ""
objConnection.Password = ""
objConnection.HostName = "###############"
objConnection.System = "###"
objConnection.ApplicationServer = "###.###.#.##"
establishConnection = objConnection.Logon(0, silentLogon)
End Function

快速检查objConnection告诉我登录成功。。。所以我知道这个部分正在365上工作。不过,出于某种原因,它不喜欢在365环境中分配FunctionsSAPFunctionsOCX.SAPFunctions对象的Connection属性(请随时更正我的措辞……我知道这不太正确(。

请注意,在这两种环境中,我都没有看到任何引用问题,也没有出现任何编译错误。故障的第一个迹象是执行Functions.Connection = objConnection

这里还有一个转折点,那就是我有另一个旧的VBA程序,它登录到SAP并运行远程函数调用,该调用不使用SAPFunctionsCX.SAPFunctions,而是将变量R3声明为Public R3 As Object,然后在登录代码中稍后将R3设置为Set R3 = CreateObject("SAP.Functions")。。。它不使用OCX。换句话说,旧的例程使用后期绑定。当函数对象(本例中为R3(以这种方式设置时,我能够在on-prem和Office365环境中运行RFC。

Function LogonProdSAP(Optional SuppressLoginScreen As Boolean)
Application.ScreenUpdating = False
'**********************************************
'Create Server object and Setup the connection for DEV
'**********************************************
Set R3 = CreateObject("SAP.Functions")
If SuppressLoginScreen Then
R3.Connection.System = "###"
R3.Connection.HostName = "###################"
R3.Connection.SystemNumber = "##"
R3.Connection.Client = "###"
R3.Connection.User = "##########"
R3.Connection.Password = "#########"
R3.Connection.Language = "EN"
'        Call Logger("LogonProdSAP>  " & GetUserName)
End If
LogonProdSAP = R3.Connection.logon(0, SuppressLoginScreen)
If LogonProdSAP <> True Then MsgBox ("Logon error"): Exit Function
End Function

我可以回到这种方式,但我不想重新配置我刚刚设置的所有代码。此外,我更喜欢尽早绑定,这样Intellitype就可以显示该对象可用的所有属性/方法。我相信还有其他好处。

我必须做些什么才能让早期绑定技术在Office 365上工作?

这是因为您的Office是64位版本,而适用于Windows的SAP GUI在7.60版本之前是32位版本(下一个SAP GUI版本7.70应该是64位,所以它应该可以再次工作(。

您有一个变通方法,通过使用DLL代理,即编辑所有不兼容的SAP GUI DLL的Windows注册表,使VBA与SAP GUI 32位DLL一起工作。最初的解决方案是在SAP社区提出的。

为了简化任务,您可以创建我的.REG文件,执行它以自动更新Windows注册表,然后VBA宏就可以工作了。

我在这里复制我的.REG文件:

; ====================================================================================
; SAP Logon Unicode Control %ProgramFiles(x86)%SAPFrontEndSAPguiwdtlogU.ocx {0AAF5A11-8C04-4385-A925-0B62F6632BEC}
; ====================================================================================
[HKEY_CLASSES_ROOTWOW6432NodeAppID{0AAF5A11-8C04-4385-A925-0B62F6632BEC}]
"DllSurrogate"=""
[HKEY_CLASSES_ROOTWOW6432NodeCLSID{0AAF5A11-8C04-4385-A925-0B62F6632BEC}]
"AppID"="{0AAF5A11-8C04-4385-A925-0B62F6632BEC}"
[HKEY_LOCAL_MACHINESOFTWAREClassesAppID{0AAF5A11-8C04-4385-A925-0B62F6632BEC}]
; ====================================================================================
; SAP Remote Function Call Unicode Control %ProgramFiles(x86)%SAPFrontEndSAPguiwdtfuncu.ocx {0AF427E7-03B9-4673-8F21-F33A683BCE28}
; ====================================================================================
[HKEY_CLASSES_ROOTWOW6432NodeAppID{0AF427E7-03B9-4673-8F21-F33A683BCE28}]
"DllSurrogate"=""
[HKEY_CLASSES_ROOTWOW6432NodeCLSID{0AF427E7-03B9-4673-8F21-F33A683BCE28}]
"AppID"="{0AF427E7-03B9-4673-8F21-F33A683BCE28}"
[HKEY_LOCAL_MACHINESOFTWAREClassesAppID{0AF427E7-03B9-4673-8F21-F33A683BCE28}]
; ====================================================================================
; SAP Logon Control (not Unicode) %ProgramFiles(x86)%SAPFrontEndSAPguiwdtlog.ocx {B24944D6-1501-11CF-8981-0000E8A49FA0}
; ====================================================================================
[HKEY_CLASSES_ROOTWOW6432NodeAppID{B24944D6-1501-11CF-8981-0000E8A49FA0}]
"DllSurrogate"=""
[HKEY_CLASSES_ROOTWOW6432NodeCLSID{B24944D6-1501-11CF-8981-0000E8A49FA0}]
"AppID"="{B24944D6-1501-11CF-8981-0000E8A49FA0}"
[HKEY_LOCAL_MACHINESOFTWAREClassesAppID{B24944D6-1501-11CF-8981-0000E8A49FA0}]
; ====================================================================================
; SAP Remote Function Call Control (not Unicode) %ProgramFiles(x86)%SAPFrontEndSAPguiwdtfuncs.ocx {5B076C03-2F26-11CF-9AE5-0800096E19F4}
; ====================================================================================
[HKEY_CLASSES_ROOTWOW6432NodeAppID{5B076C03-2F26-11CF-9AE5-0800096E19F4}]
"DllSurrogate"=""
[HKEY_CLASSES_ROOTWOW6432NodeCLSID{5B076C03-2F26-11CF-9AE5-0800096E19F4}]
"AppID"="{5B076C03-2F26-11CF-9AE5-0800096E19F4}"
[HKEY_LOCAL_MACHINESOFTWAREClassesAppID{5B076C03-2F26-11CF-9AE5-0800096E19F4}]

相关内容

最新更新