VBA Excel - coller un tableau depuis le presse papier

Signaler
Messages postés
28
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
29 février 2012
-
 Utilisateur anonyme -
Bonjour,

Depuis des semaines, j'essaie de résoudre le problème que voici. J'en ai déjà parlé sur pas mal de forum, mais personne n'a pu m'aider ! J'espère que vous aurez des idées...

J'essaie de mettre au point une macro permettant de coller un tableau contenu dans le presse papier. Ce tableau est copié par l'utilisateur dans un autre fichier dont le nom change constamment. Comme l'utilisateur est pénible, il peut copier la plage de cellule mais aussi des colonnes entières ou des lignes entières.

Voila le code que j'ai écris. Malheureusement, il bloque à :

[a1].PasteSpecial Paste:=xlPasteValues 



Sub Delete_Paste()

Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlSemiautomatic

'Créer la feuille temporaire

Sheets.Add.Name = "TempArrow"

'Coller les données sur la feuille temporaire

Sheets("TempArrow").Select
[a1].PasteSpecial Paste:=xlPasteValues
[a1].PasteSpecial Paste:=xlPasteFormats

'Effacer les données existantes de la feuille Arrow

Sheets("Arrow").Rows("5:36000").Clear

'Copier les données de TempArrow

With Sheets("TempArrow")
        .Range(.Cells(1, 1), .Cells(10000, 50)).Copy Sheets("Arrow").Cells(5, 1)
End With

'Effacer la feuille TempArrow

Sheets("TempArrow").Delete

Application.ScreenUpdating = True
Application.DisplayAlerts = True

End Sub


Quelques explications :
- comme vous l'aurez compris, je veux coller les données du presse papier sur la feuille Arrow ;
- je créé une feuille temporaire (appelée "TempArrow") car je veux d'abord effacer les données qu'il y avait sur la feuille Arrow. Si on fait selection.clear ou selection.delete, le presse papier se vide et on peut plus rien coller du coup. Idéalement, j'aimerais bien ne pas créer cette feuille temporaire et tout traiter dans le presse papier.

Merci beaucoup pour votre aide. J'espère que c'était clair !

33 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Bonjour,
La vraie et seule vraie question est : pourquoi utiliser le presse-papier ?
Pour être exact : dans quelles circonstances précises ?
Mais au delà de cela et juste parce que j'aime bien que l'on n'écrive que ce que l'on comprend ===>>>
que voudrait bien pouvoir "dire" cette ligne :
Sheets("Arrow").Rows("5:36000").Clear

(entre autres) ?
Réponds d'abord à cette question. Ta réponse me permettra de savoir avec quel type de développeur je tente de traiter. Car il y en a au moins deux :
- le type de celui qui écrit sans savoir à quoi peut bien correspondre ce qu'il écrit (et je m'inscris en absent)
- le type de celui qui va vérifier (dans son aide VBA) que ce qu'il écrit correspond bien à du censé et de l' "existant" (et tu me dis où tu as vu cela).




____________________
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
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Je voudrais ajouter : "depuis 2008, quand-même ! tu as au moins deux ans d'avance sur moi en VBA "


____________________
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

Bonjour,

quelques remarques

1)Office a un presse-papiers distinct du presse-papiers de Windows. À priori, si les données proviennent d'un logiciel hors-Office, ce n'est pa surprenant, à priori, que cela plante.

2) Le presse-papiers de Windows, pour peu que je me souvienne, ne peut pas distinguer un tableau de données d'une donnée texte ordinaire

3) J'ai récupéré une partie d'un code récupéré chez Frédéric Sigonneau pour récupérer un tableau vite fait dans le bloc-notes et pas moyen de faire de "pastespecial". Au mieux, c'est l'ensemble du contenu du presse-papiers qui se ramasse au complet dans la cellule A1 de la feuille active.

Private Sub CommandButton1_Click()
Dim DataOut As DataObject
  Set DataOut = New DataObject
   With DataOut
    .GetFromClipboard
     MsgBox .GetText
    Range("a1").Value = .GetText
    End With
End Sub


Par contre, ceci fonctionne d'une feuille Excel à une autre feuille Excel

Private Sub CommandButton2_Click()
      Sheets("Feuil2").Range("a1:b2").Copy
      Sheets("feuil1").Range("d1").PasteSpecial
End Sub
Messages postés
28
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
29 février 2012

Bonjour à tous,

Merci pour vos réponses rapides ! Alors, en ce qui concerne mes compétences de développeur, bah je pense être juste un amateur. Je rends un peu service à mes collègues là, c'est tout.

A propos de la ligne

Sheets("Arrow").Rows("5:36000").Clear


