Coller le presse papier dans une cellule

Bonjour a tous,

Je cherche à coller dans une cellule un numéro que j'ai copié dans un autre logiciel de façon automatique.

J'ai donc utilisé ceci :

Sub ColleDansA1()

Dim Presspp As New DataObject

Presspp.GetFromClipboard

Range("A1") = Presspp.GetText

End Sub

Le problème c'est qu'il ne me colle pas le deuxième élément que j'ai copié mais le premier.

Je cherche juste à faire un Ctrl+C d'un logiciel en Java (cette fonction fonctionne)

et la coller dans la cellule L6 par exemple d'excel.

Quelqu'un peut-il m'aider ?

Merci.

Bonjour Azertym le forum

utilises le sendkeys et cela ira tout seul

a+

papou

Merci Papou ! Je connais les sendkeys puisque toute ma macro est faite ainsi ^^.

Le soucis (et j'en suis pas fier) c'est que je n'arrive pas a rendre active une cellule pour effectuer le ctrl+v ...

Bonjour Azertym le forum

range("L6").select

a+

Papou

C'est bon Papou, j'ai réussi a trouvé une solution qui est peut être un peu plus "ordonné".

J'ai joué avec le presse papier de windows avec ce code ci :

'Parametrage du presse papier
Dim MyData As DataObject
Set MyData = New DataObject
Dim N_Article As String

        On Error GoTo NotText
            MyData.GetFromClipboard 'Recherche du pressepapier.

            N_Article = MyData.GetText(1)

            If N_Article <> 0 Then 'analyse du presse papier
            Range("B2").Value = "1"
            Else
            Range("B2").Value = "0"
        End If
NotText:
        If Err <> 0 Then
            Range("B2").Value = "1"
            Else
            Range("B2").Value = "0"
        End If

En tout cas je te remercie de ton aide !

Maintenant il faut que j'essaie de boucler tout ca :s. de passer d'une cellule a l'autre.

En fait, j'ai du mal concernant le bouclage de tout ce code :

 Range("C2").Select  'Selection du code JDE dans excel
            Selection.Copy 'Copie la cellule dans presse papier
            SendKeys "^v", True 'Colle la cellule dans le presse papier
            SendKeys "{ENTER}", True
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "{RIGHT}", True
            Application.Wait (Now + TimeValue("0:00:01"))
            SendKeys "+{TAB}", True
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "+!", True 'Selection du champs numéro article
            SendKeys "+!", True
            SendKeys "+!", True
            SendKeys "+!", True
            SendKeys "+!", True
            SendKeys "+!", True
            SendKeys "+!", True
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "^c", True 'copie du champs numéro article
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s

            On Error GoTo NotText
            MyData.GetFromClipboard 'Recherche du pressepapier.

            N_Article = MyData.GetText(1)

            If N_Article <> 0 Then 'analyse du presse papier
            Range("B2").Value = "1"
            Else
            Range("B2").Value = "0"
        End If
NotText:
        If Err <> 0 Then
            Range("B2").Value = "1"
            Else
            Range("B2").Value = "0"
        End If
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s

Il faudrait que j'arrive a incrémenter la copie de C2 vers C3, C4, C5 etc et que la partie du presse papier suivent ces cellules :s La je suis perdu...

Re azertym le forum

tu peux nous traduire STP

Il faudrait que j'arrive a incrémenter la copie de C2 vers C3, C4, C5 etc et que la partie du presse papier suivent ces cellules :s La je suis perdu...

a+

papou

J'avoue que ce n'est pas très compréhensible. J'explique :

Premièrement excel va chercher la deuxième cellule de la colonne C (C2). Il va copier la valeur de la cellule dans JDE (via un Ctrl+v). Une fois ce code collé, JDE va afficher une fiche produit. Sur cette fiche produit il y'a un champ "N_Article". Ce champ est copié par excel, si ce champ est vide alors c'est que l'article doit être créer, Excel met donc un 1 en B2, puis il passe a la cellule C3. Si le champ est remplit c'est que l'article est déjà créé, il n y'a donc rien a faire il passe directement en C3.

Schématiquement :

Copie de C2 vers JDE

SI copie de "N_Article" vide alors mettre un 1 en B2 et passer en cellule B3

Sinon ne rien mettre et passer directement en B3

Copie de C3 vers JDE

SI copie de "N_Article" vide alors mettre un 1 en B3 et passer en cellule B4

Sinon ne rien mettre et passer directement en B4

Et ainsi de suite jusqu’à ce qu'une ligne de la colonne C soit vide. A ce moment il arrête la boucle.

C'est peut être un peu plus claire comme ca

re bonjour azertym le forum,

bon alors si j'ai compris ce que tu veux testes le code modifié ci-dessous

a+

papou

 i=2   
do while Cells(i,3) <>""
Cells(i,3).Copy 'Copie la cellule dans presse papier
               SendKeys "^v", True 'Colle la cellule dans le presse papier
               SendKeys "{ENTER}", True
                Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
               SendKeys "{RIGHT}", True
                Application.Wait (Now + TimeValue("0:00:01"))
                SendKeys "+{TAB}", True
                Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
               SendKeys "+!", True 'Selection du champs numéro article
               SendKeys "+!", True
                SendKeys "+!", True
                SendKeys "+!", True
                SendKeys "+!", True
                SendKeys "+!", True
                SendKeys "+!", True
                Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
               SendKeys "^c", True 'copie du champs numéro article
               Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s                 
                On Error GoTo NotText
                MyData.GetFromClipboard 'Recherche du pressepapier.         
                N_Article = MyData.GetText(1)               
                If N_Article <> 0 Then 'analyse du presse papier
               Cells(i,2).Value = "1"
                Else
                Cells(i,2).Value = "0"
            End If
    NotText:
            If Err <> 0 Then
                Cells(i,2).Value = "1"
                Else
                Cells(i,2).Value = "0"
            End If
                Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
loop

Salut Panitec !

C'est nickel ta boucle fonctionne le soucis c'est qu'elle "n'incrémente" pas les cellules, j'ai essayé avec :

          
        Do
              i = i + 1

        Loop While Cells(i, 3) <> ""
            Cells(i, 3).Copy 'Copie la cellule d'excel dans presse papier
            SendKeys "^v", True 'Colle la cellule dans le champs code article de JDE
            SendKeys "{ENTER}", True
            Application.Wait (Now + TimeValue("0:00:01"))
            SendKeys "+{TAB}", True
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "+!", True 'Selection du champs numéro article (8 caractères)
            SendKeys "+!", True
            SendKeys "+!", True
            SendKeys "+!", True
            SendKeys "+!", True
            SendKeys "+!", True
            SendKeys "+!", True
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "^c", True 'Copie du champs numéro article de JDE

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

        If N_Article <> 0 Then 'analyse du presse papier si PP vide
            Cells(i, 2).Value = "1"
            SendKeys "{TAB}", True 'Remise en position sur le code article
            SendKeys "{TAB}", True

        Else
            Cells(i, 2).Value = "" 'analyse du presse papier si PP non vide
            SendKeys "{TAB}", True 'Remise en position sur le code article
            SendKeys "{TAB}", True
        End If

NotText:
        If Err <> 0 Then
            Cells(i, 2).Value = "1" 'analyse du presse papier si PP vide
            SendKeys "{TAB}", True 'Remise en position sur le code article
            SendKeys "{TAB}", True
            Else
            Cells(i, 2).Value = "" 'analyse du presse papier si PP non vide
            SendKeys "{TAB}", True 'Remise en position sur le code article
            SendKeys "{TAB}", True
        End If
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s

End Sub

Mais là il ne va plus me chercher la cellule dans excel, il copie du vide.

J'ai ensuite pensé a créer une autre variable comme dim d As Integer avec comme valeur d = 2 pour mettre :

Do

i = d+1

etc etc ...

Mais sans résultat non plus.

As tu une idée du problème ?

Bonjour,

Une erreur dans le début de la macro :

Do
              i = i + 1

        Loop While Cells(i, 3) <> ""

essais :

Do while Cells(i,3) <> ""
'traitement
i = i+1
loop

Cordialement,

Salut Zirak !

Ca ne marche pas, j'ai une erreur d’exécution 1004 :

"Erreur définie par l'application ou par l'objet" à la ligne Do While Cells (i, 3) <> ""

Tu as bien laissé ton i = 2 avant le do while pour que la boucle sache où démarrer ?

Cordialement,

Rolalala, autant pour moi à force de faire des modifs je ne vois plus ce que je supprime ou non

Merci à toi et à Panitec ! La macro se déroule comme elle se doit

Re Azertym le forum

oui un petit oubli d'incrémentation de variable !!!

mais c'est cela quand on n'a pas de fichier exemple pour tester, on ne voit pas ses erreurs (ou moins)

a+

Papou

T'inquiète pas Paritec ca me permet d'apprendre au moins ^^.

Je reviens vers vous parce que j'essaye d'optimiser la macro, je vais détailler a nouveau tout le problème :

Je rencontre un petit problème avec une macro que je suis entrain de réaliser pour permettre la communication entre Excel et JDE (un simulateur AS/400 d'IBM).

J'ai écris cette macro :

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 = "Password" 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:03")) 'Temps de pause 01s
            SendKeys "i", True 'Interrogation

'Séléction des cellules en boucle

            i = 1

        Do While Cells(i, 3) <> ""
            i = i + 1
            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
            SendKeys "+{TAB}", True
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "^!", True 'Selection du champ n° article (8 caractères)
            SendKeys "^!", True
            SendKeys "^!", True
            SendKeys "^!", True
            SendKeys "^!", True
            SendKeys "^!", True
            SendKeys "^!", True
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "^c", True 'Copie du champ numéro article de JDE
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "^s", True 'Suppression du champ n° Article

'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 <> 0 Then
            Cells(i, 2).Value = "1" 'Presse papier vide = article à créer
            SendKeys "{TAB}", True 'Remise en position sur le code article
        Else
            Cells(i, 2).Value = "" 'Presse papier non vide = article déjà créé
            SendKeys "{TAB}", True 'Remise en position sur le code article
        End If

NotText:
        If Err <> 0 Then 'Permet l'arrêt de la boucle sans erreurs
            Cells(i, 2).Value = "1"
            SendKeys "{TAB}", True
        Else
            Cells(i, 2).Value = ""
            SendKeys "{TAB}", True
        End If

            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
        Loop

End sub

Le problème c'est que j'aimerai modifier 2 choses, j'ai essayé plusieurs méthode mais soit j'ai des erreurs, soit ca me fait n'importe quoi.

Première question :

Je souhaiterai faire en sorte que ma boucle do while ne copie que les cellules comprise entre 30 999 999 et 32 000 000. Si la cellule n'est pas comprise entre ces 2 valeurs la macro passe a la cellule suivante.

J'ai donc essayé :

i = 1

        Do While Cells(i, 3) <> ""
If Cells(i, 3) > 30999999 or 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
End If

Mais rien ne change, la macro fait exactement comme avant, elle prends en compte toute les cellules.

[u]

Deuxième question[/u]

J'ai remarqué un problème dans le déroulement de la macro.

Lorsque excel copie un code article d'une cellule dans JDE, si cet article est créé alors JDE affiche un code et le curseur de JDE revient en position initial dans la page (c'est cette partie qui pose problème pour la suite). Je vais donc chercher ce code avec :

SendKeys "+{TAB}", True
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "^!", True 'Selection du champ n° article (8 caractères)
            SendKeys "^!", True
            SendKeys "^!", True
            SendKeys "^!", True
            SendKeys "^!", True
            SendKeys "^!", True
            SendKeys "^!", True
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "^c", True 'Copie du champ numéro article de JDE
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "^s", True 'Suppression du champ n° Article

Puis je le copie et excel analyse le presse papier, si le presse papier contient quelque chose alors il passe a la cellule suivante (ce qui signifie que l'article est déjà créé). Cette opération fonctionne parfaitement.

Le problème c'est si le code article n'est pas créé, tout se décale car le curseur ne revient pas ou il devrait, il reste sur le champ ou je colle le code article (comme quoi il y'a une erreur et que le code article n'existe pas), donc la suite de la macro est complètement foiré.

Je voudrais donc changer mon champ de sélection et ne plus dire si presse papier vide alors mettre un 1 dans excel mais plutôt si presse papier différent de I alors mettre un 1 dans excel.

J'ai essayé de changer ma macro par :

'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
            SendKeys "{TAB}", True 'Remise en position sur le code article
        Else
            Cells(i, 2).Value = "" 'Presse papier non vide = article déjà créé
            SendKeys "{TAB}", True 'Remise en position sur le code article
        End If

NotText:
        If Err <> "I" Then 'Permet l'arrêt de la boucle sans erreurs
            Cells(i, 2).Value = "1"
            SendKeys "{TAB}", True
        Else
            Cells(i, 2).Value = ""
            SendKeys "{TAB}", True
        End If

            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
        Loop

Mais ca ne marche pas :s.

Merci d'avance.

Je déteste faire ca mais comme j'ai édité mon post précédent pour cause d'amélioration je me permet de faire un petit up .

Bonne journée à tous !

Bonjour,

Pour ton 1er soucis :

If Cells(i, 3) > 30999999 AND Cells(i, 3) <32000000 Then

Il faut un ET, car si tu lui met un OR (OU), le traitement va se faire pour tous les cas forcement.

Pour le 2ème :

Je n'ai pas suivis tout le fichier, et je n'y connais pas grand chose en sendkeys, mais ton "I" sort d'où ? Car tu lui dit que si <> "I" alors mettre 1 ok, mais ton "I" n'est pas une variable déclarée, il n'y en a aucune trace dans le reste de la macro, ... cela correspond à quoi ?

Cordialement,

Pour le And en effet j'avais mis ca au début, le soucis c'est qu'il ne me sélectionne plus ma cellule, il ne garde que ce que j'ai dans mon presse papier (par exemple le code que je viens de coller ...)

Concernant la deuxième question, en fait dans jde on met un i qui signifie "interrogation article" ensuite on colle un code article, si ce code article est déjà créé alors il revient sur le champ "i". J'ai donc pensé à faire une sélection du i. Si le presse papier détecte le i c'est que l'article est créé.

Si l'article n'est pas créé alors il reste sur le champ code article, une sélection sera faite, la valeur copiée sera différente de i (car il sera resté sur le champ code article) donc ce qui signifiera que l'article n'est pas créé.

J'avais changé la variable i par n pour ne pas avoir de conflit avec le presse papier mais ca ne change rien. Je voulais donc juste savoir si c'était possible d'utiliser le presse papier pour réaliser cette opération. Si ça se trouve ce n'est pas du tout comme ça qu'il faut faire.

Même si tu mets le AND, c'est tout ton traitementqu'il faut mettre dans ta boucle IF, pas seulement

If Cells(i, 3) > 30999999 or 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
End If

Car dans les autres cas, oui il ne va pas faire cette opération, mais va faire quand même tout le reste du traitement;

Il faut que tu fasses dans ce genre :

i = 1

        Do While Cells(i, 3) <> ""
If Cells(i, 3) > 30999999 And Cells(i, 3) <32000000 Then
            'Traitement entier comme avant
End If

i = i + 1

Pour le 2ème soucis, es-tu sur que la valeur retournée dans le presse papier est bien "I" ? Fais toi une msgbox juste avant ton test pour voir la valeur qui se trouve dans ta variable N_Article

Nickel Zirak, la boucle fonctionne parfaitement ! Merci beaucoup Un problème de résolu !

Maintenant pour le deuxième problème j'ai mis un Msgbox N_Article et il s'agit bien d'un "I".

Donc maintenant il faudrait dire si N_Article = I Alors on passe au suivant Si N_Article <> I mettre un 1 et passer au suivant.

J'ai réussi a le faire plus ou moins hier, mais a coté des codes articles dans excel il me met un 1 quand l'article n'est pas créé et il me le supprime aussitôt et il passe au suivant.

Je vais refaire le code que j'ai fais hier pour que tu vois un peu.

Rechercher des sujets similaires à "coller presse papier"