Bonjour,
Je viens vous demander votre aide.
Serait ce possible d'automatiser l'exportation de donnée d'une liste spool vers Excel directement avec la mise en forme souhaité ?
D'avance merci.
Bonjour,
Je viens vous demander votre aide.
Serait ce possible d'automatiser l'exportation de donnée d'une liste spool vers Excel directement avec la mise en forme souhaité ?
D'avance merci.
Bonjour,
Oui, c'est possible, mais pas simple...
La "grille" du spool n'est pas vraiment une grille, mais une série d'étiquettes (Label).
Il faut donc trouver la colonne des noms de rapports par rapport au titre de colonnes.
Dans mon cas, on retrouve le mot Intitulé en français ou Title en anglais
Je me suis fait une petite fonction pour la trouver
Pour l'appeler
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 Function GetLabelNumber(Session As Object) As Integer Dim I As Long Dim sapGui As Object ' SAPFEWSELib.GuiApplication Dim sapCon As Object ' SAPFEWSELib.GuiConnection Dim sapSession As Object ' SAPFEWSELib.GuiSession Dim sapUsr As Object ' SAPFEWSELib.GuiUserArea Dim ChildCount As Long Dim Tablo Dim Ligne As Long Set sapGui = GetObject("sapgui").GetScriptingEngine Set sapCon = sapGui.Children(0) Set sapSession = sapCon.Children(0) With Session Set sapUsr = .FindById("wnd[0]/usr") sapUsr.VerticalScrollbar.Position = 0 'Positionne le scrollbar en haut ChildCount = sapUsr.Children.Count 'Nombre d'items For I = 0 To ChildCount 'Recherche le titre de la colonne des noms de rapports If InStr(1, sapUsr.Children(I).Text, "Intitulé") > 0 Or InStr(1, sapUsr.Children(I).Text, "Title") > 0 Then Tablo = Split(sapUsr.Children(I).ID, "[") Tablo = Split(Tablo(UBound(Tablo)), ",") Ligne = Tablo(0) GetLabelNumber = Ligne Exit Function End If Next End With End Function
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 'code de connexion avec les dates et ce qu'il faut................. lblNum = GetLabelNumber(Session) If lblNum = 0 Then MsgBox "Impossible de trouver la colonne des rapports", vbExclamation, "Erreur SAP" Exit Sub End If For I = 3 To 50 'Changer au besoin If Not Sortir Then If Not Session.FindById("wnd[0]/usr/lbl[" & lblNum & "," & I + 1 & "]") Is Nothing And Sortir = False Then If Sortir Then Sortir = False: Exit For If Session.FindById("wnd[0]/usr/lbl[" & lblNum & "," & I + 1 & "]").Text = "Nom du rapport qu'on recherche" Then If Sortir Then Exit For Session.FindById("wnd[0]/usr/lbl[" & lblNum & "," & I + 1 & "]").SetFocus Session.FindById("wnd[0]/usr/lbl[" & lblNum & "," & I + 1 & "]").caretPosition = 5 Session.FindById("wnd[0]/tbar[1]/btn[6]").press 'lunettes Session.FindById("wnd[0]/tbar[1]/btn[48]").press 'bouton Enregistrer Session.FindById("wnd[1]/tbar[0]/btn[0]").press Session.FindById("wnd[1]/usr/ctxtDY_PATH").Text = Chemin 'inscrit le chemin Fichier = "Nom du fichier.txt" Session.FindById("wnd[1]/usr/ctxtDY_FILENAME").Text = Fichier 'inscrit le nom du fichier Session.FindById("wnd[1]/tbar[0]/btn[0]").press 'enregistre Session.FindById("wnd[0]/tbar[0]/btn[3]").press 'retour à la liste End If End If Else Sortir = False Exit For End If Next
MPi²
J'essaye de comprendre le code mais j'avance pas beaucoup pourrais tu m'expliquer rapidement ce que que tu fais ?
Après avoir atteint la page du spool, je recherche la colonne qui contient les noms de rapports.
Ma fonction me retourne le numéro de colonne que j'utilise dans mon code (variable LblNum) et je l'utilise dans ma boucle.
ex: Session.FindById("wnd[0]/usr/lbl[" & lblNum & "," & I + 1 & "]").SetFocus
Ensuite, je boucle toutes les lignes pour rechercher celui ou ceux qui m'intéressent.
Je leur donne le focus, les ouvre (icône lunettes) et les sauvegarde dans un répertoire.
Finalement (pas dans ce code), je les récupère et copie ce que j'ai besoin.
Qu'est-ce que tu ne comprends pas ? Où bloques-tu ?
MPi²
Le principe je l'ai compris mais ce que je comprend pas c'est la facon dont tu le fais la partie avec le tableau je ne comprend pas ce que tu fais.
Et la première partie du code de connexion jusqu'au code commenté également.
Il faudrait que tu sois plus précis dans ce que tu ne comprends pas...
MPi²
La déclaration de tes variables je n'ai aucun soucis. Le probleme commence dans le with, je ne comprend plus ce que fais ton code.
Et dans la deuxième partie
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 With Session Set sapUsr = .FindById("wnd[0]/usr") sapUsr.VerticalScrollbar.Position = 0 'Positionne le scrollbar en haut ChildCount = sapUsr.Children.Count 'Nombre d'items For I = 0 To ChildCount 'Recherche le titre de la colonne des noms de rapports If InStr(1, sapUsr.Children(I).Text, "Intitulé") > 0 Or InStr(1, sapUsr.Children(I).Text, "Title") > 0 Then Tablo = Split(sapUsr.Children(I).ID, "[") Tablo = Split(Tablo(UBound(Tablo)), ",") Ligne = Tablo(0) GetLabelNumber = Ligne Exit Function End If Next End With
Tout ce code je ne comprend pas non plus son fonctionnement.
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 lblNum = GetLabelNumber(Session) If lblNum = 0 Then MsgBox "Impossible de trouver la colonne des rapports", vbExclamation, "Erreur SAP" Exit Sub End If For I = 3 To 50 'Changer au besoin If Not Sortir Then If Not Session.FindById("wnd[0]/usr/lbl[" & lblNum & "," & I + 1 & "]") Is Nothing And Sortir = False Then If Sortir Then Sortir = False: Exit For If Session.FindById("wnd[0]/usr/lbl[" & lblNum & "," & I + 1 & "]").Text = "Nom du rapport qu'on recherche" Then If Sortir Then Exit For Session.FindById("wnd[0]/usr/lbl[" & lblNum & "," & I + 1 & "]").SetFocus Session.FindById("wnd[0]/usr/lbl[" & lblNum & "," & I + 1 & "]").caretPosition = 5
Comme expliqué, la page est une série de Labels.
Pour savoir comment boucler ces Labels, je dois trouver son Index de colonne.
C'est ce que je fais dans la 1e section que tu as mise.
Cette ligne me donne le nombre d'étiquettes (Labels) dans la page
Ensuite je boucle jusqu'à trouver la colonne qui contient le titre des rapports, dans mon cas: "Intitulé ou nom de l'ordre de spool"
Code : Sélectionner tout - Visualiser dans une fenêtre à part ChildCount = sapUsr.Children.Count
Quand je l'ai trouvée, je lis son adresse: sapUsr.Children(I).ID
Cette adresse me retourne cette valeur: "/app/con[0]/ses[0]/wnd[0]/usr/lbl[87,2]"
Étonnement, la colonne est le premier chiffre de l'adresse, ici 87,2
Pour trouver le 87 (l'index de colonne), j'utilise 2 Split et ma fonction me retourne le nombre dans l'autre procédure: lblNum = GetLabelNumber(Session)
Dans la 2e section de code, je boucle la série de rapports sur 50 lignes (ça peut être modifié) en vérifiant que le Label existe bien
Si trouvé, je le sélectionne, clique la lunette pour afficher le rapport et le sauvegarde,...
Code : Sélectionner tout - Visualiser dans une fenêtre à part If Not Session.FindById("wnd[0]/usr/lbl[" & lblNum & "," & I + 1 & "]") Is Nothing
Est-ce plus clair?
MPi²
C'est un peu plus clair, mais c'est toujours flou dans ma tête. Je suis désolé tu dois t'arracher les cheveux.
Difficile de t'aider sans savoir exactement ce qui n'est pas clair...
MPi²
Ducoup je met le code pour arrivé jusqu'a la page du job soit celle là:
Ensuite il faut que lance ton code ? où il faut que je me déplace jusqu'au fichier que je veux.
Dans un premier temps sélectionner echeance_MO_VEH
Puis la ligne AQCSONL....
Puis sélectionner l'affichage des données.
Ce que j'ai pas compris c'est comment faire sa avec ton code. Tu as des parties demandant de rentrer des intitulés mais je vois pas à quoi cela correspond.
Ça ne se passe pas comme ça de mon côté...
J'arrive sur le 3e écran du 1er coup.
Mais ce que je t'ai donné comme code ici
ce serait pour ton 3e écran pour trouver la colonne Intitulé
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 With Session Set sapUsr = .FindById("wnd[0]/usr") sapUsr.VerticalScrollbar.Position = 0 'Positionne le scrollbar en haut ChildCount = sapUsr.Children.Count 'Nombre d'items For I = 0 To ChildCount 'Recherche le titre de la colonne des noms de rapports If InStr(1, sapUsr.Children(I).Text, "Intitulé") > 0 Or InStr(1, sapUsr.Children(I).Text, "Title") > 0 Then Tablo = Split(sapUsr.Children(I).ID, "[") Tablo = Split(Tablo(UBound(Tablo)), ",") Ligne = Tablo(0) GetLabelNumber = Ligne Exit Function End If Next End With
Donc, dans ton cas, je pense, il faudrait que tu trouves l'entête nommé "Nom job"
Et tu boucles jusqu'à trouver "ECHEANCES_MO_VEH"
De là, tu double-cliques ou cliques un bouton (?) pour te rendre au 2e écran et tu refais le même processus pour trouver l'entête "Programme / commande", etc...
MPi²
J'aurais pu ajouter...
Comme tu as 3 fenêtres à parcourir, tu pourrais ajouter un paramètre à la fonction GetLabelNumber
Tu l'appelerais donc 3 fois
Par exemple, tu lui passes un numérique
Et dans la Function, tu vérifies ce numéro
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Num = 1 lblNum = GetLabelNumber(Session, Num)
Dans le code principal, tu agis donc en 3 sections.
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 Function GetLabelNumber(Session As Object, Num As Integer) As Integer Dim I As Long Dim sapGui As Object ' SAPFEWSELib.GuiApplication Dim sapCon As Object ' SAPFEWSELib.GuiConnection Dim sapSession As Object ' SAPFEWSELib.GuiSession Dim sapUsr As Object ' SAPFEWSELib.GuiUserArea Dim ChildCount As Long Dim Tablo Dim Ligne As Long Set sapGui = GetObject("sapgui").GetScriptingEngine Set sapCon = sapGui.Children(0) Set sapSession = sapCon.Children(0) With Session Set sapUsr = .FindById("wnd[0]/usr") sapUsr.VerticalScrollbar.Position = 0 'Positionne le scrollbar en haut ChildCount = sapUsr.Children.Count 'Nombre d'items If Num = 1 then For I = 0 To ChildCount 'Recherche le titre de la colonne des noms de rapports If InStr(1, sapUsr.Children(I).Text, "Nom job") > 0 Then Tablo = Split(sapUsr.Children(I).ID, "[") Tablo = Split(Tablo(UBound(Tablo)), ",") Ligne = Tablo(0) GetLabelNumber = Ligne Exit Function End If Next ElseIf Num = 2 then For I = 0 To ChildCount 'Recherche le titre de la colonne des noms de rapports If InStr(1, sapUsr.Children(I).Text, "Programme / commande") > 0 Then Tablo = Split(sapUsr.Children(I).ID, "[") Tablo = Split(Tablo(UBound(Tablo)), ",") Ligne = Tablo(0) GetLabelNumber = Ligne Exit Function End If Next Else For I = 0 To ChildCount 'Recherche le titre de la colonne des noms de rapports If InStr(1, sapUsr.Children(I).Text, "Intitulé") > 0 Then Tablo = Split(sapUsr.Children(I).ID, "[") Tablo = Split(Tablo(UBound(Tablo)), ",") Ligne = Tablo(0) GetLabelNumber = Ligne Exit Function End If Next End If End With End Function
La recherche du 1er rapport, quand trouvé tu vas sur la 2e fenêtre
Recherche du rapport de cette fenêtre et tu vas dans la 3e fenêtre
Recherche du 3e rapport et tu l'ouvres pour traitement
MPi²
Dans les boucles je vois bien qu'il recherche le nom de chaque colonne mais je vois pas d'instruction lui disant qu'arriver à la ligne "xxx" il l'a selectionne et y accède.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 For I = 3 To 50 'Changer au besoin If Not Sortir Then If Not Session.FindById("wnd[0]/usr/lbl[" & lblNum & "," & I + 1 & "]") Is Nothing And Sortir = False Then If Sortir Then Sortir = False: Exit For If Session.FindById("wnd[0]/usr/lbl[" & lblNum & "," & I + 1 & "]").Text = "Nom du rapport qu'on recherche" Then If Sortir Then Exit For Session.FindById("wnd[0]/usr/lbl[" & lblNum & "," & I + 1 & "]").SetFocus Session.FindById("wnd[0]/usr/lbl[" & lblNum & "," & I + 1 & "]").caretPosition = 5
MPi²
Ducoup il faut que je fasse 3 boucles comme ceci si je comprend bien :
Mais dans les deux premieres il faudra en mettre moin que ce que j'ai deja.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 If Session.FindById("wnd[0]/usr/lbl[" & lblNum & "," & I + 1 & "]").Text = "Nom du rapport qu'on recherche" Then
Exact, un peu comme je disais au message #13
Je n'ai jamais vu ce genre de spool en plusieurs parties.
Peut-être parce que j'entre un nom de spool (Suffix2) qui me permet de me rendre directement aux rapports que je veux voir (?)
MPi²
Voici mes 3 conditions :
Sa te semble correct ?
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 If Session.FindById("wnd[0]/usr/lbl[" & lblNum & "," & I + 1 & "]").Text = "ECHEANCES_MO_VEH" Then If Sortir Then Exit For session.findById("wnd[0]/usr/chk[1,13]").setFocus session.findById("wnd[0]/tbar[1]/btn[44]").press End If End If If Session.FindById("wnd[0]/usr/lbl[" & lblNum & "," & I + 1 & "]").Text = "AQCSONL_BESOIN==Z_BESOINS=====" Then If Sortir Then Exit For session.findById("wnd[0]/usr/lbl[4,3]").setFocus session.findById("wnd[0]/usr/lbl[4,3]").caretPosition = 4 session.findById("wnd[0]/tbar[1]/btn[34]").press End If End If If Session.FindById("wnd[0]/usr/lbl[" & lblNum & "," & I + 1 & "]").Text = "LIST1S LOCL AQCSONL_BESO" Then If Sortir Then Exit For Session.FindById("wnd[0]/usr/lbl[" & lblNum & "," & I + 1 & "]").SetFocus Session.FindById("wnd[0]/usr/lbl[" & lblNum & "," & I + 1 & "]").caretPosition = 5 Session.FindById("wnd[0]/tbar[1]/btn[6]").press 'lunettes Session.FindById("wnd[0]/tbar[1]/btn[48]").press 'bouton Enregistrer Session.FindById("wnd[1]/tbar[0]/btn[0]").press Session.FindById("wnd[1]/usr/ctxtDY_PATH").Text = Chemin 'inscrit le chemin Fichier = "Nom du fichier.txt" Session.FindById("wnd[1]/usr/ctxtDY_FILENAME").Text = Fichier 'inscrit le nom du fichier Session.FindById("wnd[1]/tbar[0]/btn[0]").press 'enregistre Session.FindById("wnd[0]/tbar[0]/btn[3]").press 'retour à la liste End If End If
Met le code VBS que tu as en enregistrant la macro dans SAP, juste la partie à partir du moment que tu es rendu sur la 1ere page.
MPi²
Quand j'essaie d'extraitre le spool en fichier texte via un script il me refuse l'accès il me semble.
Est ce bien ça ?
EDIT : c'est bon le problème est résolu
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager