【问题标题】:Export SAP Data won't open workbook while running运行时导出 SAP 数据不会打开工作簿
【发布时间】:2019-04-01 09:23:05
【问题描述】:

我编写了一个将数据从 SAP 导出到 Excel 工作簿的代码。为此,我打开事务(在本例中为 IW28),导出文件并将其保存到指定位置。打开文件后,我想将导出工作表中的数据复制到我自己的工作表中。

问题是在我运行宏时导出的工作表不会打开。当我在代码中添加断点时,导出的工作表会在宏停止时打开。如果没有这个断点,导出的工作表只会在宏完成后打开。

'Laden van de data uit transactie IW28 naar de sheet
Dim lastcolumn As Long

Application.DisplayAlerts = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

'SAP Variant
SapVariant = "Variant"

'Transaction
Name = IW28

'Current File Location
Map = Application.ActiveWorkbook.Path

If Not IsObject(SapApp) Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set SapApp = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
   Set Connection = SapApp.Children(0)
End If
If Not IsObject(session) Then
   Set session = Connection.Children(0)
End If
If IsObject(WScript) Then
   WScript.ConnectObject session, "on"
   WScript.ConnectObject SapApp, "on"
End If

'Check if file is already open, if so then close the file
If IsOpen(Name & ".xlsx") = True Then Workbooks(Name & ".xlsx").Close

'Open Transaction
session.findById("wnd[0]/tbar[0]/okcd").Text = "/N" & Name
session.findById("wnd[0]").sendVKey 0

'Choose Variant
On Error Resume Next
session.findById("wnd[0]/mbar/menu[2]/menu[0]/menu[0]").Select
session.findById("wnd[1]/usr/txtV-LOW").Text = SapVariant

'Check if variant excists
If Not Err.Number = 0 Then
    VarMsgbox = MsgBox("Selecteer variant " & SapVariant & ", dubbelklik om deze te selecteren en klik dan hieronder op ok (niet eerder!)", vbOKCancel, "Selecteer variant")
    If VarMsgbox = vbCancel Then Exit Sub
Else
    session.findById("wnd[1]/usr/txtENAME-LOW").Text = ""
    session.findById("wnd[1]/usr/txtV-LOW").caretPosition = 10
    session.findById("wnd[1]").sendVKey 0
    session.findById("wnd[1]").sendVKey 8
End If

'Execute Variant
session.findById("wnd[0]").sendVKey 8

'Select all data in SAP
session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").SelectAll

'Export to Excel
session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").contextMenu
session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").selectContextMenuItem "&XXL"
session.findById("wnd[1]/tbar[0]/btn[0]").press

'Add filename and path
session.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = Name & ".xlsx"
session.findById("wnd[1]/usr/ctxtDY_PATH").Text = Map
session.findById("wnd[1]/tbar[0]/btn[11]").press

'Determine lastrow of sheet
Lastrow = Workbooks(Name & ".xlsx").Sheets("Sheet1").Range("B99999").End(xlUp).Row

ThisWorkbook.Sheets(Name).Range("A8:C99999").ClearContents

Workbooks(Name & ".xlsx").Sheets("Sheet1").Range("A2:C" & Lastrow).Copy

ThisWorkbook.Sheets(Name).Range("A8").PasteSpecial xlPasteValues

ThisWorkbook.Sheets("Start").Activate

Application.DisplayAlerts = True
Application.ScreenUpdating = True

【问题讨论】:

  • 我检查了它并尝试了这个“转到右上角的检查...单击电视 > 设置 > 交互 > 快速信息并使用辅助功能模式。”,但没有结果。其他解决方案是防止 excel 最后打开工作簿。我的问题是我想在运行代码时打开创建的工作簿,这样我就可以从创建的工作簿中提取数据并将其粘贴到我自己的 Excel 文件中。

标签: excel vba scripting sap-gui


【解决方案1】:

您可以尝试以下程序构造:

Public Name as String

Sub Makro1()
 'Laden van de data uit transactie IW28 naar de sheet
 Dim lastcolumn As Long

 . . .

 session.findById("wnd[1]/tbar[0]/btn[11]").press
 call Makro2
End Sub

Sub Makro2()
 'Determine lastrow of sheet
 Lastrow = Workbooks(Name &    .xlsx").Sheets("Sheet1").Range("B99999").End(xlUp).Row

 ThisWorkbook.Sheets(Name).Range("A8:C99999").ClearContents

 Workbooks(Name & ".xlsx").Sheets("Sheet1").Range("A2:C" & Lastrow).Copy

 ThisWorkbook.Sheets(Name).Range("A8").PasteSpecial xlPasteValues

 ThisWorkbook.Sheets("Start").Activate

 Application.DisplayAlerts = True
 Application.ScreenUpdating = True
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多