执行SAP RFC的VBA程序可在Excel 2016本地部署中运行,但在Office 365中无法运行

2020-08-27 07:44发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我的公司即将迁移到Office 365。 我测试了一个程序,该程序登录到SAP并在365环境中运行RFC,并且在" Functions.Connection = objConnection"行上遇到运行时错误(运行时错误20080008…错误的变量类型)

显式选项
     作为SAPFunctions的公共函数OCX.SAPFunctions
     私人LogonControl为SAPLogonCtrl.SAPLogonControl
     私有objConnection为SAPLogonCtrl.Connection
     作为SAPFunctionsOCX.Function的公共函数
     公共提交为SAPFunctionsOCX.Function
     将公共TableFactory作为SAPTableFactory
     以布尔值公开的silentLogon
     公共tblReadTableOptions,tblReadTableFields,tblReadTableData作为SAPTableFactoryCtrl.Table
     子ExtractProjectData()
         如果objConnection什么都没有,那么LogonToSAP
         发起SAP变量
         设置Func = Functions.Add(" BBP_RFC_READ_TABLE")
         设置tblReadTableOptions = Func.Tables(" OPTIONS")
         设置tblReadTableFields = Func.Tables(" FIELDS")
         设置tblReadTableData = Func.Tables(" DATA")
         '从SAP表中提取/转换数据
     结束子
     函数InitiateSAPVariables()
         设置函数=无
         设置TableFactory = Nothing
         设置功能=无
         设置函数= CreateObject(" SAP.Functions")
         设置TableFactory = CreateObject(" SAP.TableFactory.1")
         Functions.Connection = objConnection'运行时错误在Office 365中出现,但在本地时不存在
     结束功能
     函数LogonToSAP()
         昏暗建立连接为布尔
         silenceLogon =否
         设置LogonControl = CreateObject(" SAP.LogonControl.1")
         设置objConnection = LogonControl.NewConnection
         objConnection.Client =" ###"
         objConnection.Language =" EN"
         objConnection.SystemNumber =" ##"
         objConnection.User =""
         objConnection.Password =""
         objConnection.HostName =" ###############"
         objConnection.System =" ###"
         objConnection.ApplicationServer =" ###。###。#。##"
         建立连接= objConnection.Logon(0,silentLogon)
     结束功能

快速检查objConnection会告诉我登录已成功...因此我知道该部件正在365上工作。但是由于某些原因,它不喜欢分配Functions SAPFunctionsOCX的Connection属性。 SAPFunctions对象在365环境中(请随时纠正我的说法,我知道这不太正确)。

请注意,在这两种环境下,我都没有看到任何参考问题,也没有遇到任何编译错误。 麻烦的第一个迹象是在执行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。

功能LogonProdSAP(可选SuppressLoginScreen为布尔值)
         Application.ScreenUpdating = False
         '**************************************************
         '创建服务器对象并设置DEV的连接
         '**************************************************
         设置R3 = CreateObject(" SAP.Functions")
         如果SuppressLoginScreen然后
             R3.Connection.System =" ###"
             R3.Connection.HostName =" ####################"
             R3.Connection.SystemNumber =" ##"
             R3.Connection.Client =" ###"
             R3.Connection.User =" ##########"
             R3.Connection.Password =" #########"
             R3.Connection.Language =" EN"
     '通话记录器(" LogonProdSAP>"&GetUserName)
         万一
         LogonProdSAP = R3.Connection.logon(0,SuppressLoginScreen)
         如果LogonProdSAP <> True,则MsgBox("登录错误"):退出功能
     结束功能

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

 我必须怎么做才能使早期绑定技术在Office 365上运行?

 这个问题也发布在堆栈溢出... https://stackoverflow.com/questions/58942674 

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我的公司即将迁移到Office 365。 我测试了一个程序,该程序登录到SAP并在365环境中运行RFC,并且在" Functions.Connection = objConnection"行上遇到运行时错误(运行时错误20080008…错误的变量类型)

显式选项
     作为SAPFunctions的公共函数OCX.SAPFunctions
     私人LogonControl为SAPLogonCtrl.SAPLogonControl
     私有objConnection为SAPLogonCtrl.Connection
     作为SAPFunctionsOCX.Function的公共函数
     公共提交为SAPFunctionsOCX.Function
     将公共TableFactory作为SAPTableFactory
     以布尔值公开的silentLogon
     公共tblReadTableOptions,tblReadTableFields,tblReadTableData作为SAPTableFactoryCtrl.Table
     子ExtractProjectData()
         如果objConnection什么都没有,那么LogonToSAP
         发起SAP变量
         设置Func = Functions.Add(" BBP_RFC_READ_TABLE")
         设置tblReadTableOptions = Func.Tables(" OPTIONS")
         设置tblReadTableFields = Func.Tables(" FIELDS")
         设置tblReadTableData = Func.Tables(" DATA")
         '从SAP表中提取/转换数据
     结束子
     函数InitiateSAPVariables()
         设置函数=无
         设置TableFactory = Nothing
         设置功能=无
         设置函数= CreateObject(" SAP.Functions")
         设置TableFactory = CreateObject(" SAP.TableFactory.1")
         Functions.Connection = objConnection'运行时错误在Office 365中出现,但在本地时不存在
     结束功能
     函数LogonToSAP()
         昏暗建立连接为布尔
         silenceLogon =否
         设置LogonControl = CreateObject(" SAP.LogonControl.1")
         设置objConnection = LogonControl.NewConnection
         objConnection.Client =" ###"
         objConnection.Language =" EN"
         objConnection.SystemNumber =" ##"
         objConnection.User =""
         objConnection.Password =""
         objConnection.HostName =" ###############"
         objConnection.System =" ###"
         objConnection.ApplicationServer =" ###。###。#。##"
         建立连接= objConnection.Logon(0,silentLogon)
     结束功能

