VBA Excel - coller un tableau depuis le presse papier

shimuno Messages postés 28 Date d'inscription lundi 26 novembre 2007 Statut Membre Dernière intervention 29 février 2012 - 26 févr. 2012 à 19:22
 Utilisateur anonyme - 1 mars 2012 à 17:21
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

shimuno Messages postés 28 Date d'inscription lundi 26 novembre 2007 Statut Membre Dernière intervention 29 février 2012
28 févr. 2012 à 20:30
Et (je viens de le vérifier) :
Sheets("Arrow").Rows("5:36000").Clear
ne vide pas le contenu du presse-papier


Alors là, il y a un truc que je ne comprends pas. Après avoir copié une plage de cellule avec un bon vieux ctrl+c, ça ça marche :

Sub Update_Paste_Arrow3()

[a5].PasteSpecial Paste:=xlPasteValues
[a5].PasteSpecial Paste:=xlPasteFormats

End Sub


Mais ça ça ne marche pas :

Sub Update_Paste_Arrow3()

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

[a5].PasteSpecial Paste:=xlPasteValues
[a5].PasteSpecial Paste:=xlPasteFormats

End Sub


Là, je suis un peu perdu. Vous auriez pas une ou deux lignes de codes pour me dépanner ? (J'ai l'impression de faire la manche dans le métro...)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 févr. 2012 à 20:43
Quel "code" ?
Je te l'ai dit et répété : tes malheurs proviennent de tes select et compagnie.
Je viens de tester à nouveau le "passage" du contenu du presse-papier/d'une sélection, en fait d'un classeur à l'autre ===>> aucune espèce de problème (mais sans select et cie).
Montre-nous ton donc code sans le moindre select, paste et tutti quanti en nous disant où il coince !
____________________
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
shimuno Messages postés 28 Date d'inscription lundi 26 novembre 2007 Statut Membre Dernière intervention 29 février 2012
28 févr. 2012 à 21:03
Je crois qu'on ne s'est pas compris...

Est-ce qu'il y a un "select" dans les lignes que voici :

Sub Update_Paste_Arrow3()

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

[a5].PasteSpecial Paste:=xlPasteValues
[a5].PasteSpecial Paste:=xlPasteFormats

End Sub


Pourtant ça plante à
[a5].PasteSpecial Paste:=xlPasteValues.

Je n'ai pas l'impression, ou alors je ne comprends pas ce que tu veux dire, et pourrais-tu dans ce cas être plus explicite ?

Sinon, alors oui l'utilisateur de la macro que j'essaie de faire est obligé de sélectionner la plage de cellules qu'il veut transférer. Peut être qu'il y a une façon de faire en sorte que l'utilisateur n'ait rien à sélectionner, mais comme les fichiers changent de nom et que les onglets à l'intérieur de ces fichiers changent aussi de nom, je ne vois pas comment faire autrement.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 févr. 2012 à 21:07
C'est pourtant simple : le "paste" ne peut que suivre un copy.
C'est en amont, que tes manoeuvres à coups de select, activate, copy te mettent le cirque.


____________________
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

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

Posez votre question
shimuno Messages postés 28 Date d'inscription lundi 26 novembre 2007 Statut Membre Dernière intervention 29 février 2012
28 févr. 2012 à 21:22
En amont de quoi ?

Encore une fois, si je fais un ctrl+C sur une zone de cellule puis que lance juste cette macro :

Sub Update_Paste_Arrow3()

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

[a5].PasteSpecial Paste:=xlPasteValues
[a5].PasteSpecial Paste:=xlPasteFormats

End Sub


Ca ne marche pas. Il n'y a pas de select ou d'activate.
0
shimuno Messages postés 28 Date d'inscription lundi 26 novembre 2007 Statut Membre Dernière intervention 29 février 2012
28 févr. 2012 à 21:23
Et le fait que tout ça commence par un ctrl+c est la base de mon problème !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 févr. 2012 à 21:27
Mais attend un peu.
Cette phrase :
Sinon, alors oui l'utilisateur de la macro que j'essaie de faire est obligé de sélectionner la plage de cellules qu'il veut transférer. Peut être qu'il y a une façon de faire en sorte que l'utilisateur n'ait rien à sélectionner, mais comme les fichiers changent de nom et que les onglets à l'intérieur de ces fichiers changent aussi de nom, je ne vois pas comment faire autrement.

sème un certain doute dans mon esprit :
Peux-tu/veux-tu bien, s'il te plait définir très clairement ce qui est recherché ?
S'agit-il de la copie, d'un classeur à l'autre, de sélections partielles de contenu de feuilles ou de la copie, d'un classeur à l'autre, de feuilles entières ?


