Kod poniżej umożliwia połączenie Excel VBA do SAP HANA. Jest to szkielet kodu, do którego powinno się dodać inne elementy jak np. operacje w SAP i obróbka danych w Excel. Aby móc działać pomiędzy Excel, a SAP parę warunków musi zostać spełnione.
Po pierwsze pisząc kod VBA, do naszego projektu musimy dodać referencję SAP GUI Scripting API. Po drugie, użytkownik musi być zalogowany do SAP, aby móc wykonać kod.
Do kodu dodałem jedną testową procedurę, aby pokazać gdzie umieszczam kod odpowiedzialny za poruszanie się po SAP (ten kod nagrywam bezpośrednio w SAP i dodaje do kodu VBA) ewentualnie za obróbkę danych w SAP. Dodatkowo w projekcie jest włączona obsługa błędów. Zauważcie proszę zadeklarowane globalne zmienne, które mogą być używane w całym projekcie.
Przykład połączania Excel VBA z SAP HANA:
Option Explicit ' --- INFO O MODULE ----------------------------------------------------------------------------------------------- ' Szkielet połączenia pomiędzy EXCEL VBA, a SAP HANA. By móc połączyć się z SAP użytkownik musi być ' zalogowany do SAP. Aplikacja po uruchomieniu sprawdza, czy w SAP otwarte jest okienko tzw. SESSION_MANAGER, ' czyli główne okienko SAP - jeżeli nie applikacja zwraca błąd. Jeżeli SESSION_MANAGER został znaleziony to ' kod jest kontynowany. Do kodu dodano obługę błędów. Aby uruchomić kod do projektu trzeba dodać referencje ' SAP GUI Scripting API ' ' DODANIE REFERENCJI DO PROJEKTU ' SAP GUI Scripting API (plik sapfewse.ocx w folderze SAP C:\Program Files (x86)\SAP\FrontEnd\SAPgui\sapfewse.ocx) ' ' WYLACZENIE ALERTOW W SAP - MSGBOX z SAP przy połączeniu ' SAP GUI -> Alt / F12 (local layout tune) -> Options -> Scripting: ' - Notify when a script connects to SAP GUI -> deactivate ' - Notify when a script establishes a connection -> deactivate ' ------------------------------------------------------------------------------------------------------------------ ' Źródło: ' https://blogs.sap.com/2013/03/29/use-the-vba-debugger-to-analyze-sap-gui-scripting-objects-at-runtime/ ' https://archive.sap.com/discussions/thread/3551900 ' https://archive.sap.com/discussions/thread/3517188 ' https://windowssecrets.com/forums/showthread.php/153057-I-want-Excel-always-on-top ' i inne Public SGA As Object Public App As SAPFEWSELib.GuiApplication Public Connection As SAPFEWSELib.GuiConnection Public Session As SAPFEWSELib.GuiSession Public SessionTcode, ModulName, procName As String Public ErrorHapenned, ErrStatus, ErrOpis Public ErlLine As Long ' Deklaracje dla objxl #If VBA7 Then Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As Long #Else Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Long) As Long #End If Public Sub SAPconnectionTest() ' Otwarcie połączenia z SAP, User musi być zalogowany do SAP ' Okno główne musi byc otwarte - inaczej kod bedzie zatrzymany ' Otwórz IMMEDIATE WINDOW, aby widzieć potwierdzenia wykonia kodu, badz błedu Dim LicznikOkienekSAP As Integer Dim StartTime, EndTime, FinalTime, SapWindowJump Dim objxl As Object 'przywracanie Excela na górę Dim SapWindowsCount As Long On Error GoTo ErrorHapenned ' Przypisanie zmiennych Set objxl = GetObject(, "Excel.Application") StartTime = Format(Time, "Long Time") Application.ScreenUpdating = False ModulName = "modSAPconnection" procName = "SAPconnectionTest" ErrStatus = False ' --------------------------------------------------------------------------- ' USTANAWIANIE NOWEGO POLACZENIA Z SAP Set SGA = GetObject("SAPGUI") If Not IsObject(SGA) Then GoTo ErrorHapenned End If Set App = SGA.GetScriptingEngine() If Not IsObject(App) Then GoTo ErrorHapenned End If Set Connection = App.Connections(0) If Not IsObject(Connection) Then GoTo ErrorHapenned End If ' ---------------------------------------------------------- ' SZUKANIE SESSION MANAGERA I EW. POBIERANIE DANYCH Z SAP SapWindowsCount = Connection.Children.Count 'zwraca ilość aktualnie otwartych okienek For LicznikOkienekSAP = 0 To SapWindowsCount - 1 ' Sprawdzanie nazw transakcji SAP Set Session = Connection.Children(CInt(LicznikOkienekSAP)) SessionTcode = Session.Info.Transaction If SessionTcode = "SESSION_MANAGER" Then ' Pokazanie okienka SAP Session.ActiveWindow.JumpForward ' -------------------------------------------------------- ' POCZĄTEK KODU VBA DZIALAJACEGO W SAP (nagrany w SAP) ' Potwierdzenie prawidłowego polaczenia z SAP ' do poźniejszego usunięcia! Debug.Print StartTime & " Excel -> SAP polaczenie. Status: OK." ' Przykład jak wykorzystać zmienną ErrStatus If ErrStatus = True Then GoTo ErrorHapenned Else ErrorShow 'call do innej procedury, jeżeli chcesz wywolac blad zmien wartosci i na string End If If ErrStatus = True Then GoTo ErrorHapenned Else Debug.Print StartTime & " Pobranie danych z SAP. Status: OK" End If ' KONIEC KODU VBA DZIAŁAJĄCEGO W SAP ' ---------------------------------------------------------- ' Czyszczenie polaczenia z SAP Set Session = Nothing Set Connection = Nothing Set App = Nothing Set SGA = Nothing ' Przeskok,jezeli brak błedu wyszukania SESSION MANAGER ' czyli okna głównego SAP GoTo SapWindowJump End If Next LicznikOkienekSAP ' MsgBox "Przed uruchomiem aplikacji otworz 'SESSION MANAGERA'," & _ ' Chr(10) & "czyli glowne okno programu SAP.", vbCritical, "UWAGA..." Debug.Print StartTime & " Brak otwartego glownego okna SAP. Status: BLAD." Exit Sub SapWindowJump: ' ---------------------------------------------------------- ' START KODU WYKONYWANEGO W EXCELU ModulName = "modSAPconnection" procName = "SAPconnectionTest" objxl.Visible = True SetForegroundWindow objxl.hwnd 'przywracanie Excela na gore ' Obróbka pobranych danych z SAP w Excelu If ErrStatus = True Then GoTo ErrorHapenned Else Debug.Print StartTime & " Obrobka danych pobranych z SAP w Excelu. Status: OK." End If ' KONIEC KODU WYKONYWANEGO W EXCELU ' ---------------------------------------------------------- ' ---------------------------------------------------------- ' CZYSZCZENIE Application.ScreenUpdating = True EndTime = Format(Time, "Long Time") FinalTime = Format(CDate(EndTime) - CDate(StartTime), "Long Time") On Error GoTo 0 Exit Sub ' ---------------------------------------------------------- ' OBSŁUGA EWENTUALNYCH BŁEDÓW ErrorHapenned: MsgBox "BLAD WYKONANIA KODU!" & Chr(10) & Chr(10) & _ "Modul: " & ModulName & Chr(10) & _ "Procedura: " & procName & Chr(10) & _ "Linia: " & Erl & Chr(10) & _ "Opis: " & ErrOpis, vbCritical, "APP ERROR..." Err.Clear ' ---------------------------------------------------------- ' CZYSZCZENIE Set Session = Nothing Set Connection = Nothing Set App = Nothing Set SGA = Nothing End Sub Public Sub ErrorShow() ' Wywolanie testowego bledu. Normalnie tu powienien znajdować się kod pobierania danych ' z SAP, bądź obróbki danych w Excelu. ' Do zmiennej i, która jest liczbą zostaje przypisana wartość string ' Jeżeli nie chcesz wywolac błędu przypiasz do zmiennej i wartość liczbową Dim i As Long On Error GoTo ErrorHapenned procName = "ErrorShow" i = 1 'i = "Przypisanie stringa do longa = blad." Exit Sub ' ---------------------------------------------------------- ' OBSŁUGA EWENTUALNYCH BŁEDÓW ErrorHapenned: ErrOpis = Err.Description ErrStatus = True ErlLine = Erl 'zmienna erl przyjmie wartosc jezeli sa dodane linie wierszy End Sub
Pingback: Pobieranie formatu daty z SAP | Moja baza danych Excel
Cześć, mam pytanie, w jakiś sposób ustawić pętle logowania do SAP w przypadku gdy użytkownika jest zalogowany. Pętla ta by miała co dziesięć sekund podejmować próbę zalogowania aż do powodzenia i wykonania skryptu
Hej,
na szybko na necie znalazlem takie rozwiązanie:
Sub my_Procedure()
MsgBox „hello world”
Call test ’ for starting timer again
End Sub
Sub test()
Application.OnTime Now + TimeValue(„00:00:20”), „my_Procedure”
End Sub
https://stackoverflow.com/questions/22772898/how-to-have-vba-execute-every-10-minutes