Pisząc aplikację VBA Excel współpracującą z SAP można się spotkać z błędnym formatem daty jaki używa użytkownik w SAP. Jeżeli w SAP format daty jest inny niż ten który dla Excela jest datą to będziemy mieli problem z działaniami na datach w Excelu.
Prawidłowy format daty w Excelu to RRRR-MM-DD, choć inne regiony świata mogą mieć inne podejście. Jeżeli zatem w Excelu mamy ustawiony format RRRR-MM-DD to, gdy pobierzemy datę z SAP w np. w formacie DD.MM.RRRR wtedy ta data będzie widziana dla Excela jako tekst. Aby sprawdzić jaki format daty jest używany w SAP należy skorzystać z transakcji SU3.
Ważne jest, aby użytkownik w opcjach SAP włączył oznaczenie kontrolek przez id/numerację. Dzięki temu możemy skorzystać z poniższego kodu, ewentualnie dostosować do swoich potrzeb. Oczywiście w pierwszym kroku należy połączyć się z SAP zgodnie z kodem z tego posta: Połączenie Excel VBA z SAP HANA.
Private Sub GetSAP_DateFormat() ' Pobieranie formatu daty uzywanego przez usera w SAP ' Trzeba włączyc w opcjach SAP opis labelki przez id (jak będę miał dostęp do SAP, zaktualizuje post) Dim IdDatySAP, TempDateFormat, FormatDatySAP Dim LicznikWierszyLX02 as Long On Error GoTo ErrorHapenned LicznikWierszyLX02 = 1 ' --------------------------------------------------------------------------- ' POBIERANIE FORMATU DATY Z SU3 Session.FindById("wnd[0]").Maximize Session.FindById("wnd[0]/tbar[0]/okcd").Text = "su3" Session.FindById("wnd[0]").SendVKey 0 Session.FindById("wnd[0]/usr/tabsTABSTRIP1/tabpDEFA").Select TempDateFormat = Session.FindById("wnd[0]/usr/tabsTABSTRIP1/tabpDEFA/ssubMAINAREA:SAPLSUID_MAINTENANCE:1105/cmbSUID_ST_NODE_DEFAULTS-DATFM").Text ' --------------------------------------------------------------------------- ' WYJŚCIE DO SESSION MANAGER Session.FindById("wnd[0]/tbar[0]/okcd").Text = "/n" Session.FindById("wnd[0]").SendVKey 0 ' --------------------------------------------------------------------------- ' GLOBALANA ZMIENNA FORMATU DATY W SAP ' Ustalanie formatu daty FormatDatySAP = Left(TempDateFormat, InStr(1, TempDateFormat, " ") - 1) IdDatySAP = FormatDatySAP ' User moze miec opis wiersza przed formatem daty. Jezeli tak ma ' to wartość liczbowa ze spacją jest usuwana i pozostawiony jest tylko format daty 'If FormatDatySAP < 10 Then ' FormatDatySAP = Mid(TempDateFormat, 3, InStr(3, TempDateFormat, " ") - 3) 'End If ' --------------------------------------------------------------------------- ' OBRÓBKA DANYCH Z SAP W EXCEL ' Tutaj powinien znaleźć się kod w którym importujemy dane z SAP i wklejamy je do Excel ' --------------------------------------------------------------------------- ' ZAMIANA DATY NA PRAWIDŁOWĄ ' Nie mam teraz dostępu do SAP, ale mniej więcej tak sobie wyobrażam zamianę daty na poprawna ' Jeżeli jest w kontrolce SAP oznaczenie id dla danego formatu daty - to można użyć tego kodu ' Wcześniej data z SAP została zrzucona do komórki w arkuszu Select Case IdDatySAP Case 1 .Sheets(SheetName).Cells(LicznikWierszyLX02, 13) = Right(.Sheets(SheetName).Cells(LicznikWierszyLX02, 13), 4) & "-" & _ Mid(.Sheets(SheetName).Cells(LicznikWierszyLX02, 13), 4, 2) & "-" & _ Left(.Sheets(SheetName).Cells(LicznikWierszyLX02, 13), 2) Case 2 .Sheets(SheetName).Cells(LicznikWierszyLX02, 13) = Right(.Sheets(SheetName).Cells(LicznikWierszyLX02, 13), 4) & "-" & _ Left(.Sheets(SheetName).Cells(LicznikWierszyLX02, 13), 2) & "-" & _ Mid(.Sheets(SheetName).Cells(LicznikWierszyLX02, 13), 4, 2) Case 3 .Sheets(SheetName).Cells(LicznikWierszyLX02, 13) = Right(.Sheets(SheetName).Cells(LicznikWierszyLX02, 13), 4) & "-" & _ Left(.Sheets(SheetName).Cells(LicznikWierszyLX02, 13), 2) & "-" & _ Mid(.Sheets(SheetName).Cells(LicznikWierszyLX02, 13), 4, 2) Case 4 .Sheets(SheetName).Cells(LicznikWierszyLX02, 13) = Replace(.Sheets(SheetName).Cells(LicznikWierszyLX02, 13), ".", "-", 1) Case 5 .Sheets(SheetName).Cells(LicznikWierszyLX02, 13) = Replace(.Sheets(SheetName).Cells(LicznikWierszyLX02, 13), "/", "-", 1) Case 6 ' prawidłowy format End Select Exit Sub ' ---------------------------------------------------------- ' OBSŁUGA EWENTUALNYCH BŁEDÓW ErrorHapenned: ErrOpis = Err.Description ErrStatus = True ErlLine = Erl End Sub