____________________
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
shimuno Messages postés 28 Date d'inscription lundi 26 novembre 2007 Statut Membre Dernière intervention 29 février 2012
28 févr. 2012 à 23:06
Il s'agit de sélections partielles.

Merci beaucoup pour ton aide.
0
Utilisateur anonyme
29 févr. 2012 à 02:52
Bonjour,

Quand tu fais un copier-coller dans Excel, les données demeurent en principe accessibles dans le presse-papier tant et aussi longtemps que les cellules d'origine "clignotent". Si, le classeur d'origine est fermé ou que le clignotement des cellules d'origine est annulé, d'une façon ou d'une autre les données sont perdues. Je te l'ai dit plus haut, le presse-papier d'Office n'est pas le presse-papier de Windows.

Pour ma part, j'ai l'impression qu'il y a beaucoup de non-dit dans cette fixation sur le presse-papiers.

Le presse-papiers n'est qu'un moyen parmi tant d'autres pour importer des données dans Excel. Tu aurais peut-être avantage à lire cet article pour t'en convaincre.
0
shimuno Messages postés 28 Date d'inscription lundi 26 novembre 2007 Statut Membre Dernière intervention 29 février 2012
29 févr. 2012 à 09:01
Bon, vous avez l'air de me prendre pour un nase avec ma fixation sur le presse papier. Avant, j'avais fait ça :

Sub GetArrowDataBis()

On Error GoTo errMsg:

Application.ScreenUpdating = False

Dim desCells As Range:  Set desCells = ActiveSheet.Range("A5:AA2005")

ActiveWindow.ActivateNext

desCells.Value = Worksheets("Inputs").Range("A1:AA2000").Value

Application.ScreenUpdating = True

Exit Sub

errMsg:
Application.ScreenUpdating = True

MsgBox prompt:="Error while processing" & vbNewLine & vbNewLine _
& "Please ensure only this and the Arrow spread are open and show in the Window menu", _
 Buttons:=vbExclamation, Title:="Titre"

End Sub


Bon, comme quoi je ne suis pas obnubilé par le presse papier. Le problème de ce code c'est qu'il ne marche que quand il n'y a que deux classeurs ouverts. Et en plus, si par hasard l'onglet "Input" change de nom, ça ne marche plus.

Si vous avez des idées...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 févr. 2012 à 10:36
explique en langage naturel ce que tu veux faire par ces lignes
en précisant quelle est la feuille active à ce moment là.

Dim desCells As Range: Set desCells = ActiveSheet.Range("A5:AA2005")

ActiveWindow.ActivateNext

desCells.Value = Worksheets("Inputs").Range("A1:AA2000").Value



____________________
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
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 févr. 2012 à 11:16
Car tout donne à penser que l'aspect "nase" (ton adjectif) résulte principalement de tout un tas de circonvolutions inutiles, y compris dans les explications.
Je te suggère à tout hasard d'aller lire un bout de code que j'ai donné hier à 11 h 15 dans la discussion :
Tapez le texte de l'url ici.
Ni select, ni paste, ni même constitution d'une plage tremplin (aucun templin ===>> rien que du direct tout bête).

____________________
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
Utilisateur anonyme
1 mars 2012 à 17:21
Bonjour,

J'ai bricolé un petit exemple. Comme je n'avais pas d'accès INTERNET à ce moment-là, je suis allé avec mes propres termes.

L'idée de base est de mettre 4 fichiers dans le dossier c:\test. (si tu veux utiliser un autre dossier, remplace c:\test par ton dossier, partout dans le code.)
Il contient trois fichiers de données (xlsx). Chacun contient une feuille et chaque feuille contient 5 données numériques de a5 à f5.

Le classeur compile.xlsm qui contient quelques macros et qui va héberger le sommaire. Dans l'UserForm, il y a trois macros. La première (CommandButton1.click) ouvre tour à tour les trois classeurs de données, récupère les 5 données dans le presse-papier, met le nom du classeur ouvert dans la Feuil2 du classeur compile,les colle dans la feuille sommaire du classeur compile et ferme le classeur. La seconde (CommandButton2) fait le total de chaque colonne de la feuille Sommaire. La troisième enregistre le classeur et ferme le programme.

Dans le module standard la macro commence permet de lancer le processus directement à partir de l'interface du classeur compile sans avoir besoin d'ouvrir VBE.

Le fichier zip est là.

Évidemment, il faudra sans doute adapter, mais, à mon humble avis les bases sont là. Les Select et les activate sont réduits au minimum.
0
Rejoignez-nous