Połączenie Excel VBA z SAP HANA

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

3 myśli w temacie “Połączenie Excel VBA z SAP HANA

  1. Pingback: Pobieranie formatu daty z SAP | Moja baza danych Excel

  2. 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

Pozostaw odpowiedź pawel Anuluj pisanie odpowiedzi

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.