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

  1. #1
    Membre à l'essai
    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
    Points : 13
    Points
    13
    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 éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    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 expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 118
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 118
    Points : 1 641
    Points
    1 641
    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 à l'essai
    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
    Points : 13
    Points
    13
    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 à l'essai
    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
    Points : 13
    Points
    13
    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 à l'essai
    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
    Points : 13
    Points
    13
    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

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour Pascal,

    J'ai l'impression que mon problème vient du fait qu'Excel n'est pas entièrement chargé (ouvert) lorsque mes macros commencent.
    Pour moi, ça ce n'est pas possible !
    Si la macro se lance, c'est que le classeur est ouvert

    Le problème vient d'ailleurs et je pencherais sur la connexion à la session
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set session = connection.Children(0)
    session.FindById("wnd[0]").Maximize
    session.FindById("wnd[0]").SendVKey 0
    Rien ne permet de savoir si la connexion est bien ouverte ?

  8. #8
    Membre à l'essai
    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
    Points : 13
    Points
    13
    Par défaut
    Bonjour BrunoM45,

    Merci pour les infos.
    La piste côté SAP est intéressante. Je cherche dans cette direction.
    Pour l'instant, j'ai toujours la même problématique.

    Cdlt.
    Pascal

  9. #9
    Membre à l'essai
    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
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    J'ai rajouté ce code dans la macro AFKO après la ligne 89

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    '
     
    Set session = Nothing
    Set connection = Nothing
    Set WSHShell = Nothing
    Set SapGui = Nothing
    Set Applic = Nothing
    Ce qui a pour but de stopper le script côté SAP
    Mais ça ne change rien.
    Donc la piste côté SAP est close.

    Cdlt
    Pascal

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 118
    Points : 1 641
    Points
    1 641
    Par défaut
    Au risque de me répéter:
    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.
    Si tu écrivais des gestionnaires d'erreur correcte ?
    Enfin, as-tu exécuté en pas à pas ? Utilisé des espions ?
    Et théoriquement, une fois que tous les objets SAP sont détruits, tu n'a pas besoin de vérifier que le fichier Excel est ouvert, il doit être disponible. Contente toi de vérifier qu'il existe.

  11. #11
    Membre à l'essai
    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
    Points : 13
    Points
    13
    Par défaut
    Bonjour deedolith,

    J'ai partagé ma macro en 2. Une pour la partie SAP et la 2ème pour la partie Excel.
    J'ai exécuté pas-à-pas les macros.
    Tout fonctionne très bien, comme auparavant.

    Par contre, si je sors d'Excel et que j'ouvre mon fichier qui comporte une macro qui lance les autres macros à l'ouverture de mon fichier.
    Dans ce cas de figure ma macro tourne en boucle. le fichier généré par SAP ne s'ouvre pas.
    Dès que je stop la macro le fichier s'ouvre.

    Pourquoi?

    Cdlt.
    Pascal

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 118
    Points : 1 641
    Points
    1 641
    Par défaut
    Tu dois avoir un couacs dans la chaine des appels.
    Macro du fichier A, qui appelle une macro du fichier B, qui importe les données SAP, c'est bien ce que je comprend ?
    (Pas très conventionnel comme façon de procéder).

    Ne serait-ce pas mieux de coller tes macros dans un XLAM histoire de te constituer une bibliothèque de fonctionnalités ?

  13. #13
    Membre à l'essai
    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
    Points : 13
    Points
    13
    Par défaut
    Bonjour deedolith ,

    Là tu m'as perdu ;-)

    Toutes mes macros sont dans le même fichier Excel.
    Par contre j'ai séparé en 2 macros, pour avoir une macro pour SAP et une 2ème pour Excel.

    Je ne sais pas ce qu'est le XLAM?
    Je vais voir ce que c'est.

    Cdlt.
    Pascal

  14. #14
    Membre à l'essai
    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
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    Je pense savoir où est le problème, mais je ne sais pas comment le résoudre.

    A vrai dire mon fichier AFKO.XLSX s'ouvre dans un autre VBAProjet. Et du coup il n'arrive pas à dialoguer.

    Je nomme ça VBAProjet (image ci-dessous), mais je ne suis pas sur de mon terme.


    Nom : VBAProjet.jpg
Affichages : 205
Taille : 72,5 Ko

    Comment dois-je faire ?

    Merci d'avance.

    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