La méthode PasteSpecial de la classe Range a échoué (1004)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 2015
-
23 août 2014 à 23:41
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 2015
-
30 août 2014 à 17:32
Bonjour à tou(te)s
En fait, ce n'est pas (plus) une question mais une réponse que j'ai eu du mal à trouver, même sur le net : j'ai passé une demie journée pour trouver le problème - je m'en viens la noter ici pour que cela puisse en aider d'autres.
Contrexte :
Sous Excel 2010, je tentais de faire un "collage spécial" des valeurs (uniquement) de 300.000 cellules.
Quand je le faisais à la main, pas de souci.
Quand je l'incluais dans une macro, à chaque fois cette erreur.
Après avoir écumé tous les forums et les pages de Microsoft, j'en suis arrivé à la conclusion que les filtres automatiques provoquaient ce problème :
Le collage que je voulais faire amenait ces valeurs dans une feuille qui possèdait déjà les titres des colonnes; titres équipés de filtres automatiques.
Si on tente de faire un PasteSpecial dans ces conditions, ça plante.
La solution a donc consisté :
- A supprimer temporairement le filtrage automatique
- A demander le figeage des calculs de la feuille
(oSheet.Application.Calculation = xlManual)
A noter :
Pour supprimer temporairement les filtres automatiques et les remettre en place ensuite :
Dim oFilterRnge As String Dim oRange1 As Range
' Pour désactiver le filtrage If Not oSheet.AutoFilter Is Nothing Then ' Mémorise adresse de filtrage oFilterRnge = oSheet.AutoFilter.Range.Address ' Supprime oSheet.Range(oFilterRnge).AutoFilter Else oFilterRnge = "" End If
' Pour remettre le filtre tel qu'il était au début If Len(oFilterRnge) > 0 Then ' Remet en serice le filtrage Set oRange1 = oSheet.Range(oFilterRnge) oRange1.AutoFilter End If
oSheet représente la feuille sur laquelle on travaille.
pijaku
Messages postés12263Date d'inscriptionjeudi 15 mai 2008StatutModérateurDernière intervention 4 janvier 202414 28 août 2014 à 11:14
Bonjour,
Je me permet de "non résoudre" ce sujet et d'y intervenir.
Je viens de tester un copier/collage spécial sur une feuille disposant d'un filtrage automatique. Ma macro fonctionne...
Cs_Jack, peux tu, stp, nous donner ton code de copié/collé spécial?
Pour info, le mien qui fonctionne utilise un bloc
With End With
:
Sub test()
With Sheets("FeuilleFiltrée")
Range("A1:A33").Copy
.Range("A2").PasteSpecial 'je n'ai pas mis de paramètre ne connaissant pas les tiens...
End With
End Sub
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 28 août 2014 à 16:52
Salut Pijaku
Rien de méchant :
' Cellules de destination - nettoyage Set oRange2 = oSheet_Main.Range("A3") oSheet_Main.Range(oRange2, oRange2.SpecialCells(xlLastCell)).ClearContents ' Cellules de destination - re-sélection Set oRange2 = oSheet_Main.Range("A3") ' Cellules source : Toutes les cellules de PDHS Set oRange1 = oSheet_PDHS.Range("A2:AB2") Set oRange1 = oSheet_PDHS.Range(oRange1, oRange1.Offset(lLinesCount, 0)) ' (*) lLinesCount est une variable initialisée plus tôt ' Vidage presse-papier oExcel.Application.CutCopyMode = False ' Copiage oExcel.Application.CutCopyMode = xlCopy oRange1.Copy DoEvents oRange2.PasteSpecial Paste:=xlPasteValues, Operation:=xlPasteSpecialOperationNone ' et paf le chien !
Pour compléter, les cellules servant au filtrage se trouvent sur la ligne 2, c'est à dire juste au dessus des cellules que je veux coller.
/!\ Je colle prêt de 300.000 cellules : Peut-être un peu normal que le filtrage perde les pédales au moment du "coller".
Pour info, sous Excel 2003, on ne pouvait coller que 2500 lignes à la fois.
Peut-être que pour Excel 2010 ils ont corrigé le problème en créant des paquets de lignes, ce qui peut vouloir dire que le filtre essaye de retrouver ses petits en plein milieu du collage ... avec des données incomplètes.
Voilà comment je me l'explique.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 28 août 2014 à 16:55
PS : Je ne pense pas que le "With" influence la compilation.
pijaku
Messages postés12263Date d'inscriptionjeudi 15 mai 2008StatutModérateurDernière intervention 4 janvier 202414 29 août 2014 à 09:17
Salut,
Je n'arrive pas à reproduire le bug...
Ce fichier : http://cjoint.com/?DHDjpHUN6Gb tente de le reproduire, mais sans succès. J'utilise ton code sans la partie de désactivation du filtre...
Le classeur transmis ici contient 2 macros :
- Prepare_Classeur => remplit la feuil2 de données et prépare la feuil1 avec filtre
- TaMacro => ton code...
Peux tu y regarder et tester?
Il convient, en effet, avant de créer un tuto (comme le suggère Noctambule), de voir ce qui peut effectivement clocher (données, filtre actif ou non, autre, ...). Je sais que PasteSpecial est capricieuse et cela pourrait servir à d'autres.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Whismeril
Messages postés19027Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 avril 2024656 29 août 2014 à 10:20
Salut, c'est peut être l'OS qui fait la différence. Avez vous essayé (l'un ou l'autre) sur différents windows. J'ai pas excel 2010 ici, mais je pourrais regarder sous xp au boulot lundi.
jordane45
Messages postés38142Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention20 avril 2024344 29 août 2014 à 10:32
Bonjour,
je me joins à la discussion.....
Si le souci a été "corrigée" par le retrait des filtres... ne serait-ce pas lié au fait que certaines colonnes étaient justement filtrées et donc que certains lignes étaient masquées ?
Le fait que le filtre soit "présents" ou non ne doit surement pas générer le souci rencontré... le fait que des lignes/cellules soient masquées... Si...!
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 29 août 2014 à 12:54
Franck and Co : bien le bonjour
En effet, la démonstration de Franck fonctionne parfaitement.
J'y ai donc ajouté les particularités de mon application, chose que je n'avais pas remis en question et qui démontre que le problème est lié au fait de travailler sur 2 classeurs différents (source - destination)
et dans lequel il y a bien problème.
Je n'ai pas le temps de voir si la correction que j'ai suggéré fonctionne. Je le ferai ce week-end
@ Jordane : Non, les filtres sont tous inactifs au moment du problème, c'est une des choses que j'avais vérifié.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 29 août 2014 à 12:57
Chose rigolote : quand vous exécutez la macro pas-à-pas (F9), des fois ça tombe en marche. Il y a bien un problème de rafraichissement des données en arrière plan qui perturbe le tout.
Sur XP avec excel 2007, à la première exécution j'ai eu un message d'erreur 400.
A la deuxième ça a marché
pijaku
Messages postés12263Date d'inscriptionjeudi 15 mai 2008StatutModérateurDernière intervention 4 janvier 202414 29 août 2014 à 14:43
Bonjour,
@cs_jack : je n'ai pas eu d'erreur.
Aucune...
Le classeur que tu nous as fourni fonctionne impeccablement bien.
C'est à y perdre son chinois...
le problème est lié au fait de travailler sur 2 classeurs différents (source - destination) J'en doute. D'autant que tu références hyper bien ton Range à copier et coller...
@ Whismeril : même pas un ptit bug 400... Rien!
@ Jordane45 : Windows 7 Entreprises 32 buts, avec Excel 2010...
jordane45
Messages postés38142Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention20 avril 2024344 29 août 2014 à 14:59
@pika :
@ Jordane45 : Windows 7 Entreprises 32 buts, avec Excel 2010...
=>... Windows Seven (7) Ent 64 Bits
=> et Office 2010 => Donc oui.. Excel 2010
pijaku
Messages postés12263Date d'inscriptionjeudi 15 mai 2008StatutModérateurDernière intervention 4 janvier 202414 29 août 2014 à 15:53
Oui oui, j'avois ben comprris...
C'est la mienne qui fait 32 buts et Seven et office 2010...
pijaku
Messages postés12263Date d'inscriptionjeudi 15 mai 2008StatutModérateurDernière intervention 4 janvier 202414 29 août 2014 à 21:28
Merci pour cette effervescence. Cette effervescence se justifie.
Nous avons tous été confrontés à un moment ou à un autre à ce genre de caprice de la part de PasteSpecial.
Pour ma part, il est temps de comprendre le pourquoi du comment.
pijaku
Messages postés12263Date d'inscriptionjeudi 15 mai 2008StatutModérateurDernière intervention 4 janvier 202414 30 août 2014 à 11:25
Salut tout le monde,
JE ne peux pas tester, mais peut être faudrait-il sélectionner le Range de destination : oRange2.Select avant le collage spécial.
Autre piste, sélectionner un range de destination de la même "taille" que le range copié...
A voir.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 30 août 2014 à 17:32
Re à tou(te)s
Franck : Le .Select est à bannir pour la simple raison qu'il crée une sélection et qu'une intervention de l'utilisateur au même moment peut provoquer des résultats inattendus - mieux vaut toujours travailler avec les objets et bannir la sélection.
Tests sous :
- XP Pro 32 SP2 + Excel Pro 2007 : même erreur
- XP Pro 32 SP2 + Excel Pro 2003 : fonctionne
- W7-64 SP1 + Excel 2010 32, sur une autre machine que celle de dev : même erreur
Ce qui est rassurant pour moi, c'est que deux machines avec la même configuration donne le même résultat (l'erreur).