IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Upload table SAP en VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Responsable en conduite du changement
    Inscrit en
    Mars 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable en conduite du changement
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 22
    Par défaut Upload table SAP en VBA
    Bonjour,

    J'ai créé une macro en VBA sous EXCEL pour uploader une table SAP.
    Ma macro marche très bien si je la lance depuis mon fichier prinicipal excel directement (F5 depuis l'éditeur Visual Basic de Excel), mais ne marche pas si la macro est lancé lors de l'ouverture du fichier principal.
    La macro n'arrive pas à ouvrir le nouveau fichier Excel généré par SAP. Il tourne en boucle (Loop ligne 91 à 93 de mon code macro AFKO)

    Je ne comprends pas pourquoi?

    Qui sait pourquoi?

    Merci d'avance.
    Pascal

    Code à l'ouverture du ficher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Workbook_Open()
    Call AFKO
    End Sub
    Code macro AFKO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     
    Sub AFKO()
    '
    Application.DisplayAlerts = False
    'Launching SAP and logging into the main screen if the program is not already open
     
    If IsProcessRunning("saplogon.exe") = False Then
    Dim SapGui, Applic, connection, session, WSHShell, myError, WScript
     
    Shell "C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe", vbNormalFocus
     
    Set WSHShell = CreateObject("WScript.Shell")
     
    Do Until WSHShell.AppActivate("SAP Logon ")
        Application.Wait Now + TimeValue("0:00:01")
    Loop
     
    Set WSHShell = Nothing
    Set SapGui = GetObject("SAPGUI")
    Set Applic = SapGui.GetScriptingEngine
    Set connection = Applic.OpenConnection("10.01    PE1  -  S/4 System", True)
    'error comes here if SAP-Logon and SAP is not logged in
    Set session = connection.Children(0)
    session.FindById("wnd[0]").Maximize
    session.FindById("wnd[0]").SendVKey 0
    End If
     
    'Executing main screen, this part here is just setting variables for the  logged in interface. So once this is done you can enter the transaction.
     
    '-----------new--------------------------
    On Error Resume Next
    '-----------new--------------------------
    If Not IsObject(XXX) Then
       Set SapGui = GetObject("SAPGUI")
       Set XXX = SapGui.GetScriptingEngine
       '-----------new--------------------------
       myError = Err.Number
       '-----------new--------------------------
    End If
    If Not IsObject(connection) Then
       Set connection = XXX.Children(0)
       '-----------new--------------------------
       myError = Err.Number
       '-----------new--------------------------
    End If
     
    If Not IsObject(session) Then
    'error comes here if SAP-Logon is open and SAP is connected
       Set session = connection.Children(0)
       '-----------new--------------------------
       myError = Err.Number
       '-----------new--------------------------
    End If
    '-----------new--------------------------
    On Error GoTo 0
    If myError <> 0 Then
      Set connection = XXX.OpenConnection("10.01    PE1  -  S/4 System", True)
    'error comes here if only SAP-Logon is open and SAP not connected
      Set session = connection.Children(0)
      session.FindById("wnd[0]").Maximize
    End If
    '-----------new--------------------------
     
    If IsObject(WScript) Then
       WScript.ConnectObject session, "on"
       WScript.ConnectObject Applic, "on"
    End If
     
    'Transaction comes here
     
    connection.Children(0).FindById("wnd[0]").ResizeWorkingPane 352, 55, False
    connection.Children(0).FindById("wnd[0]/tbar[0]/okcd").Text = "/nsqvi"
    connection.Children(0).FindById("wnd[0]").SendVKey 0
    connection.Children(0).FindById("wnd[0]/usr/ctxtRS38R-QNUM").Text = "AFKO"
    connection.Children(0).FindById("wnd[0]/usr/btnP1").Press
    connection.Children(0).FindById("wnd[0]/tbar[1]/btn[8]").Press
    connection.Children(0).FindById("wnd[1]/usr/txtRS38R-DBACC").Text = "100"
    connection.Children(0).FindById("wnd[1]/usr/txtRS38R-DBACC").CaretPosition = 6
    connection.Children(0).FindById("wnd[1]/tbar[0]/btn[0]").Press
    connection.Children(0).FindById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").PressToolbarContextButton "&MB_EXPORT"
    connection.Children(0).FindById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").SelectContextMenuItem "&XXL"
    connection.Children(0).FindById("wnd[1]/tbar[0]/btn[0]").Press
    connection.Children(0).FindById("wnd[1]/usr/ctxtDY_PATH").Text = "C:\TEMP\"
    connection.Children(0).FindById("wnd[1]/usr/ctxtDY_FILENAME").Text = "AFKO.XLSX"
    connection.Children(0).FindById("wnd[1]/usr/ctxtDY_FILENAME").CaretPosition = 4
    connection.Children(0).FindById("wnd[1]/tbar[0]/btn[11]").Press
    connection.Children(0).FindById("wnd[0]/tbar[0]/btn[15]").Press
    connection.Children(0).FindById("wnd[0]/tbar[0]/btn[15]").Press
    connection.Children(0).FindById("wnd[0]/tbar[0]/btn[15]").Press
    '
    Do
        DoEvents
    Loop Until FichierEstOuvert("C:\TEMP\AFKO.XLSX")
    Application.ScreenUpdating = True
    Workbooks("AFKO.XLSX").Activate
    Application.ScreenUpdating = False
    Workbooks("AFKO.XLSX").Save
    Workbooks("AFKO.XLSX").Close
    Workbooks("MaJ Tables SAP.XLSM").Activate
    '
    Application.DisplayAlerts = True
    End Sub
    Codes des fonctions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Function IsProcessRunning(process As String)
    Dim objList As Object
     
    Set objList = GetObject("winmgmts:").ExecQuery("select * from win32_process where name='" & process & "'")
     
    IsProcessRunning = objList.Count > 0
     
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function FichierEstOuvert(ByRef FichierTeste As String) As Boolean
     
        Dim Fichier As Long
        On Error GoTo Erreur
        Fichier = FreeFile
        Open FichierTeste For Input Lock Read As #Fichier
        Close #Fichier
        FichierEstOuvert = False
        Exit Function
    Erreur:
        FichierEstOuvert = True
    End Function

  2. #2
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Je pense que le soucis vient de ta procédure de test "FichierEstOuvert"
    Ne faudrait-il pas retourner False en cas d'erreur et True en cas de réussite? Sinon, lorsque ton code arrive à ce point et si le fichier est déà existant... ça donne une boucle infinie, ce qui semble correspondre à ton problème.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 511
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 511
    Par défaut
    Hello,

    Ta fonction FichierEstOuvert ne fait pas exactement ce que tu croit.
    Si le fichier n'existe pas ou est inaccessible, elle retourne Vrai, ce que n'a pas de sens (à mon avis, elle devrais planter).

    Ta fonction AFKO viole le SRP, elle fait beaucoup trop de choses (obtenir les données en provenance de SAP, ouvrir le fichier resultant). Divise la en 2, ce sera plus facile à maintenir.

    Je pense que le fait que les objets SAP ne soient pas détruit quand leur utilisation devient superflue font que ta boucle d'attente que ton fichier soit libérée par SAP tourne en rond (visiblement SAP ne libère pas le fichier comme tu le pense).
    ce qui me ramène à mon point précédent, encapsulés dans une fonction à part, les objets SAP seront automatiquement détruits, en toute logiques les ressources détenues par ces dernier seront libérés.

    Si tu écrivais des gestionnaires d'erreur correcte ?
    Enfin, as-tu exécuté en pas à pas ? Utilisé des espions ?

  4. #4
    Membre averti
    Homme Profil pro
    Responsable en conduite du changement
    Inscrit en
    Mars 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable en conduite du changement
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 22
    Par défaut
    Salut Qwartz,

    J'ai fait un essai avec ta proposition.
    Cela ne marche pas.
    C'est même pire.

    Si tu as une autre idée, je suis preneur.

    Cdlt.
    Pascal

  5. #5
    Membre averti
    Homme Profil pro
    Responsable en conduite du changement
    Inscrit en
    Mars 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable en conduite du changement
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 22
    Par défaut
    Salut deedolith,

    Merci pour les conseils ;-).
    Je l'ai avaient déjà appliqué.

    Petite précision concernant mon disfonctionnement.
    Toutes mes macros marchent parfaitement si je les lance manuellement.

    Par contre lorsque je créé une tâche planifié sous Windows pour ouvrir mon fichier Excel, la macro tourne en boucle.
    J'ai fait un call pour lancer les macros à l'ouverture de mon fichier Excel.

    Pas simple à expliquer;-(

    Cdlt.
    Pascal

  6. #6
    Membre averti
    Homme Profil pro
    Responsable en conduite du changement
    Inscrit en
    Mars 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable en conduite du changement
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 22
    Par défaut
    Bonjour,

    J'ai l'impression que mon problème vient du fait qu'Excel n'est pas entièrement chargé (ouvert) lorsque mes macros commencent.

    J'ai mis un temps d'attente avant d'appeler (call AFKO), mais a n'a rien changé.

    Comment peut-on vérifier qu'Excel (mon fichier principal) est complet ouvert?

    Cdlt.
    Pascal

Discussions similaires

  1. Réponses: 7
    Dernier message: 26/05/2006, 19h45
  2. Mise en forme table access par VBA ou SQL
    Par romrai dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 21/02/2006, 12h29
  3. Ajouter un enregitrement a une table vide en VBA avec access
    Par Mateache dans le forum VBA Access
    Réponses: 4
    Dernier message: 03/01/2006, 15h36
  4. Chemin des tables attachées en VBA
    Par stigma dans le forum Access
    Réponses: 3
    Dernier message: 17/06/2005, 09h42
  5. [PL/SQL][down&upLOAD] table document fixée
    Par meufeu dans le forum Oracle
    Réponses: 18
    Dernier message: 30/09/2004, 09h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo