Excel - VBA - Un PasteSpecial/Clear qui ne fonctionne pas

Résolu/Fermé
HugoHerbomez Messages postés 57 Date d'inscription dimanche 15 juillet 2012 Statut Membre Dernière intervention 2 mars 2017 - Modifié par HugoHerbomez le 24/01/2017 à 10:57
HugoHerbomez Messages postés 57 Date d'inscription dimanche 15 juillet 2012 Statut Membre Dernière intervention 2 mars 2017 - 25 janv. 2017 à 12:02
Bonjour,

Je viens de commencer la programmation VBA mardi dernier et je ne suis donc pas au courant de toutes les petites astuces, mon problème est sûrement trivial mais je n'arrive pas à trouver de solution moi même et sur internet.



Je cherche à copier un tableau de donnée, ainsi que sa mise en forme, d'une feuille à une autre nommée "Impression Temporaire". Au départ cela fonctionnait, et puis d'un coup ça n'a plus fonctionné, je ne sais absolument pas pourquoi.
De plus quand j'ajoute la ligne ".Range([B2:M2], [B2:B11]).Clear" je reçois un message d'erreur "erreur d'exécution 1004, la méthode PasteSpecial de la classe range a échoué".


Au niveau de excel je peux voir que la sélection dans la première feuille se fait (l'encadrement de copier est le bon) et je peux voir aussi que le collé dans la feuille "Impression Temporaire" est bon également. L'encadrement de sélection collé est présent mais pas le contenu ni la mise en forme !

Voici mon code :

Private Sub CommandButton1_Click()
If StrComp(ActiveSheet.Name, "Traitement Biocide") = 0 Then
Range([B2:L2], [B2:B11]).Copy
ElseIf StrComp(ActiveSheet.Name, "Changement de filtre") = 0 Then
Range([B2:K2], [B2:B11]).Copy
ElseIf StrComp(ActiveSheet.Name, "Opérations Hebdomadaire") = 0 Then
Range([B2:M2], [B2:B11]).Copy
End If
'With Worksheets("Impression Temporaire")
'.Range([B2:M2], [B2:B11]).Clear
.Range("B2").PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False

'End With
End If
End Sub


Je remercie par avance les personnes qui vont prendre la peine de poser un œil sur mon problème. (ou deux)
A voir également:

5 réponses

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776
Modifié par Patrice33740 le 24/01/2017 à 11:32
Bonjour,

Essaies :
Option Explicit
Sub Test()
Dim rng As Range
  With ActiveSheet
    Select Case .Name
      Case "Traitement Biocide"
        Set rng = .Range("B2:L2", "B2:B11")
      Case "Changement de filtre"
        Set rng = .Range("B2:K2", "B2:B11")
      Case "Opérations Hebdomadaire"
        Set rng = .Range("B2:M2", "B2:B11")
    End Select
  End With
  With Worksheets("Impression Temporaire")
     .Range("B2:M2", "B2:B11").Clear
     rng.Copy Destination:=.Range("B2")
     .Range("B2").Resize(1, rng.Columns.Count).ColumnWidth = _
    rng.ColumnWidth
  End With
End Sub


Cordialement
Patrice
1
HugoHerbomez Messages postés 57 Date d'inscription dimanche 15 juillet 2012 Statut Membre Dernière intervention 2 mars 2017 2
Modifié par HugoHerbomez le 24/01/2017 à 11:46
Bonjour Patrice,

J'ai essayé ton code beaucoup plus propre, j'arrive enfin à coller mes données ainsi que la mise en forme. Un seul problème persiste, il ne garde pas la largeur de mes colonnes, et je ne peux pas le faire autrement, c'est indispensable pour l'une de mes feuilles.

je comprend ton code mais pas cette partie :

rng.Copy Destination:=.Range("B2")
.Range("B2").Resize(1, rng.Columns.Count).ColumnWidth = rng.ColumnWidth


Mon dernier problème doit donc être là dedans, pourrais tu y ajouter quelques modifications afin que je garde la largeur de chacune de mes colonnes?

Par la suite je veux bien que tu m'expliques l'origine de mon problème, j'aimerai bien comprendre !

Bien cordialement,
Hugo
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776
24 janv. 2017 à 12:13
Re,

« il ne garde pas la largeur de mes colonnes » : Ça devrait !!!

Explication :
rng.Copy Destination:=.Range("B2")
copie la plage rng vers B2 de la feuille Impession Temporaire (comme un copier/coller manuel)

.Range("B2").Resize(1, rng.Columns.Count).ColumnWidth = rng.ColumnWidth
Redimensionne B2 pour avoir autant de colonnes que rng avec
.Resize(1, rng.Columns.Count)
et y affecte les mêmes largeurs de colonne que rng
0
HugoHerbomez Messages postés 57 Date d'inscription dimanche 15 juillet 2012 Statut Membre Dernière intervention 2 mars 2017 2
24 janv. 2017 à 13:13
<< « il ne garde pas la largeur de mes colonnes » : Ça devrait !!! >>

J'ai mis la dernière ligne de code en commentaire et j'ai réessayé une seconde fois je ne vois aucuns changements, pourtant il n'y a aucuns éléments extérieurs qui viennent perturber cette partie de code, donc je ne comprend pas...

Pour plus de précision mes colonnes ont été agrandi manuellement et non par fusion de colonne.

Si vous avez une alternative je suis preneur ?

Merci beaucoup
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776 > HugoHerbomez Messages postés 57 Date d'inscription dimanche 15 juillet 2012 Statut Membre Dernière intervention 2 mars 2017
Modifié par Patrice33740 le 24/01/2017 à 13:23
Pourtant chez moi ça fonctionne parfaitement, quelle version d'Excel utilises-tu ?

N'y aurait-t-il pas une autre macro qui perturbe celle-la
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776 > Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023
24 janv. 2017 à 13:26
Essaies d'inverser les 2 lignes :
 .Range("B2").Resize(1, rng.Columns.Count).ColumnWidth = rng.ColumnWidth
rng.Copy Destination:=.Range("B2")
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776
25 janv. 2017 à 11:30
Bonjour,

Essaies de remplacer :
.Range("B2").Resize(1, rng.Columns.Count).ColumnWidth = rng.ColumnWidth
Par
.Columns.AutoFit


1
HugoHerbomez Messages postés 57 Date d'inscription dimanche 15 juillet 2012 Statut Membre Dernière intervention 2 mars 2017 2
25 janv. 2017 à 11:35
Merci Patrice,

Le problème est à moitié réglé du coup, mais au moins mon texte dans les cellules est visible dorénavant. J'essaierai de trouver le vrai problème et je le posterai sur la discussion.

Sujet Résolu :)
0
Bonjour
voir surtout la syntaxe des ranges
voir la macro
Private Sub CommandButton1_Click()
Pas = False
   With Worksheets("Impression Temporaire")
       .Range("B2:M11").Clear
            If StrComp(ActiveSheet.Name, "Traitement Biocide") = 0 Then
                  Range("B2:L11").Copy
                  Pas = True
               ElseIf StrComp(ActiveSheet.Name, "Changement de filtre") = 0 Then
                  Range("B2:K11").Copy
                  Pas = True
               ElseIf StrComp(ActiveSheet.Name, "Opérations Hebdomadaire") = 0 Then
                  Range("B2:M11").Copy
                  Pas = True
            End If
         If Pas = True Then
         .Range("B2").PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
               SkipBlanks:=False, Transpose:=False
         End If
   End With
