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 :

Méthode Paste de la classe Worksheet a échoué


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Méthode Paste de la classe Worksheet a échoué
    Bonjour,

    J'ai beau chercher, je ne trouve pas où est ma bourde
    Le plus surprenant, c'est que c'est aléatoire, et qui si je fermme l'erreur 1004 renvoyée et que relance LA MÊME macro (j'ai mis un bouton "Bug Paste" pour ça qui me retourne Application.run "CopierFicheAuSommaire") tout déroule nickel

    Voilà le code :

    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
    Sub CopierFicheAuSommaire() ' Module 4
    ' Recopie des infos dans le Sommaire à l'enregistrement de la nouvelle Fiche Devis
    
        ActiveSheet.Unprotect ' Fiche Devis déprotégé
        Rows("1:1").Select ' Sélection de la ligne de recopie dans la Fiche Devis
        Selection.Copy 'copie des infos (presse-papier)
        Sheets("Sommaire").Visible = True ' "Sommaire" est visible,
        Sheets("Sommaire").Select ' Sélectionné,
        ActiveSheet.Unprotect ' déprotégé
        PremièreLigneVide = Columns(1).Find("").Row ' on y cherche la première ligne vide,
        Rows(PremièreLigneVide).Select ' on la sélectionne,
        ActiveSheet.Paste Link:=True ' et on y colle les données liées à la fiche (presse-papier)  !!! 1004 AVEC PASTE/WORKSHEET !!!
        Sheets("Sommaire").Visible = False ' On cache "Sommaire" : la Fiche Devis est réactivée
        Rows("1:1").Select ' La ligne de recopie dans la Fiche Devis est resélectionnée,
        Selection.EntireRow.Hidden = True ' et cachée
        Cells.Select ' on sélectionne toutes ses cellules
        Selection.Locked = True ' on les verrouille
        Selection.FormulaHidden = False ' mais en les laissant sélectionnables
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True ' et on active la protection de la Fiche Devis
        Cells(3, 1).Select
        Sheets("Sommaire").Visible = True ' "Sommaire" est à nouveau visible"
        ActiveSheet.Visible = False ' La Feuille Devis (toujours active) est cachée ; "Sommaire" est alors seule visible et devient active
        Application.Run "TriSommaire"
    
    End Sub
    Merci pour toute aide !

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 563
    Points : 1 691
    Points
    1 691
    Par défaut
    je n'ai pas le temps là tout de suite de refaire ta macro, mais a priori, il s'agit d'un probleme de synchro. si ça marche une fois et pas une autre, c'est que la situation entre le masquage des feuilles, la protection, et les selection est differenre entre deux execution. le mieux pour la reperer est d'utiliser la touche F8 et de faire pas a pas. et de simplifier tes lignes pour y voir clair
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Rows("1:1").Select 
    Selection.Copy
    est égal à
    également, si tu évite d'utiliser activesheet, tu aura plus de chance que ça aille mieux, utilise plutot le nom de la feuille, ou son index

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Salut Alsimbad,

    C'est en pas à pas que j'ai posté et c'est bien à ActiveSheet.Paste Link=True que ça plante.

    Ton analyse (PB Synchro) est tout à fait pertinente, mais même avec les simplicications proposées, ça n'est pas résolu.

    J'avoue n'avoir aucune idée de comment "ralentir" une exécution le temps qu'une précédente soit terminée...

    Il me semble important que je donne les codes appelés dans les modules et UserForm précédents afin de mieux cerner le problème.

    Je débute, alors merci d'une indulgence sympathique pour mes longueurs et mes lourdeurs.

    1)Action sur le Bouton "Enregistrer":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Enregistrer_Click() ' Bouton de UserForm "Fiche"
    'Avertissement d'une valeur nulle du N° de Devis
    i = Range("A3").Value
    If i = 0 Then
    ChoixFaux.Show
    Else
    Application.Run "VérifierDoublon"
    End If
    End Sub ' Va au Module 2
    2) Vérification d'un N° déjà existant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub VérifierDoublon() ' Module 2
    'Vérifie la pré-existence d'un N° de Devis saisi dans la nouvelle Fiche
    
    Dim v As String
    v = Range("AB1").Value 'renvoie l'analyse de recherche d'un N°de devis en doublon
    If (v) <> "OK" Then ' Le N° de Devis entré existe déjà dans le Sommaire !!!
        Doublon.Show 'Lance le warning de doublonnage
    Else ' Pas de doublon
    Application.Run "EnregistrerFiche" 'Lance l'application d'enregistrement de la nouvelle fiche
    End If
    End Sub 'Va au Module 3
    3) Enregistre les données
    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
    Sub EnregistrerFiche() ' Module 3
    'Enregistre les données saisies dans "Fiche" et créée une nouvelle fiche au nom du N° de Devis
    
        Sheets("Fiche").Select ' "Fiche" sélectionnée
        i = Sheets.Count ' compte le nombre de feuilles existantes
        Sheets("Fiche").Copy After:=Sheets(i) ' copie de "Fiche" en dernier ("Fiche(2)")
        Sheets("Fiche").Select ' "Fiche" sélectionnée
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True ' "Fiche" reprotégé
        Sheets("Fiche").Visible = False ' "Fiche" cachée  : ("Fiche(2)" activée)
        Sheets("Fiche (2)").Select ' sélection confirmée de "Fiche(2)" (copie de "Fiche")
        ActiveSheet.Unprotect ' "Fiche(2)" déprotégée,
        ActiveSheet.Shapes("Enregistrer").Select ' Bouton "Enregistrer" sélectionné,
        Selection.Delete ' et supprimé
        ActiveSheet.Shapes("RetourSommaire").Select ' Bouton "Retour au Sommaire" sélectionné,
        Selection.Delete ' et supprimé
        Application.Run "CopierFicheAuSommaire" 'Lance la copie des données de la nouvelle Fiche Devis dans le Sommaire
    
    End Sub ' Vers Module 4
    4) Copie au sommaire (code simplifié)
    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
    Sub CopierFicheAuSommaire() ' Module 4
    ' Recopie des infos dans le Sommaire à l'enregistrement de la nouvelle Fiche Devis
    
        ActiveSheet.Unprotect ' Fiche Devis déprotégé
        Rows("1:1").Copy
        Sheets("Sommaire").Visible = True ' "Sommaire" est visible,
        Sheets("Sommaire").Select ' Sélectionné,
        ActiveSheet.Unprotect ' déprotégé
        PremièreLigneVide = Columns(1).Find("").Row ' on y cherche la première ligne vide,
        Rows(PremièreLigneVide).Select ' on la sélectionne,
        ActiveSheet.Paste Link:=True ' et on y colle les données liées à la fiche (presse-papier) !!! PROBLEME AVEC PASTE !!!
        Sheets("Sommaire").Visible = False ' On cache "Sommaire" : la Fiche Devis est réactivée
        Rows("1:1").EntireRow.Hidden = True
        Cells.Select ' on sélectionne toutes ses cellules
        Selection.Locked = True ' on les verrouille
        Selection.FormulaHidden = False ' mais en les laissant sélectionnables
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True ' et on active la protection de la Fiche Devis
        Cells(3, 1).Select
        Sheets("Sommaire").Visible = True ' "Sommaire" est à nouveau visible"
        ActiveSheet.Visible = False ' La Feuille Devis (toujours active) est cachée ; "Sommaire" est alors seule visible et devient active
        Application.Run "TriSommaire"
    
    End Sub

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Déjà, si tu utilisais les balise CODE -> Sélection du code + 1 clic sur #, ton code serait plus lisible.
    Je t'avoue que je n'ai même pas regardé ton dernier post.
    Pour ton problème : Tu ne peux pas rechercher une première ligne vide entre la copie et le collage. Tu doit rechercher la 1ère ligne vide, puis copier/coller
    Tu n'as pas compris le message d'Alsimblad. La syntaxe qu'il t'a donnée va plus loin qu'une simple "simplification". C'est la syntaxe à utiliser.
    Pour copier / Coller, l'enregistreur de macro donne ton code, ok. Mais pour faire la même chose, en VBA, c'est beaucoup plus directe :
    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
    Dim FL1 as worksheet
    Dim FL2 as worksheet
    Set FL1 = Activesheet
    Set FL2 = worksheet("Sommaire")
        FL1.Unprotect ' Fiche Devis déprotégé
        FL2.Unprotect ' déprotégé
        PremièreLigneVide = FL2.Range("A65535").End(xlUp).Row + 1
     
        FL1.Rows("1:1").Copy destination:=FL2.range("A" & PremièreLigneVide)
        FL2.Visible = False ' On cache "Sommaire" : la Fiche Devis est réactivée
        FL1.Rows("1:1").EntireRow.Hidden = True ' et cachée
        FL1.Cells.Locked = True ' on les verrouille
        FL1.Cells.FormulaHidden = False ' mais en les laissant sélectionnables
        FL1.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True ' et on active la protection de la Fiche Devis
        'FL1.Cells(3, 1).Select 'A quoi sert cette ligne ?
        FL2.Visible = True ' "Sommaire" est à nouveau visible"
        FL1.Visible = False ' La Feuille Devis (toujours active) est cachée ; "Sommaire" est alors seule visible et devient active
        Application.Run "TriSommaire"
    NB - FL1.Cells.FormulaHidden = False ' mais en les laissant sélectionnables
    Non ! Pas "sélectionnables" mais visibles

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bonjour Ouskel'n'or,

    Bon, ben "lâchement" j'ai "recopié" ton code... et, euh, j'ai un message d'erreur arrivé à la quatrième ligne : FL2 = Worksheet("sommaire")

    Erreur de compilation : Sub ou Function non définie.

    J'ai pensé que ce pouvait être par ce que "Sommaire" n'était pas visible : j'ai ajouté Sheets("sommaire").Visible = True en première ligne ; sans résultat.

    Tu me prêtes encore un peu ta boussole que je m'y retouve ?

    Merci beaucoup !

    PS:
    Tu dis :
    Déjà, si tu utilisais les balise CODE -> Sélection du code + 1 clic sur #, ton code serait plus lisible.
    Complètement d'accord ! mais je ne sais pas ce que c'est que les balises CODE ; j'ai bien vu le bouton # ; je copie mon code dans la fenêtre, je le sélectionne et je clique sur # si je comprends bien ; promis je ferai dorénavent!

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 147
    Points
    20 147
    Par défaut
    bonjour

    Remplace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set FL2 = worksheet("Sommaire")
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set FL2 = Worksheets("Sommaire")

    bonne journée
    michel

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Ah oui, ça va mieux (j'aurai pu trouver tout seul quand même : j'ai vraiment encore beaucoup de chemin à parcourir )

    Mais Ouskel'n'or me donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FL1.Rows("1:1").Copy destination:=FL2.range("A" & PremièreLigneVide)
    Moi ,dans mon code-fleuve mal présenté (module 4), je demandais une Copie avec liaison dans la première ligne vide de Sommaire (FL2) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.Paste Link:=True ' et on y colle les données liées à la fiche...
    Je ne sais pas comment reprendre la ligne de code de Ouskel'n'or pour faire cette liaison...

    Ouskel'n'or dit :
    Tu ne peux pas rechercher une première ligne vide entre la copie et le collage.
    J'ai modifié mon code en conséquence, et Paste ne plante plus et ça déroule ... à 2 à l'heure, mais ça déroule ! (On fait avec ce qu'on a, faut bien commencer avec l'enregistreur de macro)

    Il est clair que le code de Ouskel'n'or "tourne" comme une fusée, alors d'avance merci pour la syntaxe code "Copy Destination" a modifier pour une copie avec liaison. J'ai épluché l'aide sur Copy, Paste, Link, mais sans aboutir à quelquechose qui fonctionne.

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Dans ce cas là, tu ne peux pas utiliser un "copier / Coller", tu dois insérer une formule dans chaque cellule de la ligne collée. Sinon, c'est une simple valeur que tu colles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DerniereColonne = Fl1.Range("IV1").End(xlToLeft).Column
    For NoCol = 1 To DerniereColonne
         FL2.Range(Cells(NoLig, NoCol).Address).Formula = "=" & Fl1.Name & "!" & _
         Fl1.Range(Cells(NoLig, NoCol).Address).Address
    Next
    A+

    NB - Avec Cells(NoLig, NoCol) ça ne fonctionne pas chez moi (!)

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Aïe-Aïe-Aïe!!!

    Je crois que ça va être lourd dans mon cas :
    1° Il y a 30 cellules concernées (Bon..., à la rigueur)
    2° Les cellules que je copie comporte déjà des formules qui renvoient à des "cases" d'un tableau dans la feuille Devis.

    J'explique ma manip :

    "Sommaire" est une feuille qui reprend sur une ligne les infos principales de chacunes des feuilles "Devis-x" (cachées/partagées) correpondant à des devis présentés sous forme de tableau.

    Ces feuilles 'Devis-x" sont crées à partir d'une feuille vierge "Fiche" (destinée à leur saisie par l'utilisateur) qui est ensuite copiée/renommée/cachée dans le classeur.

    Je reprend déjà sous forme d'une seule ligne (N°1) les valeurs qui devront "remonter" sur une ligne du Sommaire.
    La raison de cette reprise en une ligne ?
    C'est que la partie tableau est bourrée de cellules fusionnées pour une question de compatibilité/présentation à l'impression du Devis.

    Les données essentielles disséminées dans le tableau sont rappatriées dans la première ligne par une formule comme =G12 en case D1 (pour reprendre en D1 la valeur de G12).

    Il "me suffisait" d'un collage avec liaison de la ligne 1 de la feuille Devis-x vers la première ligne vierge de Sommaire et le tour était joué.
    Pourquoi avec liaison ? Parce qu'une fiche peut être modifiée par un autre utilisateur qui peut accéder à la Fiche Devis.

    Avec l'impossibilité dont tu parles, une fois que j'aurai créé la Feuille "Devis-x" (copié/renommé la feuille "Fiche" remplie), il faudrait "rajouter" le nom de la feuille "Devi-x" dans chacune des formules de la première ligne.
    Exemple : la formule en D1, =G12 devient =Devis-x!G12
    Sachant que A3 a la même valeur que le nom de la feuille,
    le code pourrait être pour D1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("D1").Formula = "=" & Range("A3").Value & "!G12" 'nouvelle formule en D1
    A reprendre pour chacune des 30 cellules concernées de la ligne 1

    N'est-ce pas un peu lourd ? Comment insérer ça "proprement" et ne pas trop ralentir la macro ?

    Merci pour une aide précieuse !

    PS : Cells(NoLig, NoCol), ça convient pas, et même, ça marche pas chez moi non plus.

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 563
    Points : 1 691
    Points
    1 691
    Par défaut
    salut
    en fait, mettre des formules ne ralentira pas ta macro. le code sera un peu plus précis a réaliser, mais le résultat beaucoup plus rapide et tu aura tes liaisons. destination est incompatible avec link (signé F1)
    et n'oublie pas le set
    apres avoir créé ta feuille devis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Set Fl1 = Sheets(1)
    Set fl2 = Sheets(2)
     
    fl2.Range("a1").Formula = "=" & Fl1.Name & "!" & Range("a1").Address
    fl2.Range("b6").Formula = "=" & Fl1.Name & "!" & Range("f9").Address
    fl2.Range("b2").Formula = "=" & Fl1.Name & "!" & Range("z9").Address
    aprés c'est que du copier coller

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Résolu !
    Salut,

    J'ai peut-être plus simple (mais moins élégant ?):

    Je rajoute une ligne N°2 dans la Feuille Devis qui reprend les infos disséminées du tableau à recopier dans la ligne Sommaire, et je fais un copier - valeur dans la ligne N°1.
    Cette ligne N°1 présentant les mêmes formats que ceux des lignes Sommaire, le code de Ouskel'n'or déroule du feu de Dieu, et tout baigne.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Rows("2:2").Select
        Selection.Copy
        Rows("1:1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Seul "hic", quand on modifie une fiche devis déja enregistrée, il faut remouliner : c'est vraiment pas un soucis...

    Ben, finalement je me retrouve avec 2 macros :
    Ma charette laborieusement chargée avec l'enregistreur de macro,
    et la Ferrari "Forum".
    A votre avis, laquelle je vais choisir, hein ?

    Vraiment, un grand merci à tous !

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

Discussions similaires

  1. [XL-2007] La méthode select de la classe worksheet a échoué
    Par nanousik dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/07/2013, 11h17
  2. [XL-2007] Erreur 1004 : la methode Paste de la classe Worksheet a échoué
    Par bricko dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 07/06/2013, 01h53
  3. [XL-2010] La méthode Paste de la classe Worksheet a échoué
    Par FK_1509 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 29/04/2013, 10h01
  4. Méthode Select de la classe worksheet a échoué
    Par marinef dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 22/07/2009, 13h36
  5. La methode paste de la classe worksheet a échoué
    Par jean-paul lepetit dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 24/09/2007, 17h59

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