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 dans une boucle sans succès


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 114
    Points : 42
    Points
    42
    Par défaut Boucle dans une boucle sans succès
    Bonjour à tous,

    J'essaye de coder une boucle à l'intérieur d,une autre boucle pour réaliser certaines opérations et j'ai un problème.

    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
    Dim Po As Integer
    Po = 1
     
    For Po = 1 To 10
        Selection.AutoFilter Field:=16, Criteria1:="2012"
        Selection.AutoFilter Field:=6, Criteria1:="Po", Operator:=xlAnd
     
        Selection.AutoFilter Field:=15, Criteria1:="=January", Operator:=xlAnd
        Columns("M:M").Select
        Application.CutCopyMode = False
        Selection.Copy
        Sheets("PO").Select
        Range("A1").Select
        ActiveSheet.Paste
        Sheets("Table").Select
        Range("D59").Select
        Application.CutCopyMode = False
        ActiveCell.FormulaR1C1 = "=SUM(PO!C[-3])"
    Next
    Premièrement, je voudrais que la valeur ma variable Po sert à générer un filtre automatique perso. Pour le moment le filtre affiche Po et pas la valeur de 1 à 10.

    Comment faire pour obtenir la valeur?

    J'ai d'autres problème relié à ces boucles mais je commence par celui-ci.

    Merci

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    PS, Evites les Selection et Select
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 114
    Points : 42
    Points
    42
    Par défaut
    haha je me sens un peu gêné tellement c'était facile pour toi Pourrais-tu me dire pourquoi éviter Selection et Select stp.

    Mon autre problème est que je voudrais pouvoir changer mon autre critère de filtre dans une boucle. je voudrais que la valeur January puisse changer automatiquement à February pour couvrir tous les mois de l'année.

    J'ai pensé que ça pourrait ce faire dans une boucle mais je ne sais pas comment écrire le code.


  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Le Select et Selection reste une cause d'instabilité du code pour plusieurs raisons dont la lenteur d’exécution.

    Du moment qu'on peut appliquer une méthode à une plage de cellules, pas besoin de sélectionner d'abord cette plage et ensuite appliquer la méthode à la sélection.

    Exemple d'illustration: Je veux mettre en gras la plage A1:F1 de Feuil1 avec Feuil2 est la feuille active.

    Pou toi, on doit faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sheets("Feuil1").Activate
    Range("A1:F1").Select
    Selection.Font.Bold=True
    Sheets("Feuil2").Activate
    C'est à dire, tu active Feuil1, ensuite tu sélectionne A1:F1, puis tu applique un gras à la plage sélectionnée et enfin tu revient à Feuil2.

    Alors qu'en adressant directement et en appliquant aussi directement la méthode à la plage, on a pas besoin de se soucier de l'activation des feuilles et de la sélection des plages
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil1").Range("A1:F1").Font.Bold=True
    Tu remarque la différence bien sûr.

    Pour ton code, tu commence par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selection.Autofilter...
    La première question qui se pose, de quelle sélection tu parles? et si c'est la bonne plage...
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 114
    Points : 42
    Points
    42
    Par défaut
    En fait j'ai utilisé l'enregistreur de macro pour écrire ce code alors le Selection je ne sais pas à quoi il fait référence. Tout ce que je sais c'est qu'il crée un filtre automatique perso et c'est tout.

    Maintenant j'essaye de créer ma 2e boucle. Je dois faire varier la valeur du critère pour changer mes mois. Chaque mois est précédé d'un chiffre (de 02 jusqu'à 13). J'y arrive presque mais je dois appliqué un filtre "contient" et non "égal".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim month As Integer
    month = "02"
        For month = 2 To 13
            Selection.AutoFilter Field:=15, Criteria1:=month, Operator:=xlAnd
    Je crois que je dois mettre des * autour du critère mais ça ne fonctionne pas vraiment.

    Pouvez vous m'aider???

  6. #6
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Non, ce n'est pas bon ce que tu viens de dire et de faire

    Avant de continuer quoique ce soit, tu dois d'abord connaitre ce que Selection désigne.

    En fait tu veux filtrer une plage de cellule X appartenant à une feuille Y.

    Pour la 2ème question, on se met d'abord d'accord sur le chemin à suivre et en fin de compte tout sera bénéfique et doucement mais surement.
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 114
    Points : 42
    Points
    42
    Par défaut
    D'accord on peut faire comme ça.

    Les termes Selection veulent simplement dire je crois que j'ai sélectionné le filtre et que j'ai désigné mes critères.

  8. #8
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Non, je voulais dire à quoi fait référence Selection dans ton code.
    ça doit être une plage de cellule X sélectionnée appartenant à une feuille Y.

    Le filtre automatique est appliqué à cette plage X

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("BD").Range("A1:X4000").AutoFilter Field:=16, Criteria1:=2012
    On filtre la plage A1:X4000 de la feuille BD sur la 16ème colonne avec comme critère la valeur 2012.

    Maintenant, appliquons ceci à ton fichier sans utiliser le terme vague Selection
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 114
    Points : 42
    Points
    42
    Par défaut
    Est-ce que je dois absolument écrire une valeur de Range? Puisque je filtre toute ma feuille à partir de la colonne 16.

    Est-ce que ça pourrait être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Invoices compiled").AutoFilter field:=16, Criteria1:="2012"

  10. #10
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Non, la méthode autofilter est doit être appliquée à une plage de cellules et non à une feuille.

    Ci-après un exemple qui permet de copier des cellules issues d'un autofiltre vers une autre feuille (avec boucle sur le critère Po)
    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
    Sub CopiePlageFiltree()
    Dim LastLig As Long
    Dim Sh As Worksheet
    Dim Po As Byte
     
    Application.ScreenUpdating = False
    With Worksheets("Invoices compiled")
        'On efface l'éventuel filtre automatique
        .AutoFilterMode = False
        'Ligne de la dernière cellule remplie de la colonne 1
        LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
        Set Sh = Worksheets("Po")
        For Po = 1 To 10
            'On applique le filtre avec critères sur colonne 6, 15 et 16
            With .Range("A1:P" & LastLig)
                .AutoFilter Field:=6, Criteria1:=Po
                .AutoFilter Field:=15, Criteria1:="January"
                .AutoFilter Field:=16, Criteria1:=2012
            End With
            'On copie les cellules visibles de la colonne M successivement vers la première cellule vide de la colonne 1 de la feuille nommée Po
            .Range("M1:M" & LastLig).SpecialCells(xlCellTypeVisible).Copy Sh.Cells(.Rows.Count, 1).End(xlUp)(2)
        Next Po
        Set Sh = Nothing
        .AutoFilterMode = False
    End With
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 114
    Points : 42
    Points
    42
    Par défaut
    J'adore l'exemple...cependant je dois faire varier le critère "January" pour être en mesure d'utiliser tous les mois de l'année un après l'autre.

    Mes mois sont écrit comme suis...
    02 - February
    03 - March
    .
    .
    .
    13 - January

    Donc j'essaie de mettre en place un filtre "contient" 02, 03, 04...etc jusqu'à 13.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim Po As Integer
    Dim month As Integer
     
    Worksheets("Invoices compiled").Range("A1:X65000").AutoFilter field:=16, Criteria1:="2012"
     
     
    For Po = 1 To 10
     
        Selection.AutoFilter field:=6, Criteria1:=Po, Operator:=xlAnd
     
        For month = "02" To 13
            Selection.AutoFilter field:=15, Criteria1:=*month*, Operator:=xlAnd
    Mais tout ce que j'obtient c'est le mot "month" dans le filtre.

    Je suis vraiment coincé...

    J'ai essayé de changé mes valeurs de mois par:
    12 - February
    13 - March
    .
    .
    .
    23 - January

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        For month = 12 To 23
            Selection.AutoFilter field:=16, Criteria1:=month, Operator:=xlAnd
    Je veux créer un filtre automatique élaboré "contient" mais je n'y arrive pas.

    Comment faire???

  12. #12
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Quand tu seras en mesure de prendre en consideration la Remarque non fortuite sur la necessite de ne plus travailler Avec Selection, on en parlera sur la suite
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 114
    Points : 42
    Points
    42
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Worksheets("Invoices compiled").Range("A1:X65000").AutoFilter field:=17, Criteria1:="2012"
     
    For Po = 1 To 10
     
        Selection.AutoFilter field:=6, Criteria1:=Po, Operator:=xlAnd
     
        For month = 12 To 23
            With .Range("A1:X65000")
            .AutoFilter
            Selection.AutoFilter field:=16, Criteria1:="*" & month & "*"
    Ce n'est pas que j'ai pas essayé...mais ça ne fonctionne pas une fois rendu à .Range ça indique une erreur...

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 114
    Points : 42
    Points
    42
    Par défaut
    Dans el fond Selection ahis comme le pointeur de la souris et ça sélectionne et alourdis le manipulations que je cherche à coder.

    Mais j'ai de la difficulté à ne pas utilisé le générateur de macro automatique.

  15. #15
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    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
    Sub CopiePlageFiltree()
    Dim Po As Byte, Mo As Byte
    Dim LastLig As Long
    Dim Sh As Worksheet
    Dim TbMois
     
    Application.ScreenUpdating = False
    TbMois = Array("02 - February", "03 - March", "13 - January")    'Adapte ici la totalité de tes mois
    With Worksheets("Invoices compiled")
        .AutoFilterMode = False
        LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
        Set Sh = Worksheets("Po")
        With .Range("A1:P" & LastLig)
            .AutoFilter Field:=16, Criteria1:=2012
            For Po = 1 To 10
                .AutoFilter Field:=6, Criteria1:=Po
                For Mo = 0 To UBound(TbMois)
                    .AutoFilter Field:=15, Criteria1:=TbMois(Mo)
                    If .Range("M1:M" & LastLig).SpecialCells(xlCellTypeVisible).Count > 1 Then .Range("M2:M" & LastLig).SpecialCells(xlCellTypeVisible).Copy Sh.Cells(.Rows.Count, 1).End(xlUp)(2)
                Next Mo
            Next Po
        End With
        Set Sh = Nothing
        .AutoFilterMode = False
    End With
    End Sub
    PS: sans aucune explication pour l'instant
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

Discussions similaires

  1. Utilisation d'une boucle dans une boucle
    Par caramon _majere dans le forum Langage
    Réponses: 5
    Dernier message: 27/09/2014, 21h37
  2. Une boucle dans une proc stock s'arrête sans raison
    Par eric.bryan dans le forum Développement
    Réponses: 6
    Dernier message: 12/06/2014, 17h01
  3. [XL-2003] faire une boucle dans une boucle VBA
    Par the-geut dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/04/2010, 15h06
  4. [PHP 5.0] Manipulation XML une boucle dans une boucle
    Par lepotier dans le forum Langage
    Réponses: 2
    Dernier message: 10/03/2010, 12h15
  5. Creer une boucle dans une requête ???
    Par fdloisel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/10/2004, 14h05

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