Traiter les données du presse papier dans excel

Résolu
azertym Messages postés 47 Date d'inscription vendredi 8 août 2003 Statut Membre Dernière intervention 7 décembre 2014 - 16 févr. 2012 à 14:43
azertym Messages postés 47 Date d'inscription vendredi 8 août 2003 Statut Membre Dernière intervention 7 décembre 2014 - 17 févr. 2012 à 10:49
Bonjour tout le monde !

Je suis actuellement entrain de travailler sur une macro qui boucle un copier coller entre TN5250J et excel.
J'utilise ce code ci pour faire l'opération :
Private Sub OK_Click()


'===============================================================================================
'Déclaration des variables
'===============================================================================================

'Login
Dim Utilisateur As String
Dim MotDePasse As String

Utilisateur = User.Text
MotDePasse = Mdp.Text

'Paramétrage du presse papier
Dim MyData As DataObject
Set MyData = New DataObject
Dim N_Article As String

'Incrémentation de la nomenclature excel
Dim i As Integer

'===============================================================================================
'Authentification TN52/JDE
'If Utilisateur "user" And MotDePasse = "mdp" Then
        
            Unload Me 'Fermeture de la fenêtre login (UserForm1)
         
            Shell ("Y:\base\Fichiers Macro\TN5250J.bat") 'Lancement de TN5250j
            Application.Wait (Now + TimeValue("0:00:06")) 'Temps de pause 6s
            
            UsrCMD = "" & User & "{TAB}" 'Rappel de la saisie User
            SendKeys UsrCMD 'Importer la saisie dans JDE
            Application.Wait (Now + TimeValue("0:00:02")) 'Temps de pause 2s
            
            PassCMD = "" & Mdp & "{ENTER}" 'Rappel de la saisie Password
            SendKeys PassCMD 'Importer la saisie dans JDE
            Application.Wait (Now + TimeValue("0:00:02")) 'Temps de pause 2s
        
        Else
            Exit Sub
        End If

'===============================================================================================
'Interrogation articles
'===============================================================================================

            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 02s
            SendKeys ("1"), True 'Article
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "{ENTER}", True
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys ("2"), True 'Fiche article
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "{ENTER}", True
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "i", True 'Interrogation
            
    'Séléction des cellules en boucle

            i = 1
       
        Do While Cells(i, 3) <> ""

If Cells(i, 3) > 30999999 And Cells(i, 3) < 32000000 Then
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            Cells(i, 3).Copy 'Copie la cellule d'excel dans le presse papier
            SendKeys "^v", True 'Colle la cellule dans le champ code produit de JDE
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "{ENTER}", True
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "^!", True 'Selection du champ code d'action
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "^c", True 'Copie de la lettre code d'action
            SendKeys "+{TAB}", True 'Remise en position sur le champ code action
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            Range("A1").Select
            Range("A1").
            

'Analyse du presse papier
            On Error GoTo NotText
            MyData.GetFromClipboard 'Recherche du presse papier.
            N_Article = MyData.GetText(1)
            
        If N_Article = "3" Then
            Cells(i, 2).Value = ""
            SendKeys "+{TAB}", True
            SendKeys "^s", True
            SendKeys "{TAB}", True
            SendKeys "{TAB}", True
        Else
            Cells(i, 2).Value "1" 'Presse papier non vide article déjà créé
        End If

NotText:
        If Err <> 0 Then 'Permet l'arrêt de la boucle sans erreurs
            MsgBox "Il n y'a rien dans le presse papier"
        End If
        
End If

i = i + 1
Loop
End Sub


Je souhaiterai que la macro analyse le presse papier afin qu'il en déduise si oui ou non il doit mettre un "1" dans excel.

J'explique plus en détail:
Excel contient une nomenclature, dans cette nomenclature il y'a des codes articles qui correspondent à des articles (un peu logique ^^). Sauf que dans certaines nomenclatures il y'a des articles qu'il faut créer (car ils n’existent pas dans la base de Tn5250j/JDE. Pour ca il faut les retrouver dans la nomenclatures et pour les retrouver il faut copier le code article dans JDE. Si JDE ne le retrouve pas c'est qu'il faut le créer.

