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 :

problème lors d'un copier - coller


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2016
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2016
    Messages : 96
    Par défaut problème lors d'un copier - coller
    bonjour à tous
    je viens vers vous car j'ai un soucis au niveau d'un copier coller
    je m'explique j'ai une maccro qui fait des copier coller plusieurs fois d'affilé ça fonctionne très bien et au bout d'un moment la fonction paste foire
    j'ai un message : "la méthode Paste de la classe Worksheet a échoué"

    voici mon 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    Sub FeuilleFonctionFolder()
    Application.DisplayAlerts = False
    Worksheets("Page d'acceuil").Activate 'Rend la feuille Templet SV active
    FichierAF = Range("B11").Value 'Cellule où se trouve l'adresse du fichier AF
    Set AF = Workbooks.Open(FichierAF) ' Ouvre Fichier HEM-AF-6300-001.xlsm
    Windows("HEM-AF-6300-001").Activate 'Rend le fichier GénérateurSV_v2.10 actif
    Worksheets("General").Activate 'Rend la feuille Templet SV active
     
    ' Déclaration des variables.
    Dim NbFct As Integer
     
    Dim i As Integer
    Dim Nom As String
     
    Dim F_G As Object
    Set F_G = Sheets("General")
    Dim F_FeuilDB As Object
     
     
    NbFct = F_G.Range("Gen_Liste_fonctions").Rows.Count - 4
    Max = Sheets("General").Range("Gen_Liste_fonctions").Rows.Count - 4
     
        For i = Max To 1 Step -1
            Nom = Sheets("General").Range("Gen_Liste_fonctions").Cells(3 + i, 1)
     
            If Nom <> "" And Nom <> "N/A" Then
     
              Windows("classeurtest3.0").Activate 'Rend le fichier GénérateurSV_v2.10 actif
              Worksheets("Dossier GC Originel").Activate 'Rend la feuille Templet SV active
              ActiveSheet.UsedRange.Copy 'Fonction Selectionner tout + copier
              If SheetExists(Nom & "Section") Then
              ThisWorkbook.Sheets(Nom & "Section").Delete
              End If
              Sheets.Add After:=Worksheets(Worksheets.Count) 'ajoute une feuille dans le classeur actif en fin de classeur
              ActiveSheet.Name = Nom & "Section" 'Nomme la feuille cr?ee Folder GC Originel
              Cells(1, 1).Activate 'Rend la cellule A1 active
              ActiveSheet.Paste 'Fonction Coller
              ActiveSheet.Columns(2).Replace "FCT_XXX_YYY", Nom 'remplace dans la feuille bonjour, au niveau de la colonne 9 la valeur de fonction par la valeur de nom
              Columns("A:AD").EntireColumn.AutoFit
              Range("A1").Select
              Windows("HEM-AF-6300-001").Activate 'Rend le fichier GénérateurSV_v2.10 actif
              Worksheets("General").Activate 'Rend la feuille Templet SV active
     
            End If
     
             If Cells(i, 2).Text Like "*EQUIP*" Then ' est active si FUNCTION existe dans la colonne B
     
                        Cells(i, 2).Activate
                        ActiveCell.EntireRow.Delete
                        Range("A1").Select
                        i = i - 1
                End If
                If Cells(i, 2).Text Like "*IANA*" Then ' est active si FUNCTION existe dans la colonne B
                        'MsgBox "Le mot ""FUNCTION"" existe dans la colonne."
                        Cells(i, 2).Activate
                        ActiveCell.EntireRow.Delete
                        Range("A1").Select
                        i = i - 1
                End If
                 If Cells(i, 2).Text Like "*OANA*" Then ' est active si FUNCTION existe dans la colonne B
     
                        Cells(i, 2).Activate
                        ActiveCell.EntireRow.Delete
                        Range("A1").Select
                        i = i - 1
                End If
                 If Cells(i, 2).Text Like "*REGUL*" Then ' est active si FUNCTION existe dans la colonne B
     
                        Cells(i, 2).Activate
                        ActiveCell.EntireRow.Delete
                        Range("A1").Select
                        i = i - 1
                End If
                i = i + 1
     
     
     
        Next
     
    Windows("HEM-AF-6300-001.xlsm").Close 'ici on ferme le fichier actif GénérateurSV_v2.10
     
    End Sub
    mon code consiste à aller dans une feuille type, copier les info de la feuille
    créer une feuille avec un nom spécifique coller les infos, remplacer les info collées en fonction d'un critière particulier

    j'éspère que vous pourrez m'aider

    merci à vous

  2. #2
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Bonjour à toi,

    au bout d'un moment la fonction paste foire
    Au bout de quel moment ?
    Tu as fait du debug pour voir ce qu'il se passe à ce fameux moment ?

    Trop d'activate dans tous les sens !
    Utilise des variable pour gérer les références à tes Workbooks, Sheets, cellules....
    Ca sera beaucoup plus simple et le risque de plantage beaucoup plus limité.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2016
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2016
    Messages : 96
    Par défaut
    oui j'ai exécuté la macro en mode pas à pas et la ligne qui plante est ActiveSheet.Paste 'Fonction Coller
    en gros ma boucle s’exécutent environ une vingtaine de fois et d'un coup cette erreur apparaît. pourtant après vérification en mode pas à pas, les info sont bien copier mais ne se colle pas
    pour les activate, je ne sais pas faire autrement :/ je suis un débutant en VBA du coup je fais au plus simple

  4. #4
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Déjà sans aller plus loin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ActiveSheet.UsedRange.Copy 'Fonction Selectionner tout + copier
              If SheetExists(Nom & "Section") Then
              ThisWorkbook.Sheets(Nom & "Section").Delete
              End If
              Sheets.Add After:=Worksheets(Worksheets.Count) 'ajoute une feuille dans le classeur actif en fin de classeur
              ActiveSheet.Name = Nom & "Section" 'Nomme la feuille cr?ee Folder GC Originel
              Cells(1, 1).Activate 'Rend la cellule A1 active
              ActiveSheet.Paste 'Fonction Coller
    Tu fais beaucoup trop de chose entre le moment ou tu copie et le moment ou tu colle.
    Du coup plusieurs facteurs annule la copie en cours.... Et notamment le sheet.delete !

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2016
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2016
    Messages : 96
    Par défaut
    ok merci j'ai supprimer le delete cela fonctionne j'aurai une autre question sur un autre sujet si ça te déranges pas
    j'ai une autre macro :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    Sub FeuilleEquipSection()
    Application.DisplayAlerts = False
    Worksheets("Page d'acceuil").Activate 'Rend la feuille Templet SV active
    FichierAF = Range("B11").Value 'Cellule où se trouve l'adresse du fichier AF
    Set AF = Workbooks.Open(FichierAF) ' Ouvre Fichier HEM-AF-6300-001.xlsm
    Windows("HEM-AF-6300-001").Activate 'Rend le fichier GénérateurSV_v2.10 actif
    Worksheets("General").Activate 'Rend la feuille Templet SV active
     
    ' Déclaration des variables.
    Dim NbFct As Integer
     
    Dim i As Integer
    Dim Nom As String
     
    Dim F_G As Object
    Set F_G = Sheets("General")
    Dim F_FeuilDB As Object
     
              Windows("classeurtest3.0").Activate 'Rend le fichier GénérateurSV_v2.10 actif
              Worksheets("Dossier GC Originel").Activate 'Rend la feuille Templet SV active
              ActiveSheet.UsedRange.Copy 'Fonction Selectionner tout + copier
     
              Sheets.Add After:=Worksheets(Worksheets.Count) 'ajoute une feuille dans le classeur actif en fin de classeur
              ActiveSheet.Name = "Equip" & "Section" 'Nomme la feuille cr?ee Folder GC Originel
              'Cells(1, 1).Activate 'Rend la cellule A1 active
              ActiveSheet.Paste 'Fonction Coller
              Dim fG As Worksheet, fE As Worksheet
                Dim vZ As String, vP As String
                Dim lZ As Integer, lP As Integer
                Dim c As Variant
                Dim d As Object, d1 As Object
                Windows("classeurtest3.0").Activate 'Rend le fichier GénérateurSV_v2.10 actif
                Worksheets("Page d'acceuil").Activate 'Rend la feuille Templet SV active
                FichierAF = Range("B11").Value 'Cellule où se trouve l'adresse du fichier AF
     
     
                Set AF = Workbooks.Open(FichierAF) ' Ouvre Fichier HEM-AF-6300-001.xlsx
     
     
                Windows("HEM-AF-6300-001").Activate 'Rend le fichier GénérateurSV_v2.10 actif
                Worksheets("General").Activate 'Rend la feuille Templet SV active
                vZ = "Zones et équipements": vP = "Pontage"
                Set c = ActiveSheet.Cells.Find(vZ): If Not c Is Nothing Then lZ = c.Row
                Set c = ActiveSheet.Cells.Find(vP): If Not c Is Nothing Then lP = c.Row
     
                Set d = CreateObject("scripting.Dictionary")
                    For Each c In ActiveSheet.Range(ActiveSheet.Cells(lZ + 3, 6), ActiveSheet.Cells(lP - 3, 6))
                        If c.Value <> "" Then d(c.Value) = c.Offset(, 1).Value
                    Next c
     
                Set d1 = CreateObject("scripting.dictionary")
                    For Each c In d.keys()
                        d1("EQUIP\" & c & "\" & c) = d(c)
                        d1("EQUIP\" & c & "\HOUR") = ""
                        d1("EQUIP\" & c & "\MINUTE") = ""
                        d1("EQUIP\" & c & "\SECOND") = ""
                    Next c
     
                Windows("classeurtest3.0").Activate 'Rend le fichier GénérateurSV_v2.10 actif
                Worksheets("EquipFolder").Activate 'Rend la feuille Templet SV active
                With ActiveSheet
                    .Rows(5).Copy .Range("5:" & 5 + d1.Count - 1)
                    .Cells(5, 2).Resize(d1.Count) = Application.Transpose(d1.keys)
                    .Cells(5, 3).Resize(d1.Count) = Application.Transpose(d1.items)
                End With
              i = 5
              Do While Cells(i, 2) <> "" 'balaye toute la colonne num?ro 2 (ici B) tant qu'il n'y a pas de caract?re nul
    il fonctionne très bien lors de la première execution, si je la relance, elle ne fonctionne plus et plante sur
    "For Each c In ActiveSheet.Range(ActiveSheet.Cells(lZ + 3, 6), ActiveSheet.Cells(lP - 3, 6))"
    message d'erreur : Erreur définie par l'applucation ou par l'objet
    je ne comprend pas du tous pourquoi ça me fait cela alors que la première execution se passe à merveille

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    intéresse toi à la ligne 44 de ton code

    si C n'existe pas ... lP = 0

    ce qui aboutis à un lP - 3 = -3 ==> un numéro de ligne qui n'existe pas


    d'une manière plus générale, il faut revoir la rédaction complète du code, il n'est jamais utile d'activer ou sélectionner des objets pour les manipuler
    et toujours prévoir une issue de secours quand un Find ne trouve rien. Ici, tu ne prévois que le cas où Find trouve quelque chose

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2016
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2016
    Messages : 96
    Par défaut
    j'ai regarder cette ligne que j'ai donc modifié pour que si lP = 0, je fais en sorte que lP soit = 3
    mais le problème est toujours présent :/
    Pour la rédaction c'est vrai que ce n'est pas propre mais je ne vois pas comment faire autrement sachant justement ne pas faire autrement que comme je fais à présent
    merci pour vos réponses

  8. #8
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    lP - 3 = 0 si lP = 3

    j'ai beau chercher, je n'ai aucune ligne 0 sur ma feuille Excel

    vérifie également si l'erreur provenait de la valeur de lP

    savoir contrôler la valeur et le type de ses variables, c'est un impératif quand on écrit du code et des procédures

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2016
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2016
    Messages : 96
    Par défaut
    je pense que mon problème vient du c j'ai changer les valeur de lp pour que le code soit correct mais j'ai ensuite une autre erreur différente de celle d'avant
    incompatibilité de type
    pour la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Cells(5, 2).Resize(d1.Count) = Application.Transpose(d1.keys)

Discussions similaires

  1. Vim problème lors d'un copier/coller de guillemets "
    Par langeard dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 02/12/2009, 19h35
  2. Garder le format lors d'un copier coller !
    Par freyliss dans le forum Excel
    Réponses: 2
    Dernier message: 19/07/2007, 13h37
  3. Réponses: 1
    Dernier message: 11/05/2007, 18h19
  4. Réponses: 5
    Dernier message: 16/08/2006, 20h09
  5. [Débutant] Conserver la couleur lors d'un copier coller
    Par ADIDASman dans le forum JBuilder
    Réponses: 2
    Dernier message: 21/05/2003, 18h13

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