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 :

Boucle macro qui s'arrête après plusieurs tours sans arriver à la fin


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    secretaire
    Inscrit en
    Septembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : secretaire

    Informations forums :
    Inscription : Septembre 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Boucle macro qui s'arrête après plusieurs tours sans arriver à la fin
    Bonjour à tous,

    Perdu après 48h de recherches et à cours de doliprane, je viens demander de l'aide.

    J'ai créé le code ci dessous dans le but de copier dans un classeur excel dis "résumé", les uns en dessous des autres, les plannings de chaque formateurs présent dans un autre classeur (dans lequel chaque onglet est un formateur). Le planning étant modifié chaque jour, j'ai fait le choix de remettre à zéro le classeur "résumé" à chaque fois pour copier ensuite les sélections. Quelques petits détails:

    - j'apprends sur le tas et il s'agit de ma première vrai macro, je suppose qu'il n'est pas très élégant et optimisé (je me pencherai dessus quand il marchera)
    - si je pars complétement dans le mauvais sens n'hésitez pas à me le dire!
    - le classeur des formateurs peut être modifié à tout moment, des onglets peuvent être rajoutés/supprimés, donc j'ai laissé tombé les références aux nom de feuille et de N° de feuille

    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
    Sub MAJ()
     
    Dernierecolonne = ActiveSheet.UsedRange.Columns.Count
    DerniereLigne = ActiveSheet.UsedRange.Rows.Count
    ' Initialisation(effacement des anciennes données de A3 à AX [X= N°dernière ligne utilisée)
    ' --------------
    Workbooks("tableau statistique formation 2016.xlsm").Activate
    Sheets("statistiques").Select
    Range(Cells(3, 1), Cells(DerniereLigne, Dernierecolonne)).Delete
     
     
    ' Ouverture du fichier planning
    ' -----------------------------
     
    Workbooks.Open "Z:\DOCS\PLANNINGS\Planning 2016\Planning 2016.xlsm"
    ' Création de la boucle
    ' -----------------------------
    Dim Ws As Worksheet
    For Each Ws In ThisWorkbook.Worksheets
            ' Copie des cellules cibles
            Range(Cells(3, 1), Cells(DerniereLigne, Dernierecolonne)).Copy
            ' retour sur fichier principal
            Workbooks("tableau statistique formation 2016.xlsm").Activate
            Sheets("statistiques").Activate
            ' sélection de la dernière ligne vide (pour coller les infos les unes dessous les autres)
            Range("A" & Rows.Count).End(xlUp).Select
            ActiveCell.Offset(1, 0).Select
            ActiveSheet.Paste
            ' retour sur le fichier source et aller à l'onglet suivant
            Workbooks("Planning 2016.xlsm").Activate
            ActiveSheet.Next.Select
    Next Ws
     
     
    End Sub
    La boucle s'arrête après 3 copier/coller, sans raison apparente. Je me demandais si il existait des "maximum" (1 copier/coller représente environs 80 lignes sur 250 colonnes)

    Merci d'avance pour ceux qui se pencherons sur la question

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    explique ce que tu veux faire car ton code à le mérite d'exister mais il a ni queue ni tête!

    je ne vois pas à quoi tu utilise Ws , je ne sais pas ou est la source ou est la cible.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 55
    Points : 49
    Points
    49
    Par défaut
    Salut !
    Alors je suis pas du tout un pro du VBA, je passais par là par hasard^^

    Mais j'ai galéré pour trouver une méthode qui marche bien pour copier des plages de données, et j'ai trouvé un code qui marche pour moi.

    Bon j'ai essayé d'adapter, p'tet que je me suis planté faut que tu vérifies

    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
    Sub MAJ()
     
    Dernierecolonne = ActiveSheet.UsedRange.Columns.Count
    DerniereLigne = ActiveSheet.UsedRange.Rows.Count
    ' Initialisation(effacement des anciennes données de A3 à AX [X= N°dernière ligne utilisée)
    ' --------------
    Workbooks("tableau statistique formation 2016.xlsm").Activate
    Sheets("statistiques").Select
    Range(Cells(3, 1), Cells(DerniereLigne, Dernierecolonne)).Delete
     
     
    ' Ouverture du fichier planning
    ' -----------------------------
     
    Workbooks.Open "Z:\DOCS\PLANNINGS\Planning 2016\Planning 2016.xlsm"
    ' Création de la boucle
    ' -----------------------------
    Dim CopyRange As Range
    Dim PasteRange As Range
     
    Dim Ws As Worksheet
    For Each Ws In ThisWorkbook.Worksheets
            With Workbooks("tableau statistique formation 2016.xlsm").Worksheets("statistiques")
                    ' Copie des cellules cibles
                    Set CopyRange = Ws.Cells(1, 1).Resize(DerniereLigne, Dernierecolonne)
                    ' Colle 
                    Set PasteRange = .Range(.Cells(Rows.Count, 1), .Cells(Rows.Count+ DerniereLigne, Dernierecolonne)) ' Rows.Count je suis pas sûr. Faudra peut-être le remplacer par une Integer qui s'incrémente de DerniereLigne à chaque loop
     
                    PasteRange.Value2 = CopyRange.Value2 ' Value2 je sais plus d'où ca sort !
     
                    ' On vide la mémoire
                    Set CopyRange = Nothing
                    Set PasteRange = Nothing
            End With
    Next Ws
     
     
    End Sub

  4. #4
    Invité
    Invité(e)
    Par défaut
    quelle est la différence entre Workbooks("tableau statistique formation 2016.xlsm") et ThisWorkbook ? il y en a peut être pas mais dis le moi!


    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
     
    Set Wb = Workbooks.Open("Z:\DOCS\PLANNINGS\Planning 2016\Planning 2016.xlsm")
    ' Création de la boucle
    ' -----------------------------
    Dim CopyRange As Range
    Dim PasteRange As Range
     
    Dim Ws As Worksheet
    For Each Ws In ThisWorkbook.Worksheets
            With Wb.heets("statistiques")
                    ' Copie des cellules cibles
                    Set CopyRange = Ws.Cells(1, 1).Resize(DerniereLigne, Dernierecolonne)
                    ' Colle
                    Set PasteRange = .Range(.Cells(Rows.Count, 1), .Cells(Rows.Count + DerniereLigne, Dernierecolonne)) ' Rows.Count je suis pas sûr. Faudra peut-être le remplacer par une Integer qui s'incrémente de DerniereLigne à chaque loop
     
                    PasteRange.Value2 = CopyRange.Value2 ' Value2 je sais plus d'où ca sort !
     
                    ' On vide la mémoire
                    Set CopyRange = Nothing
                    Set PasteRange = Nothing
    Next

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 55
    Points : 49
    Points
    49
    Par défaut
    Alors, selon ce que j'ai capté en manipulant un peu de VBA, Workbooks("tableau statistique formation 2016.xlsm") est une valeur absolue, ça va toujours aller chercher le classeur spécifié en paramètre (il faut qu'il soit ouvert avant je crois).
    Et ThisWorkbook c'est quasiment la même chose, sauf que c'est une valeur qui est relative. Si un autre WorkBook est activé, ThisWorkbook prendra la valeur de ce-dernier.

    (Précision : je dis que c'est une valeur alors que c'est un objet. Ca change rien à l'explication)


    Voilà en l'occurrence vu que t'as 2 classeurs je me suis dis que ça pourrait éviter des confusions.
    Attention ligne 10 With Wb.heets("statistiques") il manque un "S"

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    secretaire
    Inscrit en
    Septembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : secretaire

    Informations forums :
    Inscription : Septembre 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par rdurupt Voir le message
    quelle est la différence entre Workbooks("tableau statistique formation 2016.xlsm") et ThisWorkbook ? il y en a peut être pas mais dis le moi!
    Je voulais que le "thisworkbook" fasse référence au classeur source "Planning 2016" (qui est le dernier sélectionné du coup). Le tableau statistique 2016 est le classeur destinataire.

    (en remplacant "thisworkbook" par "Planning 2016.xlsm" ca me provoque une erreur)

    Le copier/coller de la proposition de Kopros2 m'indique "next sans for".

    comme vous avez pu le constater j'ai monté ce code pas à pas mais j ai du mal.

    L'OBJECTIF:
    Copier la plage"A3:dernière cellule" complétée de chaque feuille du classeur "Planning 2016" vers la feuille "statistiques" du classeur "tableau statistique formation 2016.xlsm", les unes en dessous des autres.

    j'espère être plus clair

  7. #7
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut



    Bonjour !

    Et non : ThisWorkbook correspond au classeur exécutant le code (le conteneur) !



    _________________________________________________________________________________________________________
    Je suis Paris, Nice, Bruxelles, Charlie, …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 55
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    Et non : ThisWorkbook correspond au classeur exécutant le code (le conteneur) !
    Ah ok ! Je pensais qu'on pouvait le changer, au temps pour moi !



    Citation Envoyé par plamouik Voir le message
    Le copier/coller de la proposition de Kopros2 m'indique "next sans for".
    J'avais oublié de remettre le End With, c'est corrigé. J'en profite pour signaler que j'ai fait ça vite fait, je l'ai pas vraiment relu faute de temps, et je suis loin de maîtriser ce langage, donc faut vraiment faire attention avec ce code.

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    secretaire
    Inscrit en
    Septembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : secretaire

    Informations forums :
    Inscription : Septembre 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    , c'est corrigé. J'en profite pour signaler que j'ai fait ça vite fait, je l'ai pas vraiment relu faute de temps, et je suis loin de maîtriser ce langage, donc faut vraiment faire attention avec ce code.
    Merci beaucoup de t y pencher déjà ^^.

    Merci à tous pour vos réponses je sens que ca touche au but. Je ferais des test la semaine prochaine et ne manquerai pas de vous dire ce qu il en est!

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    secretaire
    Inscrit en
    Septembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : secretaire

    Informations forums :
    Inscription : Septembre 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Ton code Kopros, même si il ne provoque pas d'erreur, n'agit pas (même les sélection ou copie ne se font pas) , après "bidouillage" non plus

    En terme d'effet mon code fonctionne (apparemment) mais c'est vraiment "l'effet boucle" qui s'arrête au bout de 3 fois, ce que je n'arrive pas à comprendre.

    Si quelqu'un a une nouvelle idée ^^...

  11. #11
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut


    Un bon code n'utilise pas les affreux ralentisseurs Activate et Select, particulièrement dans une boucle !

    Voir le code du post #4 …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    secretaire
    Inscrit en
    Septembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : secretaire

    Informations forums :
    Inscription : Septembre 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Marc-L Voir le message


    Un bon code n'utilise pas les affreux ralentisseurs Activate et Select, particulièrement dans une boucle !

    Voir le code du post #4 …
    Je tiens juste à préciser que je n'ai pas dit que mon code était bon (sinon je ne serais pas venu), juste qu'il fonctionnait (comme une voiture avec une galette, ca roule à peu près ^^)

    Merci à tous, les aides et indices m'ont permis d'en sortir.

    Finalement le code utilisé qui fonctionne chez moi si ça peut aider d'autres personnes:

    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
    Sub COPIEDONNEES()
     
    'automatise l'ouverture du fichier planning et désigne les classeurs
    Dim wb4 As Excel.Workbook
    Set wb4 = Workbooks.Open("z:\DOCS\PLANNINGS\Planning 2016\planning 2016.xlsx")
    Dim wb1 As Excel.Workbook
    Set wb1 = Workbooks("tableau statistique formation 2016.xlsm")
    Dim wb2 As Excel.Workbook
    Set wb2 = Workbooks("planning 2016.xlsx")
    Dim wb3 As Excel.Workbook
    Set wb3 = Workbooks("tableau statistique formation 2016.xlsm")
     
    'Simplifie le nom de la feuille "statistiques"
    Dim sht As Worksheet
    Set sht = wb1.Sheets("statistiques")
    wb3.Activate
     
    'Détermine la dernière ligne de la feuille active
    Dim LastRow As Long
    LastRow = ActiveSheet.UsedRange.Rows(sht.UsedRange.Rows.Count).Row
     
    'Détermine la dernière colonne de la feuille active
    Dim LastColumn As Long
    LastColumn = ActiveSheet.UsedRange.Columns(sht.UsedRange.Columns.Count).Column
     
    'Suppression du contenu existant dans le fichier statistique
    sht.Range(Cells(3, 1), Cells(LastRow, LastColumn)).Delete
     
     
    ' Création de la boucle
    ' -----------------------------
    wb2.Activate
    Dim ws As Worksheet
    For Each ws In wb2.Worksheets
    ws.Activate
     
    'Détermine la dernière ligne de la feuille active
    Dim DerniereLigne As Long
    DerniereLigne = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
     
    'Détermine la dernière colonne de la feuille active
    Dim DerniereColonne As Long
    DerniereColonne = ActiveSheet.UsedRange.Columns(ActiveSheet.UsedRange.Columns.Count).Column
     
    'Copie du contenu de l'onglet
    ActiveSheet.Range(Cells(3, 1), Cells(DerniereLigne, DerniereColonne)).Copy sht.Range("A" & Rows.Count).End(xlUp).Offset(2)
     
    Next ws
     
     
    End Sub

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

Discussions similaires

  1. Linux, boucle for qui s'arrête : limite mémoire ?
    Par ticad dans le forum Langage
    Réponses: 3
    Dernier message: 18/01/2012, 14h24
  2. Réponses: 10
    Dernier message: 22/07/2011, 00h04
  3. Boucle repeat qui s'arrête au premier enregistrement
    Par Esprit Jeu dans le forum SQL Procédural
    Réponses: 22
    Dernier message: 25/05/2011, 08h48
  4. Client qui se bloque après plusieurs appelles serveur
    Par Takumi dans le forum Windows Communication Foundation
    Réponses: 4
    Dernier message: 15/02/2010, 01h20
  5. Fichier .bat qui s'arrête après une commande
    Par VinnieMc dans le forum Administration
    Réponses: 6
    Dernier message: 28/08/2008, 18h17

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