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 :

Erreur d´exécution dans Macro utilisant VB script SAP [XL-365]


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
    Contrôleur de gestion
    Inscrit en
    Mars 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2014
    Messages : 35
    Par défaut Erreur d´exécution dans Macro utilisant VB script SAP
    Bonjour á tous,

    Je rencontre une erreur récurrente en utilisant des lignes de code VBscript SAP dans une macros Excel:

    - Pour résumer, je lance une transaction SAP que j´exporte ensuite en .XLSX, afin de manipuler les données et les exporter avant de finalement refermer l´export généré sans sauvegarder (cf. code ci-dessous).


    Mon problème est le suivant: le code continue de se lancer avant l´ouverture de l´export et ce, même dans le cas oú j´ajoute une ligne du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Wait Now + TimeValue("00:00:10")
    .

    Le morceau de code correspondant est le suivant :
    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
    'Export to Excel
    Session.findById("wnd[0]/mbar/menu[0]/menu[3]/menu[1]").Select
     
    Session.findById("wnd[1]/usr/ctxtDY_PATH").Text = Folder
    Session.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = "ExportMLR.XLSX"
     
    On Error Resume Next
        Session.findById("wnd[1]/tbar[0]/btn[0]").press
        Session.findById("wnd[1]/tbar[0]/btn[11]").press
    On Error GoTo 0
     
    Application.Wait Now + TimeValue("00:00:10")
     
     
    'Paste DCE
    ActiveSheet.Range("A2:D2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Workbooks("Daily cost Extension Check.xlsm").Sheets("DCE").Activate
     
    Range("A2").Select
    ActiveSheet.Paste
    Je voudrais que le morceau de code á partir de ´Paste DCE soit effectué sur le fichier Excel généré via SAP. Auriez-vous une solution ne nécessitant pas de revoir la logique d´export des données ??

    Merci par avance pour votre précieuse aide

  2. #2
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 126
    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 126
    Par défaut
    Salut

    Si j'ai bien compris, ton fichier exporté s'appelle "ExportMLR.XLSX". Si c'est bien ça et que ce fichier est ouvert via SAP dans la même session d'excel que le fichier contenant la macro.
    Tu peux essayer quelques choses comme ça, à adapté, code non testé.
    Le code est commenté mais n'hésite pas si besoin d'infos.
    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
     
    Dim WbExport As Workbook
    Dim iLoop As Integer
     
        'On patiente le temps que le classeur soit généré
        Do
            On Error Resume Next
                'On pointe le classeur exporté par SAP
                Set WbExport = Application.Workbooks("ExportMLR.XLSX")
            On Error GoTo 0
            'Si aucun classeur n'est pointé, on patiente 10s
            If WbExport Is Nothing Then Application.Wait Now + TimeValue("00:00:10")
            'On comptabilise le nombre de boucle (pour éviter de rester dans une boucle infini en cas de non ouverture du fichier ou d'ouverture de celui-ci dans une autre session d'excel...)
            iLoop = iLoop + 1
        'On regarde si on à déjà fait 30 boucle (30*10s = 300s = 5 mins... à toi d'adapter, c'est peut-être un peu long)
        Loop Until iLoop = 30 Or Not WbExport Is Nothing
     
        'On vérifie que le classeur a bien été pointé
        If Not WbExport Is Nothing Then
            'On copie les données 'Paste DCE
            'Ici je ne suis pas sûr que tu obtiennes le résultat escompté...
            'Le End sur un groupe de cellules contenues sur plusieurs colonnes ne tient compte que de la dernière colonne à priori)
            With WbExport.ActiveSheet
                .Range(.Range("A2:D2"), .Range("A2:D2").End(xlDown)).Copy Workbooks("Daily cost Extension Check.xlsm").Sheets("DCE").Range("A2")
            End With
        Else
            'On prévient qu'il y a un soucis
            MsgBox "Le fichier exporté n'a pas été trouvé dans cette session d'Excel", vbExclamation, "Fichier introuvable"
     
            'Il serait possible de modifier le message précédent pour demander à l'utilisateur s'il veut pointer manuellement le fichier exporter (via un box open file, mais il faut que l'utilisateur connaisse sont emplacement)
            'Ou si tu connais l'emplacement, ce qui est probable, tu pourrait lancer le fichier (en lecture seul). Voir même extraite les données via ODBC sans ouvrir le fichier. 
        End If
    ++
    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 averti
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2014
    Messages : 35
    Par défaut
    Merci pour l´astuce ! Je viens d´essayer en intégrant tes lignes de codes (adaptées à mon cas) avec la logique de LOOP pour attendre que le fichier soit généré cependant cela n´a pas l´air de solutionner mon probléme.... si je le fais hors macros l´export s´ouvre en 2sec... et si je presse escape, l´export apparait également quand je sors de la macros....

    Je pense que le soucis viens de la communication entre SAP et Excel et du fait que je passe de l´un á l´autre... mais je ne vois vraiment pas comment solutionner.. En effet, dés que je reprends la main l´export apparait.

    Je laisse le sujet ouvert au cas oú

    Merci d´avance pour votre aide

  4. #4
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 126
    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 126
    Par défaut
    Salut

    Essai d'ajouter la ligne
    dans la boucle Do Loop

    ++
    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

  5. #5
    Membre averti
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2014
    Messages : 35
    Par défaut
    Toujours pas malheureusement ! Mais merci bien encore une fonction que j´apprends !

    Ce que je ne comprends pas c´est que le code suivant fonctionne bien tout seul (car ne manipule que SAP) et le fichier Excel issue de SAP s´ouvre aprés quelques secondes.

    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
    Sub ExportMDFR78()
     
        Chemin = ThisWorkbook.Path
     
        'Connection to SAP
        Set rotEntry = GetObject("SAPGUI")
        Set App = rotEntry.GetScriptingEngine
        Set Connection = App.Children(0)
        Set session = Connection.Children(0)
     
        'T-Code opening
        session.findById("wnd[0]/tbar[0]/okcd").Text = "/nY_GD2_82000306"
        session.findById("wnd[0]").sendVKey 0
     
        'Parameters selection
        session.findById("wnd[0]/usr/ctxtS_BUKRS-LOW").Text = "FR78"
        session.findById("wnd[0]/usr/ctxtS_BKLAS-LOW").Text = "Z100"
        session.findById("wnd[0]/usr/ctxtS_MMSTA-LOW").Text = "Z3"
     
        session.findById("wnd[0]/usr/btn%_S_MTART_%_APP_%-VALU_PUSH").press
        session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,0]").Text = "HALB"
        session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,1]").Text = "FERT"
        session.findById("wnd[1]/tbar[0]/btn[8]").press
     
        'Execute
        session.findById("wnd[0]/tbar[1]/btn[8]").press
     
        'Export to Excel
        session.findById("wnd[0]/mbar/menu[0]/menu[3]/menu[1]").Select
     
        session.findById("wnd[1]/usr/ctxtDY_PATH").Text = Chemin
        session.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = "Materials_FR78.XLSX"
     
        On Error Resume Next
        session.findById("wnd[1]/tbar[0]/btn[0]").press
        session.findById("wnd[1]/tbar[0]/btn[11]").press
        On Error GoTo 0
     
     
     
    End Sub
    Quand je souhaite rajouter du code á la suite en sélectionnant par exemple le classeur généré "Materials_FR78.XLSX" cela me donne une "ERREUR 9 - Subscript out of range", et lorsque je debug le fichier s´ouvre finalement mais du coup la macros stops...

    J´essaye de trouver des sujets liés sur Google sans succés

  6. #6
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 126
    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 126
    Par défaut
    Salut

    L’exécution d'une macro est exclusive. Je veux dire par là que si une macro s'exécute, une autre ne peut pas se lancer (excepté si la 1ère fait appelle à la seconde bien sûr).

    Donc si tu exécutes une macro et que SAP a besoin d'en exécuter une pour organiser le fichier exporté, c'est sans doute ça qui pose problème.

    Tu pourrais peut-être faire un essai en utilisant la fonction OnTime. Elle permet de programmer l'exécution d'un procédure (autre nom pour macro).
    En gros tu scindes ton code en 2 parties
    1ère/ Tu manipules SAP pour faire ton extraction. Puis tu programmes l'exécution 30s après de la seconde partie (que tu places dans une 2ème macro) via OnTime
    2ème/ Tu traites les données exportées.

    En code littérale (non testé) ça donnerait un truc comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Macro1()
      'Manipulation de SAP
      '... Code
     
      'Programmation déclenchement Macro2
      Application.OnTime Date + 30s, "Macro2"
    End sub
     
    Sub Macro2()
      'Manipulation du Fichier Export
      'Code...
    End Sub
    ça n'est pas une solution que je qualifierais d'élégante mais elle permettra peut-être de mieux définir le 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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Batch] Recherche professionnel dans l'utilisation de script batch
    Par shindenryu dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 06/06/2020, 14h54
  2. [XL-2016] Script SAP GUI dans une Macro VBA
    Par gab005 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 03/04/2019, 10h24
  3. Réponses: 2
    Dernier message: 26/04/2011, 16h58
  4. Erreur 1004 quand macro utilisée depuis un autre classeur
    Par Patdeniraud dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 18/09/2010, 14h57
  5. Réponses: 1
    Dernier message: 06/05/2008, 10h10

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