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

Résolu
HugoHerbomez Messages postés 59 Statut Membre -  
HugoHerbomez Messages postés 59 Statut Membre -
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)

5 réponses

  1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 785
     
    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
    1. HugoHerbomez Messages postés 59 Statut Membre 2
       
      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
    2. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 785
       
      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
    3. HugoHerbomez Messages postés 59 Statut Membre 2
       
      << « 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
    4. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 785 > HugoHerbomez Messages postés 59 Statut Membre
       
      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
    5. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 785 > Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention  
       
      Essaies d'inverser les 2 lignes :
       .Range("B2").Resize(1, rng.Columns.Count).ColumnWidth = rng.ColumnWidth
      rng.Copy Destination:=.Range("B2")
      0
  2. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 785
     
    Bonjour,

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


    1
    1. HugoHerbomez Messages postés 59 Statut Membre 2
       
      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
  3. momo
     
    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
  4. momo
     
    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
    1. HugoHerbomez Messages postés 59 Statut Membre 2
       
      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
    2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
    3. HugoHerbomez Messages postés 59 Statut Membre 2 > eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention  
       
      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
    4. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
    5. HugoHerbomez Messages postés 59 Statut Membre 2
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. momo
     
    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