Donc la macro fait :
Une copie du code article de la première cellule des 31000000. Colle le code dans JDE et appuie sur "entrer".
Si le code existe le curseur de JDE revient sur le I, une sélection est faite (shift+droite), copie la sélection. Si la copie est un I alors c'est que l'article est créé, excel passe directement a la cellule suivante.
Si le code n'existe pas, le curseur reste sur le code article, une sélection est faite, et va donc sélectionner autre chose que I (un 3 plus exactement). Dans ce cas Excel met un 1 a coté du code article et passe a la cellule suivante.

Le problème c'est que dans ma macro, je n'ai pas l'impression qu'il arrive a lire dans le presse papier. Pourtant quand je met un msgbox après la sélection j'ai bien un I de copié. elle devrait donc me faire ma boucle IF N_article = "I" then. Mais non elle fait uniquement le début de ma boucle (celle qui se trouve avant 'analyse du presse papier).

Savez vous ce qui pose problème ?

Je vous remercie d'avance !

14 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 févr. 2012 à 10:14
Je ne sais pas comment tu t'es "débrouillé" pour avoir ton résultat, à un moment, avec Win 7, sans désactiver l'UAC.
Pour autant que je le sache personnellement : sous WIN 7 et sans désactiver l'UAC === >> le sendkeys ne peut d'adresser à autre chose que le programme en cours (celui qui contient la commande SendKeys).
Mais bon ... N'en parlons plus


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 févr. 2012 à 10:42
Tapez le texte de l'url ici.
Lis (la lecture de la toute première phrase sera suffisante).

___________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
3
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
16 févr. 2012 à 15:33
Salut,

va voir la source de PCPT : PRESSE-PAPIER-TEXTE-VBA-MODULE-CLASSE

A+
0
azertym Messages postés 47 Date d'inscription vendredi 8 août 2003 Statut Membre Dernière intervention 7 décembre 2014
16 févr. 2012 à 16:44
Salut Bigfish,

J'ai essayé plusieurs façon d'utiliser les sources de PCPT mais je n'arrive pas a modifier son code de tel sorte a ne plus utiliser de userform et que l'opération ce fasse automatiquement sans aucune manipulation de l'utilisateur. Sinon c'est vrai que ce code m'a l'air d'être plus intéressant que ma méthode. Il suffit juste que je trouve comment le moyen de l'intégrer dans ma macro.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 févr. 2012 à 17:22
Bonjour,
Quelle que soit la méthode d'utilisation du presse-papier, le problème sera à mon avis le même.
Traiter ainsi à grand renforts de sendkeys, n'est pas très heureux. A destination, en plus et apparemment, de ce qui n'a plus le focus, ne serait-ce que du fait de ton :
Range("A1").Select

Par ailleurs (mais accessoire) : curieuse manière de forcer à une gestion d'erreur pour déterminer que le presse-papier est vide ! Alors qu'il suffit d'une expression conditionnelle sur le contenu de N_Article.
Et en plus, ton code n'entrera jamais en gestion ds'erreur puisque si presse_papier vide ==>> tu rentres en clause else de ton Select Case !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
16 févr. 2012 à 17:32
pourquoi ne pas utiliser file transfert (Alt-T) de ton TN5250J pour exporter ver excel puis ne travailler que depuis excel ???

A+
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 févr. 2012 à 17:46
Si j'ai bien raison dans ce que je t'ai dit plus haut :
tu dois te retrouver probablement avec une jolie colonne B remplie de petits "1"
Et tu ne nous en parles pas ! Pas un mot à ce propos !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
azertym Messages postés 47 Date d'inscription vendredi 8 août 2003 Statut Membre Dernière intervention 7 décembre 2014
16 févr. 2012 à 19:15
WOUUUh piiines !! Je viens de voir que c'est pas le bon code que je vous ai copié --' Le range A1. select n'a rien a faire là !!!! A force de faire des modifs et des copié collé entre toute mes versions je recopie les mauvaises !!!

Voici le "bon" code.
    'Séléction des cellules en boucle

            i = 1
       
        Do While Cells(i, 3) <> ""

