Coller le presse papier dans une cellule

Voila le code. Tout fonctionne pour le mieux quand tout les articles sont créés dans la nomenclature. Quand j'insère un article non créé tout se décale. Forcément je n'ai pas mis de consigne dans THEN.

'Séléction des cellules en boucle

            i = 1

        Do While Cells(i, 3) <> ""
            i = i + 1
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
            SendKeys "^!", True 'Selection du champ n° article (8 caractères)
            SendKeys "^c", True 'Copie du champ numéro article de JDE

'Vérification du contenu du presse papier
            On Error GoTo NotText
            MyData.GetFromClipboard 'Recherche du presse papier.
            N_Article = MyData.GetText(1)

        If N_Article <> "I" Then
            Cells(i, 2).Value = "1" 'Presse papier vide = article à créer
        Else
            Cells(i, 2).Value = "" 'Presse papier non vide = article déjà créé
            SendKeys "+{TAB}", True 'Remise en position sur le premier caractère code d'action
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "+{TAB}", True 'Mise en position N° Article
            SendKeys "^s", True 'Suppression N°Article
            SendKeys "{TAB}", True 'Remise en position code d'action
            SendKeys "i", True
        End If

NotText:
        If Err <> 0 Then 'Permet l'arrêt de la boucle sans erreurs
            Cells(i, 2).Value = "1"
        Else
            Cells(i, 2).Value = "" 'Presse papier non vide = article déjà créé
            SendKeys "+{TAB}", True 'Remise en position sur le premier caractère code d'action
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "+{TAB}", True 'Mise en position N° Article
            SendKeys "^s", True 'Suppression N°Article
            SendKeys "{TAB}", True 'Remise en position code d'action
            SendKeys "i", True
        End If

End If
Loop

Par contre avec ce code ci, quand le champ THEN est complété et que dans la nomenclature tout les codes sont déjà créé (donc même condition que le code précédent) c'est du grand n'importe quoi. Ca me met des "1" dans chaque cellule alors que l'article est créé, puis sa me les enlève, ca passe une autre cellule, ca met un 1, me l'enlève et ainsi de suite. J'ai l'impression que les conditions IF rentre en conflit.

'Vérification du contenu du presse papier
            On Error GoTo NotText
            MyData.GetFromClipboard 'Recherche du presse papier.
            N_Article = MyData.GetText(1)

        If N_Article <> "I" Then
            Cells(i, 2).Value = "1" 'Presse papier vide = article à créer
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "^s", True
            SendKeys "+{TAB}", True
            SendKeys "i", True
        Else
            Cells(i, 2).Value = "" 'Presse papier non vide = article déjà créé
            SendKeys "+{TAB}", True 'Remise en position sur le premier caractère code d'action
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "+{TAB}", True 'Mise en position N° Article
            SendKeys "^s", True 'Suppression N°Article
            SendKeys "{TAB}", True 'Remise en position code d'action
            SendKeys "i", True
        End If

NotText:
        If Err <> 0 Then 'Permet l'arrêt de la boucle sans erreurs
            Cells(i, 2).Value = "1" 'Presse papier vide = article à créer
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "^s", True
            SendKeys "+{TAB}", True
            SendKeys "i", True
        Else
            Cells(i, 2).Value = "" 'Presse papier non vide = article déjà créé
            SendKeys "+{TAB}", True 'Remise en position sur le premier caractère code d'action
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "+{TAB}", True 'Mise en position N° Article
            SendKeys "^s", True 'Suppression N°Article
            SendKeys "{TAB}", True 'Remise en position code d'action
            SendKeys "i", True
        End If

End If
Loop

Ca commence à m'énerver cette histoire de presse papier

Bonjour Azertym le forum,

bon alors dans ta boucle do while le i=i+1 il doit être à la dernière ligne juste avant le loop et pas ou tu l'as mis,

car tu vérifies Cell(i,2)<>"" et juste derrrière tu incrémentes le i de 1 comment veux tu ne pas avoir de décalage!!!

a+

Papou

Salut Paritec !

C'est marrant parce que le code fonctionne très bien aussi dans le cas ou je met je "i = i+1" à la fin de la boucle.

Quand je parlais du décalage c'est quand dans la nomenclature il y'a un code article qui n'est pas créé. Le décalage ce fait dans JDE car le curseur de sélection ne revient pas ou il devrait.

Donc pour résoudre ce problème je souhaiterai donc faire "Si le presse papier contient I alors ..... Sinon ......"

Le problème c'est que j'ai l'impression que le presse papier est limité a ce niveau. Je pense que l'on peu juste lui demander si presse papier <> "" alors ...... sinon .... On ne peut lui demander d'analyser un caractère. Après plusieurs essais et exemples sur le net je n'ai jamais vu " presse papier <> "exemple" then " Ce n'est que mon avis après je suis peut être passé a coté de quelque chose.

Bonjour Azertym le forum

Pour l'incrémentation je te certifie que c'est bien en bas qu'il faut le mettre, il faut bien traiter la première valeur I non ??

pour le reste le problème majeur est que l'on a pas le dossier pour faire les tests, si on l'avait, tu aurais déjà eu ta réponse depuis longtemps.

Maintenant pour le presse papier, je ne vois pas pourquoi tu ne pourrais pas le comparer à la valeur 1, même si tu dois passer par une copie du presse papier dans une variable ou cellule, après tu compares et en fonction du résultat tu traites ou non

a+

papou

Bonjour Paritec,

Je veux bien vous passer le fichier mais le soucis c'est que je ne sais pas si vous pourrez le tester puisque qu'il vous faut TN5250J (bon bien sur il est en téléchargement libre sur : https://sourceforge.net/projects/tn5250j/files/

Je vous met les fichiers si vous êtes intéressé par ce problème :

Il y'a le fichier Nomenclature_JDE.xls qui contient la nomenclature (ici modifié pour effectuer les tests) Le code article 31707720 est un article qui n'existe pas. JDE doit donc mettre un 1 a coté de celui ci. Le reste existe.

Ensuite il y'a un fichier .bat qui permet l’exécution de TN5250J. il vous faudra donc changer le chemin de ce fichier dans la macro.

Autre point, au lancement du fichier excel vous allez avoir une erreur, c'est normal puisque vous ne disposez pas de pro engineer, mais vous pouvez tester quand même la macro car une nomenclature est déjà présente dans le fichier.

En ce qui concerne ta remarque Paritec je suis d'accord avec toi, et c'est pour cela que je viens vers vous car je ne comprends pas pourquoi ca ne veut pas fonctionner.

En tout cas je te remercie beaucoup de vouloir m'aider .

P.S: La macro est dans le bouton OK du Userform 1 qui se trouve dans xlsTOjde.

33tn5250j.zip (217.00 Octets)

Bon j'ai réussi a trouver d’où vient le problème, mais je n'arrive pas à le résoudre, après moult et moult essai j'en ai déduis que la boucle IF du presse papier ne s'effectuait pas.

Mon code actuel est donc celui ci :

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

Je reviens vers vous, pour vous dire que le problème est résolu, ce n'est pas ma boucle if qui pose problème mais bel et bien mes sendkeys. Un très gros conflit s'opère au niveau des sendkeys :

En tout cas merci beaucoup pour avoir essayé de m'aider. J'aurai appris certaine chose en vb quand même tout n'est pas perdu.

Rechercher des sujets similaires à "coller presse papier"