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 :

Ma Macro copie le contenu de certaines cellules mais pas d'autres


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Ma Macro copie le contenu de certaines cellules mais pas d'autres
    Bonjour,

    je suis débutant en VBA EXCEL et je suis en train d'écrire une MACRO qui me permettra de copier le contenu de différents tableaux, tous du même modèle, dans un seul tableau.

    Je rencontre de gros problèmes pour réaliser cette opération toute bête.

    On m'a conseillé la syntaxe suivante, qui est tout à fait conforme à ce qui se trouve sur tous les sites mais elle ne fonctionne pas dans mon cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Fichierdestination").Sheets(1).Range("A1").Offset(I) =Worksheets("Fichiersource").Sheets(1).Range("A1").Offset(J,K).Value
    j'ai essayé plusieurs syntaxes pas très élégantes telle que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       Worksheets("Fichiersource").Sheets(1).Activate    
        Range("A1").Offset(J,K).Select
        Selection.Copy
        Worksheets("Fichierdestination").Sheets(1).Activate 
        Range("A1").Offset(I).Select
        ActiveSheet.Paste
    Ou bien encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      Worksheets("Fichiersource").Sheets(1).Activate    
        Nom = Range("A1").Offset(J,K).Value
        Worksheets("Fichierdestination").Sheets(1).Activate 
        Range("A1").Offset(I).Value = NOM
    Mais tout ça ne fonctionne pas. J'arrive à un résultat avec cette syntaxe :
    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
    While Range("A1").Offset(CURSEUR + 4).Value <> ""
     
                            Workbooks(FICHRESULTAT).Sheets(1).Activate
                            Range("A1").Offset(LIGNE).Value = DEPT
                            For Z = 0 To 12
                                CLASSEUR.Activate
                                Sheets(FEUILLLGT).Select
                                VARIABLE = Range("A1").Offset(CURSEUR + 4, Z).Value
                                Workbooks(FICHRESULTAT).Activate
                                Sheets(1).Select
                                Range("B1").Offset(LIGNE, Z) = Z & VARIABLE
                            Next
                            LIGNE = LIGNE + 1
                            CURSEUR = CURSEUR + 1
                            CLASSEUR.Sheets(FEUILLLGT).Activate
                        Wend
    Ce code est destiné à me permettre d'intégrer dans mon fichier de destination les données contenues dans les 12 premières colonnes des fichiers sources file(I), tant que les lignes du fichier source ne sont pas vides (test du while). La variable LIGNE permet de copier le contenu des différents fichiers source les uns à la suite des autres. La variable CURSEUR de démarre la copie au bon endroit dans le fichier source.

    Sauf que ça ne fonctionne pas toujours.

    A savoir, pour certains fichiers, ça marche impeccable : il n'y a donc pas d'erreur au niveau des indices.

    Pour d'autres je parviens à coller la valeur de la variable DEPT dans la première colonne, puis rien du tout. En fait je me suis apperçu que le contenu collé dans le fichier de destination était nul car si je fais coller la concaténation de l'indice Z avec le contenu de la variable VARIABLE, les valeurs de Z sont insérées au bon endroit et avec la bonne valeur, dans mon fichier de destination.

    Je me demande si le problème ne varie pas en fonction du contenu des cellules, textes et nombre par exemple, mais ce n'est même pas certain. Bref, je patauge.

    Si quelqu'un pouvait m'aider, je lui en serait très reconnaissant.

    L'ensemble de mon code donne à peu près cela :
    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
    Set fs = Application.FileSearch   ' Exploration du répertoire REPERTOIRE
        With fs
            .LookIn = REPERTOIREBASE
            .Filename = "*." & EXTENSION
            For I = 1 To .FoundFiles.Count  'J'execute une boucle pour traiter tous les fichiers xls du répertoire
                    Workbooks(FICHRESULTAT).Sheets(2).Activate
                    Range("A1").Offset(I).Value = .FoundFiles(I) 'j'inscris le nom du fichier courant dans la 1ere colonne de la feuille 2 du fichier de sortie
                    Workbooks.Open Filename:=.FoundFiles(I)
                    Set CLASSEUR = ActiveWorkbook
                    FEUILLLGT = "Logements"
                    DEPT = "" 'Mise à zero de la valeur DEPT
                    CURSEUR = 0  ' Mise à zero de la valeur CURSEUR
                    NEANT = True 'je supppose par défaut que le fichier est vide
                    CLASSEUR.Activate
                    Sheets(FEUILLLGT).Select
                              '(je ne recopie pas le code qui m'a permis de trouver le contenu de la variable DEPT et les indices I et J, tout va bien de ce côté)
                                Range("A1").Offset(J, K).Select
                                DEPT = Selection.Offset(0, 1).Value
     
                    If Not NEANT Then
     
                        While Range("A1").Offset(CURSEUR + 4).Value <> ""
     
                            Workbooks(FICHRESULTAT).Sheets(1).Activate
                            Range("A1").Offset(LIGNE).Value = DEPT
                            For Z = 0 To 12
                                CLASSEUR.Activate
                                Sheets(FEUILLLGT).Select
                                VARIABLE = Range("A1").Offset(CURSEUR + 4, Z).Value
                                Workbooks(FICHRESULTAT).Activate
                                Sheets(1).Select
                                Range("B1").Offset(LIGNE, Z) = Z & VARIABLE
                            Next
                            LIGNE = LIGNE + 1
                            CURSEUR = CURSEUR + 1
                            CLASSEUR.Sheets(FEUILLLGT).Activate
                        Wend
                    Else
                        Workbooks(FICHRESULTAT).Sheets(3).Activate
                        Range("A1") = "Fichiers néant"
                        Range("A1").Offset(I + 1) = DEPT
                    End If
                    Workbooks(FICHRESULTAT).Sheets(2).Activate
                    Range("A1").Offset(I).Value = CURSEUR - 3 - J
     
     
                    CLASSEUR.Close
                Next I
            Else  ' Si aucun fichier ne correspond à l'extension EXTENSION
                MsgBox "Aucun fichier n'a été trouvé."
            End If
        End With

  2. #2
    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 543
    Points
    15 543
    Par défaut Fusion de message ( on peu toujours utiliser editer plutôt que poster 2 messages)
    Déjà, tu utiles des Select sans nécessité
    Range("A1").Offset(J, K).Select
    DEPT = Selection.Offset(0, 1).Value
    que tu peux avantageusement remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DEPT  = Range("A1").Offset(J, K+1)
    Ensuite, on ne peux pas vérifier toutes tes variables...
    Mets des points d'arrêt ou affiche-les
    Enfin, essaie le pas à pas pour vérifier si tes données se copient normalement. Je parle de celles qui ne se copiaient pas...
    Tu dis
    A+

    J'ajoute une indication. Le Système a besoin de temps pour afficher les données. Je ne vois nulle part de screenupdating dans ton code. Place
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.screenupdating = false
    en début de macro et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.screenupdating = True
    en sortie
    A+

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Euh ?
    Le screenupdating, je suppose que c'est pour accélérer le traitement ? J'en connaissais le principe mais j'avoue que tant que la procédure ne fonctionne pas correctement, je ne m'en suis pas vraiment occupé. Cela étant, ça va me faire gagner beaucoup de temps lors des phases de test.

    Pour mes variables, je ne comprends pas bien ce que tu me conseille. En effet, normalement tous les indices (CURSEUR, LIGNE, Z, I, J, K) fonctionnent correctement et ce pour deux raisons :
    - 1°) parfois ça fonctionne
    - 2°) quand je les affiche (ça j'y parviens), les valeurs sont correctes.

    De même pour CLASSEUR, FEUILLGT, REPERTOIREDEBASE, FICHRESULTAT qui sont des string qui concernent les noms de fichiers et de répertoire : dans les autres parties de ma MACRO, ça fonctionne.

    La variable CLASSEUR est le classeur courant car tous les classeurs traités par la MACRO sont situés dans un répertoire que l'on parcoure avec la fonction .foundfiles(I). Son utilisation semble correcte, je parviens à faire la liste des fichiers ouverts dans un classeur particulier que j'appelle FICHRESULTAT.

    Ce que je souhaite faire, c'est copier une partie de chaque fichier CLASSEUR dans mon fichier FICHRESULTAT, les données étant recopiées les unes à la suite des autres dans le 1er onglet sheets(1) de ce fichier. Des informations de contrôle sont collées dans les onglets 2 et 3.

    La variable LIGNE permet d'éviter que les données des différents classeurs se supperposent : elle s'incrémente chaque fois que j'écris une ligne dans FICHRESULTAT.sheets(1)

    Dans la colonne A de FICHRESULTAT.sheets(1) je veux insérer le contenu de la variable DEPT (c'est du texte - un nom de département) pour chaque ligne originaire du même fichier. Ca fonctionne parfaitement dans tous les cas.

    Ensuite je souhaite ajouter, dans les colonnes B à N le contenu de la ligne courante du fichier d'origine CLASSEUR colonnes A à M. Comme la fonction worksheet(FICHRESULTAT).sheets(1).range(B1:N1).offset(z) = CLASSEUR.sheets(FEUILLLGT).range(A1:M1).offset(z) ne fonctionne pas (je ne sais pas pourquoi), j'essaie de ruser.

    J'ai donc créé une boucle à 13 tours, for I = 0 à 13 et je passe par une variable de type string appelée VARIABLE dans laquelle je saisi la valeur de chaque cellule CLASSEUR.sheets(FEUILLLGT).range(A1).offset(z,i) dans VARIABLE puis j'essaie ensuite de recopier la valeur de VARIABLE dans worksheet(FICHRESULTAT).sheets(1).range(B1).offset(i,z) (en décalé d'une colonne puisque je rajoute DEPT en début de ligne). C'est à cet endroit que ça coince. Si j'ai bien fait mon diagnostic, la variable VARIABLE est remplie dans certains cas et pas dans d'autre. Et là je ne sais plus du tout ousk'el nor !


    J'espère avoir été clair. Merci pour ton aide - ou celle des autres - en tout cas.

  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 543
    Points
    15 543
    Par défaut
    Difficile de te répondre sans ton fichier... Mais fais un essai en ajoutant ApplicationScreenUpdating = False en début de procédure.
    J'explique mon raisonnement. Le système a besoin de temps pour afficher les données mais n'empêche pas la macro de s'exécuter. Malgré tout, s'il n'a pas le temps de mettre à jour l'affichage, comme la macro se poursuit, il est "possible" que la mise à jour ne se fasse pas. Une simple hypothèse puisque "un coup ça marche et un coup ça marche pas"
    Et comme tu as des Select et des Activate dans ton code, cela ralentit d'autant l'exécution.
    CLASSEUR.Activate
    Sheets(FEUILLLGT).Select
    VARIABLE = Range("A1").Offset(CURSEUR + 4, Z).Value
    Workbooks(FICHRESULTAT).Activate
    Sheets(1).Select
    Range("B1").Offset(LIGNE, Z) = Z & VARIABLE
    Dans ces lignes, tu pourrais supprimer Select et Activate
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    VARIABLE = CLASSEUR.Sheets(FEUILLLGT).Range("A1").Offset(CURSEUR + 4, Z).Value
    Workbooks(FICHRESULTAT).Sheets(1).Range("B1").Offset(LIGNE, Z) = Z & VARIABLE
    Etc.
    ApplicationScreenUpdating = False fait une partie du travail en supprimant la mise à jour de l'affichage à chaque mvt de feuille mais à toi de faire le reste en simplifiant le code
    Juste une hypothèse en ce qui concerne le résultat final...
    Tu dis
    A+

  5. #5
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Toujours rien
    Bonjour,

    J'ai essayé d'appliquer ces suggestions, sans résultat si ce n'est - et c'est déjà bien - une accélération du traitement.

    J'ai décidé de reprendre les choses à zéro avec un code basique centré sur l'opération de copie. J'ai donc rédigé le code suivant qui effectue la copie des données de la feuille "Logements" vers la feuille "Compil". Je rencontre les mêmes problèmes.
    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
    Sub Copie_extract()
    Dim I As Integer
    Dim L As Integer
    Dim Ligne As Integer
    Application.ScreenUpdating = False
    L = 6
    Ligne = 2
    While Sheets("Logements").Range("A1").Offset(L).Value <> ""
        For I = 0 To 12
            Sheets("Compil").Range("B1").Offset(Ligne, I) = L & " " & I & " " & Sheets("Logements").Range("A1").Offset(L, I).Value
        Next
        Ligne = Ligne + 1
        L = L + 1
    Wend
    Application.ScreenUpdating = True
    End Sub
    Je recopie les données de la feuille "Logements" à partir de la ligne LIGNE = 6 dans la feuille "Compil" à partir de la ligne L = 2. Cela fonctionne pour le fichier FICH1 mais pas pour le fichier FICH2. Pourquoi ? Mystère !

    A toutes fins utiles, je joins, dans un ZIP, les fichiers FICH1 et FICH2, la MACRO est enregistrée dans FICH2.

    Merci à qui pourra m'aider !

    JML
    Fichiers attachés Fichiers attachés

  6. #6
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Ca n'inspire personne
    Personne n'a d'idée ? Aïe aïe aïe, mon problème est-il si complexe ?

  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 543
    Points
    15 543
    Par défaut
    J'ai fait ça hier, je te l'ai pas mis ?
    Je n'ai pas trouvé le pb mais j'ai ré-écrit une procédure qui fonctionne dans tous les cas de figure, enfin j'espère
    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
    Option Explicit
     
    Sub Copie_extract()
    Dim I As Integer
    Dim L As Integer
    Dim Ligne As Integer
        Application.ScreenUpdating = False
        L = 6
        Ligne = 2
        While Sheets("Logements").Range("A1").Offset(L).Value <> ""
            For I = 2 To 14
                Sheets("Compil").Cells(Ligne, I) = L & " " & I & " " & Sheets("Logements").Cells(L, I).Value
            Next
            Ligne = Ligne + 1
            L = L + 1
        Wend
        Application.ScreenUpdating = True
    End Sub
    Tu testes et tu nous dis
    A+

    Edit
    Pour info, avec ton code j'avais le même (mauvais) résultat que toi. OK sur Fich1 et KO sur Fich2

  8. #8
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Merci mille fois
    Bonsoir,

    a priori, non, je ne savais pas. En tout cas merci beaucoup, je testerais ça dès demain car chez moi je n'ai pas la même version d'EXCEL.

    Bonne soirée et à bientôt.

  9. #9
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Ca fonctionne !
    Bonjour,

    Je viens de vérifier le fonctionnement du code : ça marche parfaitement. J'ai enfin trouvé le nord.

    Un grand merci, sincère et véritable.

    Cela étant, je sens que je vais encore avoir du temps avant de bien maîtriser la programmation orientée objet de VBA. D'ici là je me serais certainement mis à OpenOffice...

    Bonn ejournée et bon courage à tous.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 30/05/2012, 07h32
  2. [XL-2003] Créer une macro pour vider le contenu de certaines cellules
    Par lolonico1974 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/06/2010, 09h24
  3. [OpenOffice][Tableur] [macro] analyser le contenu d'une cellule
    Par luxcibel dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 06/10/2008, 22h57
  4. Recopier le contenu de certaines cellules
    Par Look dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/05/2007, 22h02
  5. [VBA-E]copie du contenu de la cellule si non vide
    Par zougna dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 19/02/2007, 16h53

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