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