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 for next


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2016
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Boucle for next
    Bonjour à tous,

    Petit nouveau sur ce forum et en VBA, j'ai tenté une 1er expérience et ça m'a permis de faire un bon de géant. Vraiment super.

    Je reviens à la charge avec un autre bout de code qui me bloque. C'est ma 1er boucle que je fais, et je n'arrive pas à trouver le problème. C'est une boucle que j'aimerais qui me réalise la chose suivante:

    1 - Choisir deux critère dans la feuil 1, le mois en en ligne 12 avec colonne incrémenté de i +1, et l'année en ligne 11 avec la même incrémentation.
    2 - Appliquer le filtre sur les données en feuil2
    3 - Recueillir la valeur max des données filtrées
    4 - Mettre le résultat en feuil 1 à la ligne 53 avec colonne incrémenté i+1

    Recommencer la procédure de i = 2 à 14...

    Voici le code. C'est certainement pas le plus beau en ville, mais je commence tranquillement à mieux comprendre le code...

    Merci d'avance pour votre aide!!

    ** Note, le code marche num. 1 sans la boucle...


    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 max_baseUS_offre_2()
     
    'Met à jour la valeur max des bases $US des offres reçus
    Dim Max As Double
    Dim i As Integer
     
     
    For i = 2 To 14
     
     
    'Premier critère de filtre par mois en colonne 17 dans enregistrement
    Worksheets("Enregistrements").Range("$A$3:$AB$17").AutoFilter Field:=17, _
    Criteria1:=ActiveSheet.cell(12, i).Value, VisibleDropDown:=False
     
    'Deuxième critère de filtre par annee en colonne 19 dans enregistrement
    Worksheets("Enregistrements").Range("$A$3:$AB$17").AutoFilter Field:=19, _
    Criteria1:=ActiveSheet.cell(11, i).Value, VisibleDropDown:=False
     
    'Déterminer la valeur maximum de la plage obtenu
    Max = WorksheetFunction.Max(Sheets("Enregistrements").Range("h4:h1048572").SpecialCells(xlCellTypeVisible))
     
    'Placer le résultat à la bonne place dans le feuille active
    ActiveSheet.Range.Cells(53, i) = Max
     
    'Désactiver le filtre dans enregistrement
    Worksheets("Enregistrements").AutoFilterMode = False
     
    Next i
    Do While i < 14
    i = i + 1
     
    Loop
     
    End Sub

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 634
    Points
    28 634
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Un filtre répond à des critères.
    Est-ce vraiment utile de passer par une procédure VBA, avec boucles de surcroît, pour connaître la valeur maximale de données filtrées (donc répondant à des critères) alors qu'une simple fonction BDMAX peut faire l'affaire ?
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2016
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Effectivement, j'avais envisagé cette solution, mais mon premier objectif est davantage d'apprendre à mieux maîtriser le VBA, et non nécessairement d'utiliser dans ce cas-ci la meilleure solution. Ici, mon idée était surtout de faire un 1er test de boucle pour voir comment elles fonctionnent...

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 634
    Points
    28 634
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    mon premier objectif est davantage d'apprendre à mieux maîtriser le VBA, et non nécessairement d'utiliser dans ce cas-ci la meilleure solution
    Dans ce cas, au lieu d'utiliser la fonction SOMME d'excel, tu peux également créer un code VBA avec une boucle
    Je crois sincèrement que si tu veux apprendre le VBA, une bonne maîtrise d'excel est un plus et te permettra de vraiment exploiter ce langage là où excel n'apporte pas de réponses satisfaisante ou automatiser une tâche répétitive faite manuellement et la parfaite connaissance du produit réduit le temps de programmation et de maintenance.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2016
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Je joins l'utile à l'agréable...

    J'aime mieux faire des tests essai erreur sur des choses qui m'intéressent, que sur des formules simples reproduites d'Excel. Le défi stimule la curiosité et l'apprentissage.

    Ceci dit, je comprends très bien votre suggestion.

    C'est dire que mon code est donc vraiment encore loin du compte et certainement pas ce qu'il y a de plus propre, pas plus qu'approprié pour une boucle...

    Merci

  6. #6
    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,

    Juste une petite astuce

    La variable i (idem pour j, k, l, m ...) étant mis pour tout il est important de ne les garder que pour l'incrémentation de tableaux exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Vid_Tab()
        Dim Tablo(1 To 10) As String
        Dim i As Byte
        For i = 1 To 10
            Tablo(i) = ""
        Next
    End Sub
    pour toi i c'est l'incrémentation de tes colonnes
    Je te conseille pour colonne la variable "Col" et pour ligne : "Lign"

    Ce n'est pas vital c'est juste plus facile à lire et surtout à maintenir

    Attention

    Concernant les noms de variables il ne faut jamais utiliser les mots réservés


    Voici ce que cela pourrait donner avec ton 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
    Sub max_baseUS_offre_2()
     
    'Met à jour la valeur max des bases $US des offres reçus
    Dim Max As Double
    Dim col As Integer
     
     
    For col = 2 To 14
     
     
    'Premier critère de filtre par mois en colonne 17 dans enregistrement
    Worksheets("Enregistrements").Range("$A$3:$AB$17").AutoFilter Field:=17, _
    Criteria1:=ActiveSheet.cell(12, col).Value, VisibleDropDown:=False
     
    'Deuxième critère de filtre par annee en colonne 19 dans enregistrement
    Worksheets("Enregistrements").Range("$A$3:$AB$17").AutoFilter Field:=19, _
    Criteria1:=ActiveSheet.cell(11, col).Value, VisibleDropDown:=False
     
    'Déterminer la valeur maximum de la plage obtenu
    Max = WorksheetFunction.Max(Sheets("Enregistrements").Range("h4:h1048572").SpecialCells(xlCellTypeVisible))
     
    'Placer le résultat à la bonne place dans le feuille active
    ActiveSheet.Range.Cells(53, col) = Max
     
    'Désactiver le filtre dans enregistrement
    Worksheets("Enregistrements").AutoFilterMode = False
     
    Next col
    Do While col < 14
    col = col + 1
     
    Loop
     
    End Sub
    Concernant tes boucles je vois que tu as compris que la boucle For n'a pas besoin d'incrémentation puisque c'est inclus dans le "Next" et que la boucle "Do" elle en a besoin

    MAIS

    dans ton code la boucle "Do" ne s'exécute jamais parce que quand tu sort du "For" ta variable à déjà 14 !

    Voilà

    A+
    Ils ne savaient pas que c'était impossible ... du coup ils l'ont fait (Mark Twain)

    n'oubliez pas de si les messages vous aide ou sont pertinents et de mettre quand cela est !

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2016
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci pour ces explications. J'en apprend toujours plus et j'adore. En retournant dans ce bout de code, j'ai mis en application tes suggestions et ça fonctionne. Très bonne idée aussi pour l'identification des variables en Col.

    Seul hic, mon filtre semble filtrer dans le vide puisque je n'obtiens aucun résultat sauf un 0 tout bête là où il devrait y avoir un résultat. Quand je surveiller l'exécution de la macro, je constate d'ailleurs que mes filtres signal 0 résultats obtenus sur 14 enregistrements filtrés à chaque loop.

    Je me demande si c'est ma variable max qui pose problème, ou plutôt le recueille du critère de référence du filtre dans l'autofilter...

    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
    Sub max_baseUS_offre()
     
    'Met à jour la valeur max des bases $US des offres reçus
    Dim Max As Double
    Dim col As Integer
     
    For col = 2 To 14
     
    Worksheets("Enregistrements").AutoFilterMode = False
     
    'Premier critère de filtre par mois en colonne 17 dans enregistrement
    Worksheets("Enregistrements").Range("$A$3:$AB$17").AutoFilter Field:=19, _
    Criteria1:="=ActiveSheet.cell(11, col).Value", VisibleDropDown:=False
     
    'Deuxième critère de filtre par annee en colonne 19 dans enregistrement
    Worksheets("Enregistrements").Range("$A$3:$AB$17").AutoFilter Field:=17, _
    Criteria1:="=ActiveSheet.cell(12, col).Value", VisibleDropDown:=False
     
    'Déterminer la valeur maximum de la plage obtenu
    Max = WorksheetFunction.Max(Sheets("Enregistrements").Range("h4:h1048572").SpecialCells(xlCellTypeVisible))
     
    'Placer le résultat à la bonne place dans le feuille active
    ActiveSheet.Cells(53, col) = Max
     
     
    Next col
    Do While col < 14
    col = col + 1
     
    Loop
    'Désactiver le filtre dans enregistrement
    Worksheets("Enregistrements").AutoFilterMode = False
     
    End Sub

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

Discussions similaires

  1. les boucles for..next
    Par dispa dans le forum Windows Forms
    Réponses: 3
    Dernier message: 27/06/2007, 14h23
  2. boucle for next ? peut être mais comment
    Par caro2552 dans le forum VBA Access
    Réponses: 11
    Dernier message: 07/02/2007, 20h26
  3. [VB.net] Boucle for next avec un tableau
    Par grand_prophete dans le forum Windows Forms
    Réponses: 4
    Dernier message: 31/05/2006, 11h08
  4. [VB6] Problème contrôle Timer et boucle For-Next ...
    Par Stéphane BEHMENBURG dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 01/12/2005, 17h36
  5. Réponses: 3
    Dernier message: 03/11/2005, 19h22

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