Application.CutCopyMode = False
End Sub


A+
Maurice
0
Bonjour
Pour avoir la largeur colonne
         If Pas = True Then
            ' Copy valeur
            .Range("B2").PasteSpecial xlPasteValues
            ' Copy largeur Colonne
            .Range("B2").PasteSpecial xlPasteColumnWidths
         End If


A+
Maurice
0
HugoHerbomez Messages postés 57 Date d'inscription dimanche 15 juillet 2012 Statut Membre Dernière intervention 2 mars 2017 2
24 janv. 2017 à 14:10
Merci momo pour tes réponses mais j'ai déjà presque réussi à résoudre mon problème grâce à Patrice, le problème est, si je peux te demander de regarder dans notre conversation à Pascal et moi, que je n'arrive pas récupérer la largeur de mes colonnes. Le code devrait fonctionner mais non, j'espère ne pas avoir oublié de transmettre une information, ce qui a l'air d'être le cas!
Si tu peux y jeter un coup d'oeil et voir si tu ne peux pas ajouter un élément à son code ce serait très gentil

Cordialement,
Hugo
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
Modifié par eriiic le 25/01/2017 à 10:41
Bonjour,

S'il faut jeter un oeil c'est à toi de le faire sur la réponse de momo.
Pour les largeurs de colonnes c'est bien :
.Range("B2").PasteSpecial xlPasteColumnWidths


eric
0
HugoHerbomez Messages postés 57 Date d'inscription dimanche 15 juillet 2012 Statut Membre Dernière intervention 2 mars 2017 2 > eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024
Modifié par HugoHerbomez le 25/01/2017 à 10:56
Bonjour Eric,

S'il faut jeter un oeil c'est à toi de le faire sur la réponse de momo.
Pour les largeurs de colonnes c'est bien :


Je le sais bien que c'est la bonne commande, mais pascal m'a donné un bout de code et je ne sais pas adapté cela au sien, c'est pour cela que je demande qu'il aille regarder afin de me dire comment procédé ! Tout était expliqué dans mon message eric.

Si tu peux je voudrais bien que tu regardes toi aussi, voici le code qui était dans les commentaires de moi et Pascal :

Le problème étant qu'avec ce code je devrais avoir les bonnes largeurs de colonne mais que ce n'est pas le cas. Avec Pascal ce code fonctionne mais pas avec moi. Et je n'ai pas réussi à trouver un bon résultat moi même avec .Range("B2").PasteSpecial xlPasteColumnWidths en trifouillant le code ci dessous