If Cells(i, 3) > 30999999 And Cells(i, 3) < 32000000 Then
            Cells(i, 3).Copy 'Copie la cellule d'excel dans le presse papier
           SendKeys "^v", True 'Colle la cellule dans le champ code produit de JDE
           Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
           SendKeys "{ENTER}", True
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s 'le curseur se remet automatiquement sur code d'action
           SendKeys "^!", True 'Selection du champ code d'action
           Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
           SendKeys "^c", True 'Copie de la lettre code d'action "I"
           SendKeys "+{TAB}", True 'Revenir sur le premier caractère du code d'action
           Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
           

'Analyse du presse papier
           On Error GoTo NotText
            MyData.GetFromClipboard 'Recherche du presse papier.
           N_Article = MyData.GetText(1)
           
        If UCase(N_Article) = "I" Then            ''''''''''''''''''''''''''''''''''''''' celle ci ne se réalise pas, pourtant un I est bien copié (vu a l'aide d'un msgbox)
           Cells(i, 2).Value = ""
            SendKeys "+{TAB}", True 'remonter au N° d'article
           SendKeys "^s", True 'suppression du N° d'article
           SendKeys "{TAB}", True  'descendre au code d'action
           SendKeys "{TAB}", True 'descendre au code article et reprise de la boucle
       Else
            Cells(i, 2).Value = "1" 'Pas encore écrit
       End If

NotText:
        If Err <> 0 Then 
           MsgBox "Il n y'a rien dans le presse papier"
        End If
       
End If

i = i + 1
Loop


Et en effet ucfoutu, j'ai bien tout des 1 dans la colonne B.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 févr. 2012 à 19:59
Et en effet ucfoutu, j'ai bien tout des 1 dans la colonne B.

Pardi .
Je vais te reprocher de l'avoir tu (car très importante indication). Je regrette d'avoir eu à le deviner (comme je devine que tu n'a jamais le message "Il n'y a rien dans le presse papier" - ce que tu as également passé sous silence).
Alors ?
Bon les fautifs, maintenant : tous tes sendkeys sans jamais réellement maîtriser à quoi ils s'adressent.
puis : le conseil : changer complètement de méthode et ne pas chercher à piloter ce qui ne l'est pas à coups de sendkeys.
Je rejoins en cela l'avis de bigfish.
Ou alors : au lieu de te servir à tout prix de ce qui a déjà été écrit en Java, de le lancer via un batch, etc ...Ecris ton propre programme.
Sinon : solution donnée par Bigfish.
Toute autre approche serait du brico/bidouillage très loin de l'esprit d'un développement sérieux.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
azertym Messages postés 47 Date d'inscription vendredi 8 août 2003 Statut Membre Dernière intervention 7 décembre 2014
16 févr. 2012 à 21:31
aie aie aie ... je vais me faire taper sur les doigts . J'ai oublié de te dire aussi que je n'ai jamais eu le message presse papier vide.... (pas taper pas taper !)

Non bon plus sérieusement. Je sais que la c'est du bidouillage mais je vais vous expliquer pourquoi.
Je suis en stage en CAO/DAO dans un bureau d'étude. Avant ils utilisaient JDE avec les macros en vb directement dedans ce qui était nettement plus facile à utiliser. Maintenant qu'ils sont passés a win 7, JDE est incompatible, donc solution passer également l'AS/400 sur tn5250J. Comme TN5250J fonctionne en python (jython plus exactement), ils n'ont pas refait les macros, manques de connaissances et pas le temps de passer du temps la dessus. Du coup ils doivent faire (parfois) plus de 80 copié collé à la main afin de trouver les articles a créer. Du coup je m'occupe de ca.
N'étant pas dans la programmation et eux non plus ils m'ont dit de faire en sorte qu'ils puissent eux aussi toucher au programme en cas de problème, et comme tout le monde connait plus ou moins vb6 je suis partis sur l'idée des sendkeys même si je savais plus ou moins par avance que c'était très bancale comme système. Mais j'avoue avoir mis les pieds dans un truc qui avait l'air très sympa quand même niveau facilité mais en fait pas du tout ...

Donc maintenant ce que je vais faire c'est apprendre le python si pour cette méthode il n'ya bien entendu aucune solution plausible.

Je vais devoir tout recommencer !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 févr. 2012 à 07:25
Bon...
Et sans rigoler du tout, alors :
1)
Maintenant qu'ils sont passés a win 7,....

2)
N'étant pas dans la programmation et eux non plus ils m'ont dit de ...

3)
...je suis partis sur l'idée des sendkeys ...

Il se trouve (en plus !) que pour que Win 7 accepte et reconnaisse le Sendkeys, il faut désactiver l'UAC !
Et dire que si tu nous avais dit tout cela dès le début, on aurait pu éviter tout cet échange.
Regarde maintenant le titre donné à ta discussion :
Traiter les données du presse papier dans excel

Ton problème n'est pas celui-là du tout.
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
azertym Messages postés 47 Date d'inscription vendredi 8 août 2003 Statut Membre Dernière intervention 7 décembre 2014
17 févr. 2012 à 09:45
Excuse moi mais je suis a moitié d'accord avec toi.

La partie ou je suis d'accord :
Les sendkeys ne fonctionnent pas avec la totalités des touches (left, rifht up down, top, end, del, delete, page up, page down).

La ou je ne suis plus d'accord c'est sur le fait qu'une fois j'ai réussi a utiliser les sendkeys avec la boucle if N_Article <> "" then ... Les sendkeys fonctionnaient parfaitement. La macro se déroulait ainsi :

2) Coller le code article
3) Appuyer sur entrer
4) (le curseur revient automatiquement sur le champ code d'action), Shift+tab pour remonter sur le champs n°Article.
5) Je fais une sélection de 8 caractères
6) Je copie
7) Si le presse papier contient quelque chose alors on passe a la cellule suivante.
8) J'efface le champ numéro article
9) Tab pour redescendre au code article et y mettre un I (I correspondant a interrogation article en fait)

ca fonctionnait plus que parfaitement.
Le problème était le suivant. Quand un code n'existait pas la macro faisait :

2) Coller le code article
3) Appuyer sur entrer
4) (le curseur restait sur le champs code article, la macro se décalait a ce moment la), Shift+tab pour remonter sur le champs n°Article (a cause du décalage il remontait sur le champ code d'action).
5) Je fais une sélection de 8 caractères (décalage = selection du code d'action et aucune seleciton était puisqu'il était hors champ de texte, un seul caractère dans ce champ ci.)
6) Si le presse papier est vide (ce qui était le cas) il met un 1 dans excel, et comme tout était décalé il collait le code article suivant dans le champ code action.

C'est pour ca que j'ai voulu changer le presse papier <> "" par <> I
Comme ca si le code action est I c'est que le curseur est remontait automatiquement sur le I ce qui signifie que l'article est créé
sinon il restait sur le code article et il choppe un 3 (le premier caractère du 31000000).
Donc c'est pour cela que je pensais que ca venait du presse papier, qu'il n'arrive pas a identifier le "I".

Donc voila pourquoi je suis moyennement d'accord avec toi, même si maintenant après réflexion je pense que c'était plus de la chance qu'autre chose tout ca.

Bon je vais me mettre au python dans ce cas.

En tout cas merci beaucoup de vos aides, sans vous je chercherai encore !
0
azertym Messages postés 47 Date d'inscription vendredi 8 août 2003 Statut Membre Dernière intervention 7 décembre 2014
17 févr. 2012 à 10:24
Je te rassure Ucfoutu, si j'active une autre fenêtre que JDE c'est fini, les sendkeys s'execute dans excel ou internet ou autre logiciel dont la fenêtre est active. Mais je les avais prévenu qu'il ne fallait pas y toucher pendant l’exécution de la macro, mais c'est vrai que c'est pas sérieux comme boulot.

Bon en tout cas le sujet est clos, je vais me mettre a python !
0
azertym Messages postés 47 Date d'inscription vendredi 8 août 2003 Statut Membre Dernière intervention 7 décembre 2014
17 févr. 2012 à 10:49
C'est ce genre de dite que j'aurai voulu trouver avant de commencer, j'ai fais plein de recherches avant de me lancer ainsi .

En tout cas la prochaine fois je saurais sur quel forum venir ! Un forum très sympa !

Ceci dit on risque de se revoir très bientôt dans la section Python .

Merci encore à toi ucfoutu, au moins je n'aurai pas tout perdu, j'aurai quand même l'architecture du programme et je sais maintenant que les sendkeys et win 7 (et en général) c'est complètement ingérable.
0
Rejoignez-nous