【问题标题】:SAP Extract into EXCEL via VBA out of memorySAP通过VBA提取到EXCEL内存不足
【发布时间】:2019-10-10 09:36:53
【问题描述】:

我正在尝试通过我记录的 SAP 脚本将 SAP 事务提取到 .txt 文档中,然后最终将其提取到我的 Excel 工作表中。

当我在 SAP 中运行脚本时,它会将值复制到我的 .txt 文档中。所以看起来我的问题是我在 excel 中的宏没有激活我的 SAP 脚本。

当我运行我的 VBA 宏来做同样的事情时,它说

“运行时错误'7':内存不足

并且不会将任何内容复制到我的 .txt 文档中。

希望有人能告诉我为什么?

Public SapGuiAuto, WScript, msgcol
Public objGui  As GuiApplication
Public objConn As GuiConnection
Public objSess As GuiSession
Public objSBar As GuiStatusbar
Public objSheet As Worksheet
Dim W_System
Const fpath = "S:\Supply\WChristian\SAP GUI"
Const ffilename = "script2.txt"


Sub OpenCSVFile()
'
' Load the CSV extract
'

    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;S:\Supply\WChristian\SAP GUI\script2.txt", Destination:=Range( _
        "$A$4:$I$24"))
        .Name = "mb52"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 437
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileOtherDelimiter = "|"
        .TextFileColumnDataTypes = Array(9, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False

    End With
End Sub

Sub DeleteAll()
'
' DeleteAll Macro

    On Error Resume Next
    Cells.Select
    Selection.QueryTable.Delete
    Selection.ClearContents
    Range("A1").Select
End Sub

Function Attach_Session() As Boolean
Dim il, it
Dim W_conn, W_Sess

If W_System = "" Then
   Attach_Session = False
   Exit Function
End If

If Not objSess Is Nothing Then
    If objSess.Info.SystemName & objSess.Info.Client = W_System Then
        Attach_Session = True
        Exit Function
    End If
End If

If objGui Is Nothing Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set objGui = SapGuiAuto.GetScriptingEngine
End If

For il = 0 To objGui.Children.Count - 1
    Set W_conn = objGui.Children(il + 0)
    For it = 0 To W_conn.Children.Count - 1
        Set W_Sess = W_conn.Children(it + 0)
        If W_Sess.Info.SystemName & W_Sess.Info.Client = W_System Then
            Set objConn = objGui.Children(il + 0)
            Set objSess = objConn.Children(it + 0)
            Exit For
        End If
    Next
Next

If objSess Is Nothing Then
   MsgBox "No active session to system " + W_System + ", or scripting is not enabled.", vbCritical + vbOKOnly
   Attach_Session = False
   Exit Function
End If

If IsObject(WScript) Then
   WScript.ConnectObject objSess, "on"
   WScript.ConnectObject objGui, "on"
End If

Set objSBar = objSess.findById("wnd[0]/sbar")
objSess.findById("wnd[0]").maximize
Attach_Session = True

End Function

Public Sub RunGUIScript()

Dim W_Ret As Boolean

' Connect to SAP
W_Ret = Attach_Session
If Not W_Ret Then
    Exit Sub
End If

On Error GoTo myerr

ojbSess.findById("wnd[0]").ResizeWorkingPane 174, 29, False
ojbSess.findById("wnd[0]/tbar[0]/okcd").Text = "mb52"
ojbSess.findById("wnd[0]").sendVKey 0
ojbSess.findById("wnd[0]/usr/ctxtWERKS-LOW").Text = "DO"
ojbSess.findById("wnd[0]/usr/ctxtLGORT-LOW").Text = "01"
ojbSess.findById("wnd[0]/usr/ctxtMATKLA-LOW").Text = "2"
ojbSess.findById("wnd[0]/usr/ctxtMATKLA-LOW").SetFocus
ojbSess.findById("wnd[0]/usr/ctxtMATKLA-LOW").caretPosition = 3
ojbSess.findById("wnd[0]").sendVKey 8
ojbSess.findById("wnd[0]/tbar[1]/btn[45]").press
ojbSess.findById("wnd[1]/tbar[0]/btn[0]").press
ojbSess.findById("wnd[1]/usr/ctxtDY_PATH").Text = "S:\Supply\WChristian\SAP GUI\"
ojbSess.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = "script2.txt"
ojbSess.findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 11
ojbSess.findById("wnd[1]/tbar[0]/btn[11]").press

Exit Sub

myerr:
   MsgBox "Error occured while retrieving data", vbCritical + vbOKOnly

End Sub

Sub StartExtract()
    ' Set the sid and client to connect to
    W_System = "DCG210"
    ' Run the GUI script
    RunGUIScript
    ' End the GUI session
    ' Switch to the worksheet where the data is loaded to
    Sheets("Extract").Select
    ' Delete the entire sheet before loading the file
    DeleteAll
    ' Load the CSV file
    OpenCSVFile

    ' Update the time and date on the control worksheet
    Sheets("Control").Select
    Cells(2, 2).Value = Now()

End Sub

【问题讨论】:

  • 前段时间我在 SAP 连接上苦苦挣扎,我没有太多时间深入研究您的代码,但如果没有人发布答案,我可以将我的方法与您的代码混合发布(我不是使用SapGuiAuto.GetScriptingEngine)
  • 您能解释一下“在 SAP 中运行脚本”是什么意思吗? (VBA 脚本?那么“在 SAP 中”是什么意思?)
  • @SandraRossi 抱歉,我的意思是当我在 SAP 中运行我的 SAP 脚本时,它可以很好地将数据提取到文档中。所以我的意思是,当我的代码需要激活我的 SAP 脚本时,它似乎做错了。
  • 我还是不明白。但是让我们忘记您提到但不提供代码的“SAP脚本”(您不应该发布它,因为它可能是转换错误吗?)。在您的 VBA 宏(我称为“VBA 脚本”)中,您能否通过使用调试器告诉我们它在哪个子例程中失败。注意:很难提供帮助,因为one can't reproduce your case.

标签: excel vba sap-gui


【解决方案1】:

正如我向@Christian 承诺的那样,我将在此处粘贴我与 SAP 连接的方法。它一直在工作。我基于我所有的宏来获取来自 SAP 的大量报告 :)

