Résolu [VBA] Copier/Coller valeurs sans presse papier

tantal_fr

Grand Maître
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 :

Code:
Cells.Select
Selection.Copy
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.
 

zeb

Modérateur
Meilleure réponse
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 :
Code:
Cells.Copy
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 :
Code:
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' :
Code:
Application.ScreenUpdating = False
Cells.Value = Cells.Value
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. :(
 

tantal_fr

Grand Maître
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.

 

zeb

Modérateur
Le nombre de lignes de code ?
Euh... Une !
:spamafote:

Code:
Range("A1:B3").Value = Range("A1:B3").Value

:)
 

tantal_fr

Grand Maître
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 :

Code:
'Suppression des formules
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.

 

zeb

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

Code:
' // Soit range une plage de cellules
range.Formula = range.Value

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

tantal_fr

Grand Maître
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 :

Code:
 'Suppression des formules
    Range("Addr_Four").Formula = Range("Addr_Four").Value
    Range("Addr_Livr").Formula = Range("Addr_Livr").Value

 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 078
Membres
1 586 394
Dernier membre
Manoushk
Partager cette page
Haut