Bah elle me sert juste à effacer les données existantes dans la feuille "Arrow" (là où je vais coller les nouvelles données. Si j'ai mis 36000 lignes, c'est pour être sur de tout effacer (il y a quelques données dans les lignes 5 et suivantes, genre le titre de la feuille, etc.

Quand à savoir pourquoi j'utilise le presse papier, et bien c'est parce que les données à copier proviennent d'un grand nombre de fichiers Excel différents. Donc je ne vois pas trop comment je pourrais faire autrement. Pour vous expliquer rapidement l'utilité du fichier, en gros il rassemble des données de sociétés cotées, et des sociétés cotées il y en a beaucoup...

Bonsoir,

En partant de ta dernière réponse et en "pensant tout haut" :

Si c'était possible de mettre l'ensemble des fichiers d'origine dans le même dossier, quitte à avoir un espace privé sur un serveur de fichiers avec les droits d'accès requis où les "créateurs" de fichiers pourraient envoyer eux-mêmes leurs fichiers. Au pire, les créateurs envoient leurs classeurs par courrier électronique, et toi, tu les mets dans ton dossier désigné. Mais, enregistrer sur le serveur causera probablement moins de trafic sur le réseau, et éviterait tout le travail supplémentaire demandé par l'envoi et la réception du courrier.

Ensuite, toi-même ou ton collègue utilise une macro-commande qui ouvre automatiquement les fichiers Excel en cause, (cela peut se faire rapidement avec le Dir de VBA ou le FileSystemObject), y ramasse les données nécessaires et les colle dans ton fichier de consolidation.

Ou même encore, une macro qui ouvre tous les fichiers, copie la (les) feuille(s) concernée(s) du fichier d'origine dans ton fichier de consolidation. Une fois que ta macro a siphonné les feuilles nécessaires, cette macro, ou une seconde macro, procède à la consolidation des diverses feuilles. (Personnellement, je dirais de faire plus de petites macros qui s'appellent d'une à l'autre sont préférables à une grosse macro qui fait tout l'ouvrage. Ne serait-ce que pour faciliter le débogage et les autres modifications et améliorations.)

Il y a même moyen de lancer une (des) macro(s) automatiquement soit à l'ouverture du classeur, soit à l'activation d'une feuille. M'est avis que tu peux trouver assez facilement, chez Frédéric Sigonneau et ailleurs, des macros toutes faites. Ensuite, il faudra bien les adapter, mais ce ne sera pas la mer à boire.

Bonne réflexion !
Messages postés
28
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
29 février 2012

Merci pour cette réponse.

Malheureusement, ce n'est pas possible de mettre tous les fichiers Excel dans un même dossier. Il y a vraiment beaucoup trop de fichiers.

J'avais pensé aussi à une macro qui ouvrirait les fichiers, mais leur nom change constamment, donc encore une impasse.

Va falloir se débrouiller avec le presse papier !
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Re,
on en revient à ma toute première question
La vraie et seule vraie question est : pourquoi utiliser le presse-papier ?

Dès lors que l'utilisateur a ouvert un classeur, puis une feuille :
Ce classeur est ActiveWorkBook
Cette feuille est ActiveSheet
La selection qu'il y fait est ActiveWorkBook.ActiveSheet.Selection
en conséquence :
dim toto
toto = ActiveWorkBook.ActiveSheet.Selection

mettra dans un tableau toto toutes les données de ta plage sélectionnée
S'agissant d'un tableau dynamique, tu en connais (par ses Ubounds) les dimensions.
Te reste plus, pour les copier dans la feuile X du classeur Y, qu'à utiliser ces données :
exemple :
Workbooks(X).Sheets(Y).Range("A1:" & z & k)=toto

ou Z est la colonne qui correspond à Ubound(toto,2) et k est la ligne qui correspond ) Ubound(toto,1)
Voilà !
____________________
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
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Tu peux même aller jusqu'à t'amuser (rigolo) à :
A l'ouverture par l'utilisateur d'un classeur X dont il veut copier quelque-chose vers le classeur O :
Injecter dynamiquement (hé oui : c'est possible) une procédure dans ce classeur, dans son worksheet_selectionchange pour :
- copier la sélection directement dans le classeur O, à l'endroit que tu veux (méthode copy avec argument destination). Puisque tu y connais, dans l'évènement Worksheet.selectionChange : la selection faite (la paramètre target) et qu'il ne te reste plus qu'à l'envoyer par Copy où tu veux dans ton classeur O
- s'auto-détruire pour n'en laisser aucune trace dans le classeur X

Cà, c'est si tu veux et aimes "jouer".

____________________
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
Messages postés
28
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
29 février 2012

Merci beaucoup pour ta réponse ucfoutu.

Désolé d'être pénible, mais l'utilisateur active la macro quand il est revenu dans le fichier où il va coller les données. Du coup, si j'écris ActiveWorkBook.ActiveSheet.Selection, ça ne va pas fonctionner. Ou bien ?
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Si ta macro est dans un module bas, la sélection sera celle en cours, dans le classeur actif.
Le classeur actif, tu le connais, puisque celui que tu ouvres.
La destination est également connue par définition (le classeur de départ).
Le reste n'est que pure logique.


____________________
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

Bonjour,

Même si le nom du fichier est appelé à changer au gré des inspirations des créateurs, il n'en demeure pas moins que l'extension ne doit pas vraiment changer vraiment souvent. Une recherche de fichiers *.xls ou *.xlsx demeure une affaire de rien à programmer.

Quant à l'idée d'un dossier unique pour l'ensemble des fichiers, il suffit d'un peu de collaboration du Service de dictature informatique et des créateurs de fichiers qui sauvegarderaient eux-mêmes leurs fichiers dans le dossier ainsi créé. D'un simple point de vue de gestionnaire, il y aurait-là, en partant, un énorme gain de temps.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Il est clair qu'il est toujours plus complexe, fastidieux et acrobatique (voire dangereux dans certains cas) de remettre en ordre que de faire en sorte qu'il n'y ait jamais de désordre.


____________________
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
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Il y a de toutes manières une boulette évidente que je viens de repérer en relisant attentivement le tout premier message.
Voilà ce qu'on y lit, entre autres :

- je créé une feuille temporaire (appelée "TempArrow") car je veux d'abord effacer les données qu'il y avait sur la feuille Arrow. Si on fait selection.clear ou selection.delete, le presse papier se vide et on peut plus rien coller du coup.

Evidemment !
Mais que montre (une fois de plus) la lecture de ce passage ? ===>> un abus de select à tout va !
Quelle est la nécessité de sélectionner le contenu de la feuille TempArrow en vue de la vider de ce qu'elle contient déjà ? ===>> aucune !
Sheets("RempArrow").cells.clearcontents
la videra, sans aucune sélection

Nous n'insisterons jamais sur ce point : ne pas travailler à coups de Activate, select et cie.
____________________
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
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
et si on veut réellement détruire tout, pour se débarrasser des mises en formes éventuelles, en plus des données :
Sheets("RempArrow").cells.delete


____________________
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
Messages postés
28
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
29 février 2012

Merci pour vos réponses.
- @ ucfoutu: j'aimerais bien que tout le monde mette ses fichiers au même endroit, mais hélas les utilisateurs seront récalcitrant... Sinon, j'avais essayé d'affecter le tableau à une variable, mais comme la macro se lance à partir de l'autre fichier, ça ne marchait pas vu qu'il affectait à la variable la selection du fichier où on doit coller les données, par la selection du fichier d'où proviennent les données (il n'est pas impossible que je n'ai pas totalement compris tes explications). Quand à l'utilisation à tout va du .select, dans ma macro j'utilise Sheets("Arrow").Rows("5:36000").Clear, et sauf erreur de ma part ça fait quand même disparaitre le presse papier.

- @cmarcotte : est ce que ta solution pourrait marcher quand il y a plusieurs fichiers Excel ouverts ?

Je vais essayer de me creuser un peu plus la cervelle demain, c'était un peu le rush aujourd'hui. Merci beaucoup pour tous vos messages, je vais essayer de pas faire des erreurs de gros nases.

Bonne soirée
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Sheets("Arrow").Rows("5:36000").Clear

et tu sais ce que ferait un tel Clear ? ===>> non ? >>> je vais te le dire, alors : ==== >>
il effacerait les formules et la mise en forme de la plage considérée

Et si tu reprenais tout, depuis le tout début ?
Ce serait peut-être salutaire, ne crois(-tu pas ?


____________________
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
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Et (je viens de le vérifier) :
Sheets("Arrow").Rows("5:36000").Clear
ne vide pas le contenu du presse-papier


____________________
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
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Par contre ; si tu as fait auparavant un select , ma foi ... (relis ce que j'en ai dit )


____________________
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

Bonjour,

Si un fichier est déjà il ne pourra pas être ouvert une deuxième fois. VBA va probablement générer une erreur. Ce ne sera pas tragique en autant que la macro soit programmée pour gérer l'erreur. Dans ce cas, tu pourras faire ce que tu as à faire, soit récupérer tes données et ficher le camp. Dans ce cas, te ne pourrais pas écrire de nouvelles données dans le fichier précédemment ouvert, mais, pour peu que je puisse voir, ce n'est pas un problème.

Rebonsoir à tous,

Je me demande si la macro qui plante ne vient pas, du moins en partie, de l'enregistreur de macros. Ce machin-là est très utile pour produire un canevas, mais c'est malheureusement un perroquet très zélé, très amateur de select, d'activate et d'écriture de propriétés non touchées durant l'enregistrement.