Sub SapConn()

Dim Appl As Object
Dim Connection As Object
Dim session As Object
Dim WshShell As Object
Dim SapGui As Object

'Of course change for your file directory
Shell "C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe", 4
Set WshShell = CreateObject("WScript.Shell")

Do Until WshShell.AppActivate("SAP Logon ")
    Application.Wait Now + TimeValue("0:00:01")
Loop

Set WshShell = Nothing

Set SapGui = GetObject("SAPGUI")
Set Appl = SapGui.GetScriptingEngine
Set Connection = Appl.Openconnection("01. PRD - ERP Production", True) 'here paste your name of module you are trying to connect/enter
Set session = Connection.Children(0)

'if You need to pass username and password - not connect automatically
'session.findById("wnd[0]/usr/txtRSYST-MANDT").Text = "900"
'session.findById("wnd[0]/usr/txtRSYST-BNAME").Text = "user"
'session.findById("wnd[0]/usr/pwdRSYST-BCODE").Text = "password"
'session.findById("wnd[0]/usr/txtRSYST-LANGU").Text = "EN"

If session.Children.Count > 1 Then

    answer = MsgBox("You've got opened SAP already, please leave and try again", vbOKOnly, "Opened SAP")

    session.findById("wnd[1]/usr/radMULTI_LOGON_OPT3").Select
    session.findById("wnd[1]/usr/radMULTI_LOGON_OPT3").SetFocus
    session.findById("wnd[1]/tbar[0]/btn[0]").press

    Exit Sub

End If

session.findById("wnd[0]").maximize
session.findById("wnd[0]").sendVKey 0 'ENTER
'and there goes your code in SAP

希望对你有帮助:)

【讨论】:

  • 非常感谢!我去测试一下。
  • 如果您不介意,只是一个简单的问题。在我的大部分 SAP 交易中,我需要输入材料代码进行查找。有什么方法可以创建一个宏,将 Excel 中的列表复制粘贴到材料中?
  • 如果我理解正确,我通常是从 Excel 中记录副本,而在 SAP 中,我使用的是“从剪贴板复制”按钮。材料/产品/备件(无论)的完整列表出现在 SAP 窗口列表中。如果该方法有效,请发出信号。
  • 我不知道这行得通!你是神。非常感谢:)
  • 整个 SAP 登录问题也可以在这里找到simpleexcelvba.com/connect-to-sap-via-excel-vba
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
相关资源
最近更新 更多