Option Explicit
Sub Test()
Dim rng As Range
  With ActiveSheet
    Select Case .Name
      Case "Traitement Biocide"
        Set rng = .Range("B2:L2", "B2:B11")
      Case "Changement de filtre"
        Set rng = .Range("B2:K2", "B2:B11")
      Case "Opérations Hebdomadaire"
        Set rng = .Range("B2:M2", "B2:B11")
    End Select
  End With
  With Worksheets("Impression Temporaire")
     .Range("B2:M2", "B2:B11").Clear
     rng.Copy Destination:=.Range("B2")
     .Range("B2").Resize(1, rng.Columns.Count).ColumnWidth = _
    rng.ColumnWidth
  End With
End Sub


Bien cordialement,
Hugo
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
Modifié par eriiic le 25/01/2017 à 11:36
J'aurais préféré voir ton essai plutôt que la version qui ne fonctionne pas.
.Range("B2").Resize(1, rng.Columns.Count).ColumnWidth = rng.ColumnWidth

te met toutes tes colonnes à la largeur de la 1ère colonne du range copié

Refait ton .copy avant :
        rng.Copy
        .Range("B2").PasteSpecial xlPasteColumnWidths

Et comme dit momo également :
pourquoi Set rng = .Range("B2:L2", "B2:B11")
alors que c'est équivalent à :
Set rng = .Range("B2:L11")

Tu n'as pas l'air de savoir très bien ce que tu fais.
C'est normal au début mais dans ce cas on se sert de la fenêtre Espion pour contrôler si une expression correspond à ce qu'on veut.
Fait glisser rng dans la fenêtre espion et ajoute lui .Address pour lire sa valeur.
eric
0
HugoHerbomez Messages postés 57 Date d'inscription dimanche 15 juillet 2012 Statut Membre Dernière intervention 2 mars 2017 2
Modifié par HugoHerbomez le 25/01/2017 à 12:17
Mon essai et cette version sont les même donc je ne vois pas ce que je peux te monter d'autre. il n'y a que cette partie de code qui impact sur mon copier coller.

te met toutes tes colonnes à la largeur de la 1ère colonne du range copié
Du coup je comprend enfin pourquoi je n'arrive pas à obtenir des largeur différente, merci.

Refait ton .copy avant :
rng.Copy
.Range("B2").PasteSpecial xlPasteColumnWidths

Les largeurs des colonnes se mettent comme il faut mais les données et la mise en forme ne sont pas présente, comment y ajouter les données ET la mise en forme? (couleur de fond de la cellule, et bordures)

Ensuite non je ne sais pas trop ce que je fais car je n'arrive pas à obtenir ce que je veux. (c'est pour cela que je suis ici, et j'ai bien écrit dans mon premier message que je débute dans VBA) Ce que a dit momo est équivalent en effet mais que je le mette ou pas cela ne changera rien à mon problème. Je le modifierai plus tard quand j'aurai enfin résolu le gros du problème.

Edit :
C'est bon j'ai réussi, en faite la version de Momo il manquait encore la mise en forme, mais comme je suis débutant je n'arrivais juste pas à associer les deux codes.
Au final J'ai ça et ça fonctionne


With ActiveSheet
    Select Case .Name
         Case "Traitement Biocide"
              Set rng = .Range("B2:L11")
         Case "Changement de filtre"
              Set rng = .Range("B2:K20")
         Case "Opérations Hebdomadaire"
              Set rng = .Range("B2:M20")
     End Select
End With
With Worksheets("Impression Temporaire")
       .Range("B2:M20").Clear
        rng.Copy
        .Range("B2").PasteSpecial xlPasteColumnWidths
        .Range("B2").PasteSpecial xlPasteAll
End With


Merci à tous,
Hugo !
0

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

Posez votre question
Bonjour
Modification de la macro de Patrice
A toi de voir pour moi ses fini
Sub TestColonne()
   With Worksheets("Impression Temporaire")
      'Range("B2:M2", "B2:B11").Clear
      .Range("B2:M11").Clear
         Select Case ActiveSheet.Name
            Case "Traitement Biocide"
               'Range("B2:L2", "B2:B11").Copy
               Range("B2:L11").Copy
            Case "Changement de filtre"
               'Range("B2:K2", "B2:B11").Copy
               Range("B2:K11").Copy
            Case "Opérations Hebdomadaire"
               'Range("B2:M2", "B2:B11").Copy
               Range("B2:M11").Copy
            Case Else
              ' Mettre un messge box
               Exit Sub
         End Select
      .Select
      ' Copy valeur
      Range("B2").PasteSpecial xlPasteValues
      ' Copy largeur Colonne
      Range("B2").PasteSpecial xlPasteColumnWidths
      Application.CutCopyMode = False
   End With
End Sub

A+
Maurice
0