IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

collage spécial indisponible apres un range("").clearcontents [XL-2019]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    autre
    Inscrit en
    Octobre 2024
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Octobre 2024
    Messages : 4
    Points : 2
    Points
    2
    Par défaut collage spécial indisponible apres un range("").clearcontents
    Bonjour,

    Je débute VBA comme beaucoup de gens qui viennent poser leurs questions ici, et je rencontre un problème dans mon code ...
    Le but du jeux est pour chaque feuille de mon classeur de nettoyer le contenu de cellule/zone de cellules et jusque la tout va bien.
    Toutefois, un peu avant ma boucle, je procède à la copie d'une zone d'une certaine feuille (avec un nombre de colonne fixe, mais pas les lignes) et souhaite faire un collage spécial de cette zone sur toutes mes feuilles.

    Voilà le bout de code qui pose problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
        If ActiveSheet.Name <> "FeuilZ" Then Sheets("FeuilZ").Activate
        zderniereligne = Range("A" & Rows.Count).End(xlUp).Row
        Range(Range("A3"), Range("E" & zderniereligne)).Copy
        For Each Sheet In Sheets
            If Sheet.Name <> "FeuilZ" Then
                Sheet.Activate
                [A3:F82].ClearContents
                [I10:M39].ClearContents
                [J5].ClearContents
                [J3].ClearContents
                [I10].PasteSpecial Paste:=xlPasteValues
                If [L1].Value <> zyear Then [L1].Value = zyear
                [A3].Select
            Else
                If ActiveSheet.Name <> "Feuil1" Then Sheets("Feuil1").Activate
                [A3].Select
            End If
        Next Sheet
    Le problème arrive au moment de la ligne [I10].PasteSpecial Paste:=xlPasteValues.

    Si je fait du pas à pas pour vérifier ce qu'il se passe, la copie est bien faite et est dans le presse papier, si je fait un clic droit dans une cellule, l'option collage spécial est bien dispo, mais des que le premier range ([A3:F82].ClearContents) arrive dans la boucle, l'option de collage spécial disparait et j'ai donc une erreur "La méthode PasteSpecial de la classe Range a échoué" au moment du collage.
    Le débogage me surligne la ligne [I10].PasteSpecial Paste:=xlPasteValues.

    J'utilise des clearcontents et un special paste car la mise en forme du tableau ne doit pas changer, uniquement les valeurs.
    Je précise que le presse papier contient malgré tout ma copie, je ne peux juste pas la coller ...

    J'avais auparavant divisé cette procédure en plusieurs petites, chacune sa tache, et tout roulait, mais j'avais du coup plusieurs procédures (3) qui lançait la même boucle each sheet in sheets et voulait optimiser en évitant d'avoir plusieurs boucles for each sheet in sheets et tout faire dans la même, mais le nettoyage de la zone concernée doit arriver avant le collage (normal vous me direz).

    Auriez vous des idées ?

    En espérant avoir été clair et en vous remerciant pour votre temps.

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 977
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 977
    Points : 29 012
    Points
    29 012
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    utilisez la méthode ClearContents avant la copie.
    Vérifiez manuellement. Si vous effectuez une copie et qu'ensuite vous faites un effacement du contenu le presse papier se vide donc impossible de coller
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Candidat au Club
    Homme Profil pro
    autre
    Inscrit en
    Octobre 2024
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Octobre 2024
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    utilisez la méthode ClearContents avant la copie.
    Vérifiez manuellement. Si vous effectuez une copie et qu'ensuite vous faites un effacement du contenu le presse papier se vide donc impossible de coller
    Bonjour Philippe et merci.

    Dans ce cas je ne voit que 2 options :
    - soit faire 2 boucles, une qui nettoie toutes mes feuilles, et une qui copie une fois ma zone et la colle sur toutes mes feuilles.
    - soit dans la boucle faire le nettoyage, puis aller copier ma zone voulue puis retourner sur la précédente feuille active (en ayant pris sont nom dans une variable par exemple) pour coller les valeurs.

    Qu'est-ce qui serait le plus optimiser entre faire tourner 2 boucles, ou faire 12 copier coller (12 étant mon nombre de feuilles autres que "FeuillZ").

    Merci beaucoup.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 977
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 977
    Points : 29 012
    Points
    29 012
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Petit exemple rapide, qui pourrait être amélioré, avec la copie d'un tableau structuré (voir lien plus bas)

    Petites remarques
    • En VBA, il est inutile dans 99% des cas, d'utiliser les méthodes Activate, Select, etc.
    • Evitez les adressages des cellules entourés de crochets
    • Utilisez la parentalité des objets (voir les liens plus bas)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Sub t()
      Const SourceSheetName As String = "FeuilZ" ' Nom de la feuille source
      Const TableName As String = "t_Test"       ' Nom de la table structurée à copier
      Dim sh As Worksheet
      ' Efface le contenu de certaines plages des feuille du classeur à l'exception de la feuille FeuilZ
      For Each sh In Worksheets
        With sh
          Select Case .Name
             Case Is <> SourceSheetName
                .Range("A3:F82").ClearContents
                .Range("I10:M39").ClearContents
                .Range("J5").ClearContents
                .Range("I3").ClearContents
          End Select
        End With
      Next
      ' Copie de la plage des données de la table
      Range(TableName).Copy
      ' Collage special
        For Each sh In Worksheets
        With sh
          Select Case .Name
             Case Is <> SourceSheetName
             .Range("I10").PasteSpecial xlPasteValues
          End Select
        End With
      Next
      Set sh = Nothing
    End Sub
    Liens
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Candidat au Club
    Homme Profil pro
    autre
    Inscrit en
    Octobre 2024
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Octobre 2024
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Petit exemple rapide, qui pourrait être amélioré, avec la copie d'un tableau structuré (voir lien plus bas)

    Petites remarques
    • En VBA, il est inutile dans 99% des cas, d'utiliser les méthodes Activate, Select, etc.
    • Evitez les adressages des cellules entourés de crochets
    • Utilisez la parentalité des objets (voir les liens plus bas)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Sub t()
      Const SourceSheetName As String = "FeuilZ" ' Nom de la feuille source
      Const TableName As String = "t_Test"       ' Nom de la table structurée à copier
      Dim sh As Worksheet
      ' Efface le contenu de certaines plages des feuille du classeur à l'exception de la feuille FeuilZ
      For Each sh In Worksheets
        With sh
          Select Case .Name
             Case Is <> SourceSheetName
                .Range("A3:F82").ClearContents
                .Range("I10:M39").ClearContents
                .Range("J5").ClearContents
                .Range("I3").ClearContents
          End Select
        End With
      Next
      ' Copie de la plage des données de la table
      Range(TableName).Copy
      ' Collage special
        For Each sh In Worksheets
        With sh
          Select Case .Name
             Case Is <> SourceSheetName
             .Range("I10").PasteSpecial xlPasteValues
          End Select
        End With
      Next
      Set sh = Nothing
    End Sub
    Liens
    Merci Philippe pour cet exemple, je vais essayer ainsi.

    Toutefois une question :
    - Pourquoi est-il préférable d'utiliser range("Ax") au lieu de [Ax] ?

    Merci.

  6. #6
    Membre éclairé Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 438
    Points : 768
    Points
    768
    Par défaut
    Bonjour,
    Toutefois une question :
    - Pourquoi est-il préférable d'utilisé range("Ax") au lieu de [Ax] ?
    A lire et à méditer :
    Jean-Paul sous Office 365 et Windows 10/11 (Intel I7 16Go)

    Si vous avez trouvé réponse à votre question penser à la passer en Vous avez aimé la discussion alors un fait toujours plaisir.
    Le savoir n'a de valeur que s'il est partagé.
    La vérité de demain se nourrit de l'erreur d'hier. Antoine de Saint-Exupéry

  7. #7
    Candidat au Club
    Homme Profil pro
    autre
    Inscrit en
    Octobre 2024
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Octobre 2024
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Valtrase Voir le message
    Merci à vous pour vos réponses et pour la documentation très instructive.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/01/2022, 19h05
  2. [XL-2007] Filtre en VBA d'apres un range de critère
    Par goats dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 05/12/2012, 23h03
  3. [SP-2007] Site indisponible après changement d'adresse
    Par piko68 dans le forum SharePoint
    Réponses: 0
    Dernier message: 10/07/2009, 12h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo