Controlar la finestra emergent
Sovint em trobo exportant desde SAP (en aquest cas R3) la mateixa
informació repetidament en Excel (formal .xlsx), així que tinc
automatitzats gairebé tots els passos per exportar informaió desde la
GUI del popular ERP. Business Warehouse a vegades no és la sol·lució (en
molts casos no tinc a mà una query amb dades a temps real), així que
exportar dades desde la interfície gràfica es l’única manera d’obtenir
dades transaccionals en viu. El problema quan utilitzm VBA és com permetre que la finestra Excel emergent amb les dades de SAP s’obri i es guardi durant l’execució del codi.
Consideracions per executar el codi
Quan escric alguna macro per tercers usuaris, m’agrada limitar la seva execució mentre només hi hagi un únicfull d’Excel obert. Més d’una vegada em trobo usuaris que es dediquen a obrir i intentar fer coses en altres fulls mentre s’executa una macro. Prou.
També heu de tenir en compte que aquestes exportacions de SAP es guardaran a la carpeta temporal de Windows (així ho defineixo al següent pas, línea 21 i 22). Per tant, també m’asseguro que no hi hagi cap altre arxiu d’exportacions anteriors a la carpeta temporal amb el mateix nom. Esborro l’antic (si existeix) i endavant amb la macro.
'Permet només aquesta finestra oberta
For Each Wkb In Application.Workbooks
If Not (Wkb Is Application.ActiveWorkbook) Then
Wkb.Close
End If
Next
'Compta el número de fulles obertes
finestresobertes = Application.Workbooks.Count
'Si l'arxiu COOIS ja existeix, suprimeix-lo.
del_File = "C:\tmp\COOIS_EXPORT.xlsx"
If Len(Dir$(del_File)) > 0 Then
Kill del_File
End If
La finestra emergent no s'obre
'Run COOIS query in SAP ECC
session.FindById("wnd[0]").maximize
session.FindById("wnd[0]/tbar[0]/okcd").Text = "coois"
session.FindById("wnd[0]").sendVKey 0
session.FindById("wnd[0]/usr/ssub%_SUBSCREEN_TOPBLOCK:PPIO_ENTRY:1100/cmbPPIO_ENTRY_SC1100-PPIO_LISTTYP").Key = "ABRAXX"
session.FindById("wnd[0]/usr/ssub%_SUBSCREEN_TOPBLOCK:PPIO_ENTRY:1100/ctxtPPIO_ENTRY_SC1100-ALV_VARIANT").SetFocus
session.FindById("wnd[0]/usr/ssub%_SUBSCREEN_TOPBLOCK:PPIO_ENTRY:1100/ctxtPPIO_ENTRY_SC1100-ALV_VARIANT").caretPosition = 10
session.FindById("wnd[0]").sendVKey 4
session.FindById("wnd[1]/usr/cntlGRID/shellcont/shell").setCurrentCell 1, "TEXT"
session.FindById("wnd[1]/usr/cntlGRID/shellcont/shell").selectedRows = "1"
session.FindById("wnd[1]/usr/cntlGRID/shellcont/shell").DoubleClickCurrentCell
session.FindById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/chkP_KZ_E1").Selected = True
session.FindById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtP_SYST1").Text = "TECO"
session.FindById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_CWERK-LOW").Text = PlantCOOIS
session.FindById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_TERST-LOW").Text = CooisStartDate
session.FindById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_TERST-HIGH").Text = CooisEndDate
session.FindById("wnd[0]/tbar[1]/btn[8]").Press
session.FindById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont/shell").pressToolbarButton "&NAVIGATION_PROFILE_TOOLBAR_EXPAND"
session.FindById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont/shell").pressToolbarContextButton "&MB_EXPORT"
session.FindById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont/shell").selectContextMenuItem "&XXL"
session.FindById("wnd[1]/usr/ctxtDY_PATH").Text = "c:\tmp\"
session.FindById("wnd[1]/usr/ctxtDY_FILENAME").Text = "COOIS_EXPORT.xlsx"
'session.FindById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 17
session.FindById("wnd[1]").sendVKey 0
Al costat podeu veure l’scripting de SAP per executar la transacció COOIS segons les necessitats de l’usuari.
La part important d’aquest retall de codi són les línies 21 i 22. La 21 perque defineixo que l’exportació en format .xlsx es guardi a la carpeta temporal de Windows (“C:/tmp/“).
I la línea 22, on defineixo exportar l’arxiu en format .xlsx.
Fins aquí tot correcte. El problema és que un cop arribats aquí, la finestra emergent que hauria de saltar, no apareix.
La sol·lució: DoEvents
Si proveu amb fer esperar l’aplicació uns segons amb Application.Wait, no cal que ho intenteu, perque no funciona. La sol·lució passa per DoEvents.
El que fa aquesta funció és aturar temporalment l’execució de la macro, permetent al processador executar altres tasques i recoxèixer altres events. La durada d’aquesta pausa és obligatòria definir-la; és la condició que s’ha de complir per mantenir aquesta aturada. Us deixo dos exemples:
– Fer un DoEvents mentre el nombre de fulls de càlcul sigui = 1 (recordeu les Consideracions per executar el codi de més amunt).
– O bé fer un DoEvents de cinc segons.
En qualsevol dels dos casos, l’exportació de dades de SAP en format Exel saltarà, i veureu com s’obre una nova finestra.
'DoEvents mentre tinguem només una fulla Excel oberta'
Do
DoEvents
Loop While appworkbookcount = 1
'Guardem l'arxiu exportat
For Each wb In Application.Workbooks
If InStr(wb.Name, "EXPORT") > 0 Then
wb.Save
End If
Next wb
'DoEvents durant cinc segons
Dim now as long
now = Timer()
Do
DoEvents
Loop While (Timer < now + 5)