PasteSpecial entre deux classeurs : erreur 1004

Résolu/Fermé
yulione Messages postés 39 Date d'inscription mardi 25 février 2014 Statut Membre Dernière intervention 27 octobre 2019 - 22 juil. 2015 à 12:00
yulione Messages postés 39 Date d'inscription mardi 25 février 2014 Statut Membre Dernière intervention 27 octobre 2019 - 30 sept. 2015 à 14:11
Bonjour à tous.

J'ai besoin de vos conseils avisé svp.

Voila mon histoire : Je souhaite un code VBA dans un classeur ref qui me permette de sélectionner un classeur cible (via un parcourir). Il copiera le contenu (valeurs et format, pas de formules) d'un onglet spécifique de ce classeur cible (même nom d'onglet dans n'importe quel classeur cible) et le collera dans une nouvelle feuille créée pour l'occasion de mon classeur ref.

Seulement voila : pour éviter de copier les formules, je me prend un peu la tête :
1 - je copie donc d'abord le range(A1:B200) de l'onglet cible,que je colle dans le nouvelle onglet de ref.
2- j'efface uniquement le contenu de cet onglet ref
3- je copie à nouveau le contenu de mon onglet cible.
4 - puis je souhaite copier uniquement les valeurs copier dans l'onglet ref.

Pour cette dernière étape, je passe par un PasteSpecial, mais qui me provoque une erreur 1004. les étapes 1 à 3 fonctionnent parfaitement bien....

Voici le code en question.

Sub ImportFile()
Dim filename As String
Dim refWb As Workbook
Dim cibleWb As Workbook

'déclare le classeur actuel comme référence dans refWb
Set refWb = ActiveWorkbook

'affichage fenêtre parcourir, stocke adresse du fichier dans filename
filename = Application.GetOpenFilename

'ajoute une feuille à la fin du classeur
Sheets.Add After:=Worksheets(Worksheets.Count)

'désactive la mise à jour visuelle et l'affichage d'erreur le temps de l'import
Application.ScreenUpdating = False
Application.DisplayAlerts = False

'déclare le classeur cible dans cibleWb

Set cibleWb = Workbooks.Open(filename)

'Copie le contenue de la feuille "Coordination" du classeur cible dans la dernière feuille du classeur ref
cibleWb.Worksheets("Coordination").Range("A1:BA200").Copy Destination:=refWb.Worksheets(refWb.Worksheets.Count).Range("A1:BA200")

'efface le contenu des cellules de la dernière feuille de classeur ref (juste le contenu, conserve les formats)
refWb.Activate
refWb.Worksheets(refWb.Worksheets.Count).Range("A1:BA200").ClearContents

'Copie le contenue de la feuille "Coordination" du classeur cible
cibleWb.Activate
cibleWb.Worksheets("Coordination").Range("A1:BA200").Copy

'colle uniquement les caleurs copier précedemment dans la dernière feuille du classeur ref
refWb.Activate
refWb.Worksheets(refWb.Worksheets.Count).Range("A1:BA200").PasteSpecial Paste:=xlPasteValues

'ferme le classeur cible
cibleWb.Close (False)

'réactive la mise à jour visuelle et l'affichage d'erreurs
Application.ScreenUpdating = True
Application.DisplayAlerts = True

End Sub


lorsque j'exécute le code ligne par ligne, cela bloque au moment du pastespecial.

j'ai même essayé d'attribué la valeur 1 à toute ma plage A1:B200 dans refWb et cela fonctionne parfaitement. J'avoue ne pas comprendre d'ou viens l'erreur. Si quelqu'un peu m'éclairer, ou me proposer des solutions alternative, merci d'avance.

4 réponses

ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
22 juil. 2015 à 16:16
Bonjour Yulione, bonjour le forum,

Je ne comprend pas ce code...
- Tu copies une plage d'un classeur dans le dernier onglet d'un autre classeur.
- Tu effaces le contenu que tu viens de coller (pour en garder les formats)
- Tu recopies la même plage
- Tu colles, les valeurs, au même endroit ???...

Pourquoi ce trafic ? Le premier copier/coller faisait l'affaire non ?

Sinon je te conseille de déclarer une variable Worksheet et de la définir comme étant le dernier onglet du classeur de référence RefWb, après l'ajout...

Dim RefSh As Worksheet
'code d'ajout d'onglet
Set RefWs = refWb.Sheets(Sheets.Count)

et d'utiliser cette variable dans le code...


0
yulione Messages postés 39 Date d'inscription mardi 25 février 2014 Statut Membre Dernière intervention 27 octobre 2019
22 juil. 2015 à 16:29
Bonjour ThauTheme.

Merci de ta réponse.

En effet le premier copier/coller ne suffit pas car il colle absolument tous dans les cellules (à savoir les formules aussi, qui veulent s'actualiser à chaque ouverture de mon fichier). Ce dont j'ai besoin, c'est d'une image à un instant t de l'onglet que je veux copier, avec les format et mise en forme et les valeurs uniquement ( et non les formules), d'où mon micmac.

je reviens bien coller les valeurs au même endroit que précedemment, sauf que cette fois ci c'est bien les valeurs qui doivent être coller et non les formules.

Est-ce que c'est plus compréhensible comme cela ?

Quand à ta remarque elle est tout à fait pertinente je comptait le faire à postériori afin de simplifier le code.
0
yulione Messages postés 39 Date d'inscription mardi 25 février 2014 Statut Membre Dernière intervention 27 octobre 2019
22 juil. 2015 à 16:52
je viens de tester autre chose.

Il se trouve que dans mes mise en forme il y a des cellules fusionnées.

Après les avoir dé-fusionnées, le pastespécial fonctionne parfaitement bien... et le résultats est celui attendu, à ceci prêt que mes cellules ne sont plus fusionnées et que c'est le bordel....
mais c'est déja une avancé... je suis toujours preneur d'une solution plus pratique si vous avez...
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
Modifié par ThauTheme le 22/07/2015 à 17:11
Re,

J'ai testé ton code tel quel et je n'ai eu aucun plantage chez moi !... Mais je n'ai pas le fichier de référence...

À plus,
ThauTheme
0
yulione Messages postés 39 Date d'inscription mardi 25 février 2014 Statut Membre Dernière intervention 27 octobre 2019
30 sept. 2015 à 14:11
j'ai finalement trouvé le problème. Entre ma copie de format, la suppression des formules et le pastspécial, il y a des cellules fusionnées qui gênaient. Il à donc fallu rajouter un .Unmerge à mon range et tout est rentré dans l'ordre.

Merci à vous.
0