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 macro excel 2007 sur une boucle [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Gérant d'une entreprise
    Inscrit en
    Août 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Gérant d'une entreprise

    Informations forums :
    Inscription : Août 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Problème macro excel 2007 sur une boucle
    Bonjour a tous,

    Je suis débutant en macro

    Je viens vers vous pour résoudre un problème sur une macro en boucle

    je vous détail ce que je veux faire :

    Dans un onglet j'ai un tableau avec une liste. je veux reclasser chaque ligne de ce tableau dans différents tableaux selon des critères différents.

    J'utilise une boucle pour traiter ligne par ligne mon tableau avec ma liste.

    voici ma 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
    Sub liste() 
     
    Sheets("D05" ).Select 
     
    FindeLigne = ActiveSheet.UsedRange.Rows.Count + 1 
    Numeroligne = 1 
    Co = Sheets("FEmai" ).Range("A4" ).End(xlDown).Row + 1 
    Co1 = Sheets("FEmai" ).Range("A33" ).End(xlDown).Row + 1 
    Co2 = Sheets("FEmai" ).Range("A58" ).End(xlDown).Row + 1 
    Co3 = Sheets("FEmai" ).Range("A208" ).End(xlDown).Row + 1 
     
    While Numeroligne < FindeLigne 
     
    Sheets("D05" ).Select 
    Range("A" & Numeroligne, "J" & Numeroligne).Select 
    Selection.Copy 
     
    If Sheets("D05" ).Range("I" & Numeroligne).Value = "AMB" Then 
    Sheets("FEmai" ).Select 
    Range("A" & Co).Select 
    ActiveSheet.Paste 
    Range("A4" ).Select 
    End If 
     
    If Sheets("D05" ).Range("I" & Numeroligne).Value = "T" Then 
    Sheets("FEmai" ).Select 
    Range("A" & Co1).Select 
    ActiveSheet.Paste 
    Range("A4" ).Select 
    End If 
     
    If Sheets("D05" ).Range("I" & Numeroligne).Value = "TM" Then 
    Sheets("FEmai" ).Select 
    Range("A" & Co2).Select 
    ActiveSheet.Paste 
    Range("A4" ).Select 
    End If 
     
    If Sheets("D05" ).Range("I" & Numeroligne).Value = "VSL" Then 
    Sheets("FEmai" ).Select 
    Range("A" & Co3).Select 
    ActiveSheet.Paste 
    Range("A4" ).Select 
    End If 
     
    Numeroligne = Numeroligne + 1 
     
    Wend

    Mon problème vient d'une ligne de ma macro à partir du 2ème tour de ma boucle car au 1er tour tt marche correctement.

    Voici la ligne qui beug :sachant que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Co = Sheets("FEmai" ).Range("A4" ).End(xlDown).Row + 1
    (idem pour Co1 Co2 et Co3)

    Mon souci vient du +1 car je veux sélectionner la première cellule vide de la colonne "A" pour coller à la suite de mon tableau la ligne avec le critère demander.
    Donc sur le 1er tour la première tt se passe comme je veux.
    Mais sur le deuxième tour la macro ne prend pas en consédration le +1, la cellule qu'elle selection est la derniére cellule du tableau qui est rempli.

    Si quelqu'un peut m'aider ça serai super sympa.
    J'espère avoir été claire dans mes explication.

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Points : 14 363
    Points
    14 363
    Par défaut
    Bonjour,

    Quel est le message d'erreur ?

  3. #3
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Bonjour,

    difficile de t'aider ton code n'est pas vraiment lisible...


    tout d'abords tu pourrais le rendre plus lisible en supprimant les instructions Selection, Select , ActiveSheet , Range (sans préfixe...)

    Lorsque tu utilise Range précise TOUJOURS de qu'elle feuille il s'agit .. ,tu n'as pas besoin de sélectionner une cellule pour agir dessus.

    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sheets("FEmai" ).Select 
    Range("A" & Co).Select 
    ActiveSheet.Paste
    deviens

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("FEmai" ).Range("A" & Co).Paste

    pense aussi à lire et reporter ici les message d'erreur d'Excel...

  4. #4
    Membre expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 869
    Points : 3 442
    Points
    3 442
    Billets dans le blog
    1
    Par défaut
    Bonjour à tous,

    néo tu dis
    Mon souci vient du +1 car je veux sélectionner la première cellule vide de la colonne "A" pour coller à la suite de mon tableau...
    Tu peux te positionner par une boucle en testant si la valeur de la cellule est vide. Pour tester la valeur d'une cellule il est plus facile d'utiliser l'objet Cells plutôt que Range Comme par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Posit()
        Dim Lign As Long
        Dim Col As Integer
        Lign = 1
        Col = 1                       'N° de la Colonne
        Sheets("Feuil1").Select
        Do While Cells(Lign, Col).Value <> ""
            Lign = Lign + 1
        Loop
        MsgBox "N° ligne : " & Lign
    End Sub
    Sinon quelque conseils :
    - essaye d'indenter ton code avec des tabulations il en sera plus lisible
    Ton code devient sans rien changer
    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
    Sub liste()
     
        Sheets("D05").Select
     
        FindeLigne = ActiveSheet.UsedRange.Rows.Count + 1
        Numeroligne = 1
        Co = Sheets("FEmai").Range("A4").End(xlDown).Row + 1
        Co1 = Sheets("FEmai").Range("A33").End(xlDown).Row + 1
        Co2 = Sheets("FEmai").Range("A58").End(xlDown).Row + 1
        Co3 = Sheets("FEmai").Range("A208").End(xlDown).Row + 1
     
        While Numeroligne < FindeLigne
     
            Sheets("D05").Select
            Range("A" & Numeroligne, "J" & Numeroligne).Select
            Selection.Copy
     
            If Sheets("D05").Range("I" & Numeroligne).Value = "AMB" Then
                Sheets("FEmai").Select
                Range("A" & Co).Select
                ActiveSheet.Paste
                Range("A4").Select
            End If
     
            If Sheets("D05").Range("I" & Numeroligne).Value = "T" Then
                Sheets("FEmai").Select
                Range("A" & Co1).Select
                ActiveSheet.Paste
                Range("A4").Select
            End If
     
            If Sheets("D05").Range("I" & Numeroligne).Value = "TM" Then
                Sheets("FEmai").Select
                Range("A" & Co2).Select
                ActiveSheet.Paste
                Range("A4").Select
            End If
     
            If Sheets("D05").Range("I" & Numeroligne).Value = "VSL" Then
                Sheets("FEmai").Select
                Range("A" & Co3).Select
                ActiveSheet.Paste
                Range("A4").Select
            End If
     
            Numeroligne = Numeroligne + 1
     
        Wend
    End Sub
    - depuis plusieurs années je n'utilise plus While ... Wend mais Do ... Loop qui est plus pratique (possibilité de sortir de la boucle avant la fin) et je l'ai appris depuis peu la boucle While ... Wend est la boucle la plus lente.

    - essaye également comme te l'a dit bbil evite les .select (quand tu peux)

    A bientôt

  5. #5
    Candidat au Club
    Homme Profil pro
    Gérant d'une entreprise
    Inscrit en
    Août 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Gérant d'une entreprise

    Informations forums :
    Inscription : Août 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup pour vos explications.

    je vais essayer de rendre plus lisible mon code

    Concernant le message d'erreur, il n'y en a pas, c'est juste que lors de la deuxième boucle l'étape qui consiste à se placer sur la première ligne VIDE du tableau ne fonctionne plus,
    la sélection de la cellule se trouve sur la dernière ligne ECRITE de mon tableau se qui fait que le collage efface une ligne avec des données.

    Si vous voyez une explication à cela merci de me la communiquer pendant ce temps je vais prendre en considération tt vos remarque pertinente pour améliorer mon code.

    Merci encore pour avoir pris temps à m'expliquer certaines choses

  6. #6
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Points : 14 363
    Points
    14 363
    Par défaut
    Bonjour,

    Le calcul de Co et autres ne se trouve pas à l'intérieur de la boucle. Donc sa valeur n'évolue pas. Mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    While Numeroligne < FindeLigne
        Co = Sheets("FEmai").Range("A4").End(xlDown).Row + 1
        Co1 = Sheets("FEmai").Range("A33").End(xlDown).Row + 1
        Co2 = Sheets("FEmai").Range("A58").End(xlDown).Row + 1
        Co3 = Sheets("FEmai").Range("A208").End(xlDown).Row + 1
        Sheets("D05").Select
        Range("A" & Numeroligne, "J" & Numeroligne).Select
        Selection.Copy
     
        If Sheets("D05").Range("I" & Numeroligne).Value = "AMB" Then
        Sheets("FEmai").Select
        Range("A" & Co).Select
    Méfie-toi aussi de "UsedRange". La plage peut être plus importante que celle de tes données.

  7. #7
    Candidat au Club
    Homme Profil pro
    Gérant d'une entreprise
    Inscrit en
    Août 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Gérant d'une entreprise

    Informations forums :
    Inscription : Août 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup Daniel mon problème est résolu.

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

Discussions similaires

  1. [VBA] utilisation d'une macro excel 2003 sur excel 2004 for mac
    Par fofika dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 08/11/2007, 16h30
  2. ASP petit problème à propos sur une boucle if
    Par nicodu59 dans le forum ASP
    Réponses: 2
    Dernier message: 02/08/2007, 11h21
  3. [MySQL] problème sur une boucle for
    Par leclone dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 28/12/2006, 11h33
  4. Réponses: 11
    Dernier message: 19/06/2006, 17h54
  5. Problème sur une boucle
    Par Mateache dans le forum ASP
    Réponses: 6
    Dernier message: 31/01/2006, 10h48

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