快速检查objConnection会告诉我登录已成功...因此我知道该部件正在365上工作。但是由于某些原因,它不喜欢分配Functions SAPFunctionsOCX的Connection属性。 SAPFunctions对象在365环境中(请随时纠正我的说法,我知道这不太正确)。

请注意,在这两种环境下,我都没有看到任何参考问题,也没有遇到任何编译错误。 麻烦的第一个迹象是在执行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。

功能LogonProdSAP(可选SuppressLoginScreen为布尔值)
         Application.ScreenUpdating = False
         '**************************************************
         '创建服务器对象并设置DEV的连接
         '**************************************************
         设置R3 = CreateObject(" SAP.Functions")
         如果SuppressLoginScreen然后
             R3.Connection.System =" ###"
             R3.Connection.HostName =" ####################"
             R3.Connection.SystemNumber =" ##"
             R3.Connection.Client =" ###"
             R3.Connection.User =" ##########"
             R3.Connection.Password =" #########"
             R3.Connection.Language =" EN"
     '通话记录器(" LogonProdSAP>"&GetUserName)
         万一
         LogonProdSAP = R3.Connection.logon(0,SuppressLoginScreen)
         如果LogonProdSAP <> True,则MsgBox("登录错误"):退出功能
     结束功能

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

 我必须怎么做才能使早期绑定技术在Office 365上运行?

 这个问题也发布在堆栈溢出... https://stackoverflow.com/questions/58942674 
付费偷看设置
发送
5条回答
ZJXianG
1楼-- · 2020-08-27 08:41

迈克尔你好,

很遗憾,我不能为您解决问题,但是我对通过Excel VBA执行SAP RFC的想法很感兴趣。 是否允许在后台读取SAP表数据并将其导出到Excel?

谢谢

最好的问候

Michal Kaczmarczyk

四川大学会员
2楼-- · 2020-08-27 08:36

脚本人您好Stefan and Script 伙计...请原谅入侵。 我正在尝试在我的帖子上创建一些点击量,以便可以解决此问题。 目前,关于此主题的讨论还不多,但我想随着越来越多的人转用Office 365,它将开始成为一个大问题。感谢您提供的任何帮助。

蓋茨
3楼-- · 2020-08-27 08:45

脚本人 ...越来越多的证据表明这是 一个小问题。 使用上述方法的早期绑定在Office 2016 ProPlus 32位(MSI安装)中有效,但在Office 365 ProPlus 64位(C2R安装)中无效。 我还拥有64位Office 2016 ProPlus的MSI安装副本,但我无法对此进行测试,因为IT部门需要对注册表进行一些调整以启用ActiveX对象,以便我可以登录到SAP服务器 (这是一个完全不同的故事)。 我的猜测是,一旦登录成功,Functions对象的早期绑定也会在该系统上引起严重的变量类型错误。

如果有人使用Excel VBA的64位副本尽早成功绑定了Function对象,请告诉我们您的操作方式。

如果有人知道解决VBA中的错误变体类型错误的变通方法(即知道如何防止VBA尝试多线程的人,这不是设计目的),请共享您的方法

鉴于VBA在这方面的局限性,大多数人已经放弃使用VBA,但是这里有许多公司仍每天使用VBA与SAP集成。 对于大多数这些公司而言,迁移到新的(非VBA)解决方案将花费很多时间和精力,因此,我认为对于SAP来说,让许多公司过渡到Office时如何保持其VBA/SAP流程正常运行非常重要。 365或Office 2019(两者均默认为64位安装)。 此外,对Office 2016的支持将于2020年10月结束,这意味着大多数公司别无选择,只能转移到365/2019。 我敢肯定,这些公司在决定继续使用64位之后,会发现使用VBA与SAP集成的过程不再正常工作,这会让他们感到意外。

土豆飞人
4楼-- · 2020-08-27 08:29
# p#

您好迈克尔,

我不知道Office 365,但我认为您给出了正确的答案,无法像我描述的那样将x64版本的Office与ActiveX控件一起使用 在这里

请原谅,但如果我没记错的话,SAP多年来告诉我们说ActiveX控件仅出于兼容的原因而已,而不用于进一步的开发和生产。 此处来自< a hraf=" https://people.sap.com/frank.krause">弗兰克·克劳斯。 再次原谅我,但您忽略了这一点。 经过多年的公告,您很惊讶。 我不明白。

我的发言:我希望SAP尽快删除这些库,它们只会造成痛苦。

最诚挚的问候
Stefan

# p #
打个大熊猫
5楼-- · 2020-08-27 08:40

是。 我为此使用BBP_RFC_READ_TABLE。 您可能已经知道,您需要更改角色才能测试/运行此BAPI和其他BAPI,这些BAPI在后台运行所有内容(无需GUI脚本)。 您可以通过遍历BAPI生成的结果表中的数据来填充Excel工作表。 学习曲线不太陡,但是确实需要一些时间来适应。 在VB编辑器中,您的"立即"和"本地"窗口将非常方便地确定数据的存放位置。

该视频应该可以帮助您开始从VBA运行BAPI。 它不演示表数据提取,但原理相同。

https://www.youtube.com/watch?v= QTq7TBTlV-A&lc = z22wdngpmrfjxjew204t1aokgzvpvnmyiegpaoekfyckbk0h00410.1572392352499756

一周热门 更多>