VBA调用 SAP RFC

最近接手到一个任务,用excel VBA 编写一个查询报表给业务部门使用,最后使用的方案是使用VBA调用 SAP RFC 来输出报表。对于VBA 和SAP ABAP我都属于新手,接到任务也是头皮发麻,最终在查阅大量资料后在昨天全部完成。

环境准备

在环境准备部分就有一个大坑,vba创建sap.functions、sap.logoncontrol对象时使用的是sap gui目录下的wdtfuncs.ocx、wdtlog文件,而这些文件是32位的,如果使用64位的excel则访问不到此文件,会报错429“不能创建对象”,最后的解决方案,换32位的excel…(巨坑),在网上看到一个博主也提到了这个问题,留言询问有没有别的解决方法后,他给的回复是使用和excel位数一致的.ocx文件是不是就可以了?但我也没找到有64位的.ocx文件,不知道广大网友能不能解决这个问题。

在菜单栏 【工具】——【引用】添加上述控件后就完成环境准备部分。

代码编写

新建模块,编写代码:

Option Explicit

Dim sapLongonControl As SAPLogonCtrl.SAPLogonControl

Dim sapConnection As SAPLogonCtrl.Connection

Public Sub Logon()

    Set sapLongonControl = CreateObject("SAP.LogonControl.1")

    Set sapConnection = sapLongonControl.NewConnection

    With sapConnection

    '    .System = "ED1"                    '系统标识

    '    .ApplicationServer = "100.100.190.210"    '应用服务器

        .SAPRouter = "/H/61.155.85.163/H/" '外网连接的SAP路由

        .SystemNumber = "00"            '实例编号

        .Client = "600"                       '客户端

        .User = "****"                '用户名

        .Password = "****"    '密码

        .CodePage = "8400"       '解决中文乱码问题

    End With

    Call sapConnection.Logon(0, True) ' hWnd, Silent Logon   '此处如果括号里是False则会跳出登陆窗口,True则不跳登陆窗口直接登陆

    If sapConnection.IsConnected = tloRfcConnected Then

'        MsgBox "OK"

    Else

        MsgBox "Error code:" & sapConnection.IsConnected

    End If

End Sub

Public Sub Logoff()

    If sapConnection.IsConnected = tloRfcConnected Then

        sapConnection.Logoff

    End If

End Sub

RFC部分

在RFC部分使用的Tbale参数作为输出参数传到VBA,查询条件作为输入参数。RFC的创建及代码部分不做详细介绍,思路是将要查询的数据创建结构作为输出表,在代码编写部分主要就是SQL的编写及数据的整合。

注:RFC 的输出参数在VBA里是输入参数,输入参数在VBA里是输出参数。在使用Table接受数据时,需要使用到tableFactory控件。控件为wdtaocx.ocx,Windows 7下默认的路为: C:\Program Files (x86)\SAP\FrontEnd\SAPgui。

VBA代码部分

Private Sub GetData()

    Dim functions As SAPFunctionsOCX.SAPFunctions

    Dim fm As SAPFunctionsOCX.Function

    Dim cocdDetail As SAPTableFactoryCtrl.Table

    Set functions = New SAPFunctions

    Set functions.Connection = sapConnection

    ' FM加入Functions集合

    Set fm = functions.Add("RFC函数名")

   '填充参数,RFC的输入参数对VBA来说是输出参数

    fm.Exports("SPART_IN").Value = ***

    '调用

    fm.Call

    '得到Table参数

    Set cocdDetail = fm.Tables("ITAB_OUT")

    Call WriteTable(cocdDetail, Sheet2)       '输出结果,此处cocdDetail是一个二维表,所以时候遍历的方式取得表数据。为了更具一般性,编写一个通用的routine,将表输出到excel。

End Sub


Public Sub WriteTable(itab As SAPTableFactoryCtrl.Table, sht As Worksheet)

    Dim col As Long          ' column index

    Dim row As Long          ' row index    Dim headerRange As Variant  '在Excel中根据itab的header大小,类型为Variant数组

    Dim itemsRange As Variant  '在Excel中根据itab的行数和列数,类型为Variant数组

    If itab.RowCount = 0 Then Exit Sub

    '-------------------------------------------------

    ' 取消Excel的屏幕刷新和计算功能以加快速度

    '-------------------------------------------------

    Application.ScreenUpdating = False

    Application.Calculation = xlCalculationManual

    ' 清除cells的内容

    sht.Cells.ClearContents

    '------------------------------

    ' 将Table的Header写入Worksheet

    '------------------------------

    ' 根据内表的列数,使用Range创建一个数组

    Dim headerstarts As Range

    Dim headerends As Range

    Set headerstarts = sht.Cells(1, 1)

    Set headerends = sht.Cells(1, itab.ColumnCount)

    headerRange = sht.Range(headerstarts, headerends).Value

    ' 将内表列名写入数组

    For col = 1 To itab.ColumnCount

        headerRange(1, col) = itab.Columns(col).Name

    Next

    ' 从数组一次性写入Excel,这样效率较高

    sht.Range(headerstarts, headerends).Value = headerRange

    '-------------------------------

    ' 将Table的行项目写入Worksheet

    '-------------------------------

    ' 根据内表的大小,使用Range创建数组

    Dim itemStarts As Range

    Dim itemEnds As Range

    Set itemStarts = sht.Cells(2, 1)

    Set itemEnds = sht.Cells(itab.RowCount + 1, itab.ColumnCount)

    itemsRange = itab.Data

    ' 一次性将数组写入Worksheet

    sht.Range(itemStarts, itemEnds).Value = itemsRange

    '---------------------------------

    ' 恢复Excel的屏幕刷新和计算

    '---------------------------------

    Application.ScreenUpdating = True    Application.Calculation = xlCalculationAutomaticEnd Sub

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容

  • 本例为设置密码窗口 (1) If Application.InputBox(“请输入密码:”) = 1234 Th...
    浮浮尘尘阅读 13,629评论 1 20
  • 1.1 VBA是什么 直到90年代早期,使应用程序自动化还是充满挑战性的领域.对每个需要自动化的应用程序,人们不得...
    浮浮尘尘阅读 21,726评论 6 49
  • 看看下面的Excel界面截图,“排序”和“筛选”往往在一起,这大概是很多数据需要先排序后筛选吧! 在Excel 2...
    完美Excel阅读 28,621评论 1 5
  • VBA订制工具栏 http://club.excelhome.net/thread-1047254-1-1.htm...
    大海一滴写字的地方阅读 2,242评论 0 0
  • 相传在大漠中有一座城,城里有一间客栈,它踏风而来,应月而去。它不是海市,不是蜃楼,它的名字,唤作思归。 这...
    绿姑子阅读 481评论 2 5