繁体   English   中英

SAP GUI 导出自动打开 excel

[英]SAP GUI export automatically opens excel

我正在尝试编写一个从 SAP GUI 中的 ALV 网格检索数据的宏。 一切正常,直到数据导出。 将数据从 ALV 网格导出到 .xlsx 文件时,该文件将在导出后自动打开。

我需要我的脚本等待导出打开,然后将数据从新打开的导出文件复制到脚本来自的 .xlsm 文件。

如果我尝试在 SAP GUI 中导出文件的命令之后立即激活 export.XLSX 文件,我会收到“下标超出范围”错误。 我想也许我可以循环激活命令,直到它停止出错(当 export.xlsx 文件打开时),但这会导致 excel 崩溃。 我该怎么办?

Function funcLSAT(strEnv)

Dim wkbExport As Workbook
Dim strError As String

If Not IsObject(SapGuiApp) Then
    Set SapGuiApp = CreateObject("Sapgui.ScriptingCtrl.1")
End If
If Not IsObject(Connection) Then
    Set Connection = SapGuiApp.OpenConnection(strEnv, True)
End If
    
Set session = Connection.Children(0)
session.findById("wnd[0]/tbar[0]/okcd").Text = "[TCODE]"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/tbar[1]/btn[8]").press
session.findById("wnd[0]/tbar[1]/btn[8]").press
session.findById("wnd[0]/usr/cntlG_CC_MCOUNTY/shellcont/shell").pressToolbarContextButton "&MB_EXPORT"
session.findById("wnd[0]/usr/cntlG_CC_MCOUNTY/shellcont/shell").selectContextMenuItem "&XXL"
session.findById("wnd[1]/usr/ctxtDY_PATH").Text = "[filepath]"
session.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = "export.xlsx"
session.findById("wnd[1]/tbar[0]/btn[11]").press
Set session = Nothing
Set Connection = Nothing
Set SapGuiApp = Nothing

Do
On Error Resume Next
Windows("export.XLSX").Activate
Loop Until (Err.Number = 0)
On Error GoTo 0

Range("A2:AS2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy

End Function

前一段时间我遇到了同样的问题,当时我的宏必须等待创建 .txt 然后继续,所以我发现了这个:

Dim Directory As String, File As String
Directory = ActiveWorkbook.Path & "\" 'path for the file
File = Directory & "datos.txt" 'name of the file along with the path


  FindIt = Dir(File)
  While Len(FindIt) = 0
  FindIt = Dir(File)
  Wend

希望能帮助到你。

这是我将导出为 xlsx、复制到工作表并关闭的操作。 Application.wait 不会执行您希望它在此处执行的操作。 Application.wait 不会发布 excel,因此 sap 文件永远不会打开。 设置计时器将释放 excel 以便加载文件。

它可能不是写得最好的,但它有效。 首先做一个函数来查看文件是否打开。 然后设置一个 0.5 秒左右的计时器以进行循环。 你可以做一个更长的计时器,可能不需要循环,但是用很短的时间完成可以防止 excel 发布的时间超过它必须的时间。 一旦文件锁定到,它将复制内容并关闭文件,并退出循环。 然后我也杀死了该文件,因为在下次运行时它需要在第一次运行时消失,isfile open 将拿起旧文件。 如果它在另一个实例中打开,它会被写入应该抓取工作簿的位置,但是,我还没有尝试过。 我的 vba 工作簿加载方式,SAP 文件最终加载到同一个实例中。 祝你好运!

函数 IsFileOpen(FileName As String) Dim iFilenum As Long Dim iErr As Long

On Error Resume Next
iFilenum = FreeFile()
Open FileName For Input Lock Read As #iFilenum
Close iFilenum
iErr = Err
On Error GoTo 0
 
Select Case iErr
Case 0:    IsFileOpen = False
Case 70:   IsFileOpen = True
Case Else: Error iErr
End Select
 

结束函数

Dim xlfile as string, xldir as string
Dim PauseTime, Start
Dim control As Long
Dim xlapp As Object
xldir= "Your file folder path here"   
control = 0
xlfile = "Your filename here"
Do Until control = 5
PauseTime = 0.5 ' Set duration.
Start = Timer    ' Set start time.
Do While Timer < Start + PauseTime
    DoEvents    ' Yield to other processes.
 Loop
  If control = 1 And IsFileOpen(xldir & xlfile) = False Then
  Exit Do
  End If
 If IsFileOpen(xldir & xlfile) = True Then
  Set xlapp = GetObject(xldir & xlfile).Application
  If control = 0 Then
  Workbooks(xlfile).Sheets(1).Name = Left(xlfile, Len(xlfile) - 5)
  Workbooks(xlfile).Sheets(Left(xlfile, Len(xlfile) - 5)).Copy    
  before:=ThisWorkbook.Sheets(1)
  ThisWorkbook.Activate
  control = 1
   End If
  For Each wb In Application.Workbooks
 If wb.Name = xlfile Then
  wb.Close
    End If
 Next wb
 End If
  Loop
 control = 0
 kill(xldir&xlfile)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM