excel - 执行 SAP RFC 的 VBA 程序在 Excel 2016 on-prem 中有效,但在 Office 365 中无效(运行时错误 20080008...Bad Variant Type)
问题描述
首先让我说,我在这里和这里看到了提到这个问题的其他两个线程,但它们并没有帮助我解决我的问题。
我已经在本地 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 环境中分配 SAPFunctionsOCX.SAPFunctions 对象的Connection
属性(请感觉Functions
自由纠正我的措辞......我知道这不太正确)。
请注意,我没有看到任何参考问题,也没有在任一环境中遇到任何编译错误。麻烦的第一个迹象是执行Functions.Connection = objConnection
这里还有一个转折点,那就是我有另一个较旧的 VBA 程序,它登录到 SAP 并运行不使用 SAPFunctionsOCX.SAPFunctions 的远程函数调用,而是将变量 R3 声明为Public R3 As Object
,然后稍后在登录代码中将 R3 设置为Set R3 = CreateObject("SAP.Functions")
. ..它不使用OCX。换句话说,旧例程使用后期绑定。当以这种方式设置 Functions 对象(在本例中为 R3)时,我可以在 prem 和 Office 365 环境中运行 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 7.60 版本的 SAP GUI 是 32 位(下一个 SAP GUI 版本 7.70 应该是 64 位,所以它应该可以再次工作)。
您可以通过使用DLL Surrogate来使 VBA 与 SAP GUI 32 位 DLL 一起工作,即编辑所有不兼容 SAP GUI DLL 的 Windows 注册表。最初的解决方案是在 SAP Community 中提出的。
为了简化任务,您可以创建我的 .REG 文件,执行它以自动更新 Windows 注册表,然后您的 VBA 宏应该可以工作。
我在这里复制我的 .REG 文件:
; ====================================================================================
; SAP Logon Unicode Control %ProgramFiles(x86)%\SAP\FrontEnd\SAPgui\wdtlogU.ocx {0AAF5A11-8C04-4385-A925-0B62F6632BEC}
; ====================================================================================
[HKEY_CLASSES_ROOT\WOW6432Node\AppID\{0AAF5A11-8C04-4385-A925-0B62F6632BEC}]
"DllSurrogate"=""
[HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{0AAF5A11-8C04-4385-A925-0B62F6632BEC}]
"AppID"="{0AAF5A11-8C04-4385-A925-0B62F6632BEC}"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\{0AAF5A11-8C04-4385-A925-0B62F6632BEC}]
; ====================================================================================
; SAP Remote Function Call Unicode Control %ProgramFiles(x86)%\SAP\FrontEnd\SAPgui\wdtfuncu.ocx {0AF427E7-03B9-4673-8F21-F33A683BCE28}
; ====================================================================================
[HKEY_CLASSES_ROOT\WOW6432Node\AppID\{0AF427E7-03B9-4673-8F21-F33A683BCE28}]
"DllSurrogate"=""
[HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{0AF427E7-03B9-4673-8F21-F33A683BCE28}]
"AppID"="{0AF427E7-03B9-4673-8F21-F33A683BCE28}"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\{0AF427E7-03B9-4673-8F21-F33A683BCE28}]
; ====================================================================================
; SAP Logon Control (not Unicode) %ProgramFiles(x86)%\SAP\FrontEnd\SAPgui\wdtlog.ocx {B24944D6-1501-11CF-8981-0000E8A49FA0}
; ====================================================================================
[HKEY_CLASSES_ROOT\WOW6432Node\AppID\{B24944D6-1501-11CF-8981-0000E8A49FA0}]
"DllSurrogate"=""
[HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{B24944D6-1501-11CF-8981-0000E8A49FA0}]
"AppID"="{B24944D6-1501-11CF-8981-0000E8A49FA0}"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\{B24944D6-1501-11CF-8981-0000E8A49FA0}]
; ====================================================================================
; SAP Remote Function Call Control (not Unicode) %ProgramFiles(x86)%\SAP\FrontEnd\SAPgui\wdtfuncs.ocx {5B076C03-2F26-11CF-9AE5-0800096E19F4}
; ====================================================================================
[HKEY_CLASSES_ROOT\WOW6432Node\AppID\{5B076C03-2F26-11CF-9AE5-0800096E19F4}]
"DllSurrogate"=""
[HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{5B076C03-2F26-11CF-9AE5-0800096E19F4}]
"AppID"="{5B076C03-2F26-11CF-9AE5-0800096E19F4}"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\{5B076C03-2F26-11CF-9AE5-0800096E19F4}]
推荐阅读
- r - 如何减慢 gganimate 地图 gif 的速度?
- azure - 使用 id_token 对受广告保护的应用进行身份验证
- python - 超立方体上的简单随机游走
- java - Java(eclipse)properties.config文件设置问题之间的值
- couchbase - 如何编写查询以在沙发库中创建数据集
- android - 片段之间的共享元素过渡留下了神秘的偏移
- r - 当组件可能分散在环境中时评估调用
- pandas - 熊猫,填补缺失值
- c# - 如何使用 C# 获取多个用户名并存储在数组中?
- ionic-framework - Gatsby 构建失败并出现错误“未定义 HTMLElement”