Se connecter avec
S'enregistrer | Connectez-vous

[VBA] Copier/Coller valeurs sans presse papier

Dernière réponse : dans Programmation

Bonjour,

D'après ce que j'ai compris, c'est le mal d'utiliser le presse papier pour une macro.

Je cherche donc une astuce pour faire un copier coller-valeur d'une feuille ; comprendre par là que j'aimerais supprimer les formules d'une feuille, en gardant les valeurs et mise en forme.

Voici le code utilisé actuellement :

  1. Cells.Select
  2. Selection.Copy
  3. Selection.PasteSpecial Paste:=xlValues


Ce que je fait avec cette macro est de copier une feuille précise dans un nouveau classeur, surprime les formules (étape ci-dessus), renseigner certain champs, et supprimer d'autres données.

Voila, donc, si quelqu'un peut m'envoyer sur une piste pour faire cela - avec élégance - sans forcément passer par copier/coller spécial, je lui en serais reconnaissant.
Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

Salut Tantal,

Effectivement, par principe, il est inadmissible d'utiliser le presse-papier comme variable temporaire.
Imagine que tous les programmes le fassent, et bien sûr, tous en même temps !
Bonjour la pagaille.
Aussi, fais-je la chasse à pareille pratique.

Je chasse de la même manière cette pratique qui consiste à sélectionner un objet puis à agir sur ce qui est sélectionné. Comme si Windows et ses applications étaient incapable de changer à leur guise l'objet courant !!!!!!

Donc :
  1. Cells.Copy
  2. Cells.PasteSpecial Paste:=xlValues


Or donc, pour ne pas passer par le presse-papier, une façon élégante serait d'utiliser ce type de code :
  1. Cells.Value = Cells.Value

TADAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ! Eh, c'est tout con, mais ça dure des plombes... :/ 

Retirons la mise à jour de l'affichage au cours de la manip' :
  1. Application.ScreenUpdating = False
  2. Cells.Value = Cells.Value
  3. Application.ScreenUpdating = True

C'est mieux que si c'était pire, mais ce sont encore quelques longues secondes à comparer avec la quasi-immédiateté d'un copier/coller.

Le modèle objet de VB est partiel. Les ingénieurs de chez Microsoft se sont arrêtés en chemin.
Pourquoi quand on utilise Copy(Destination), ne pas disposer des mêmes options que quand on utilise Copy/PasteSpecial ?
:pfff: 

Il reste une solution que je n'aime pas trop : envoyer paître le pauv' zeb et ses principes à la con. :( 
Solution sélectionnée par tantal_fr

Merci pour ta réponse Zeb,

Je peux donc remercier les ingénieurs MS pour cette fonctionnalité. :ange: 

Je vais essayer ta solution, je n'ai pas beaucoup de cellules qui comportent des formules donc le problème de perf n'est pas forcément rédhibitoire, faut voir le nombre de lignes de code.

Ok, ça marche. :bounce: 

Merci Zeb ; après avoir nommé les cellules ayant des formules à supprimer (pas sur la feuille complète), j'obtient ça :

  1. 'Suppression des formules
  2. Range("Addr").Value = Range("Addr").Value


Je ne peut pas dire si c'est plus rapide ou plus lent car il n'y a pas d'itérations, sur une exécution, on ne sent pas la différence.

tantal_fr a édité ce message
Expert Programmation

Alors en relisant tout ça, et pour être plus précis, il aurait été plus judicieux de proposer le code suivant :

  1. ' // Soit range une plage de cellules
  2. range.Formula = range.Value


Mais Value peut légitimement à gauche se substituer à Formula. :o 

Bon, ça ne marche pas si toute les cellules du range ne sont pas contiguës. Je ne sais pas comment expliquer ce qui se passe, mais dans mon cas, le range est constitué de deux plages contiguës ; la première plage est dupliquée sur la seconde.

Je suis obligé de faire en deux fois :

  1. 'Suppression des formules
  2. Range("Addr_Four").Formula = Range("Addr_Four").Value
  3. Range("Addr_Livr").Formula = Range("Addr_Livr").Value


tantal_fr a édité ce message
Lassé par la pub ? Créez un compte