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 de boucle [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2013
    Messages : 72
    Par défaut problème de boucle
    Bonjour,

    Dans un soucis de cohérence orthographique, je souhaite réaliser une petite application qui permets d'extraire uniquement les rues d'une commune.
    Je dispose d'une base de données où se trouvent tant les codes postaux que toutes les rues du pays et pour ce faire je me suis basé sur un exemple développé par Mr Boisgontier.

    Ma clé de recherche est basée sur le code postal qui une fois isolé doit me donner uniquement les rues de cette commune.
    Le problème est que mon application se positionne sur la 1ère de la commune cherchée mais collecte ensuite toutes les rues jusqu'au bas sans sortir de la boucle ainsi que prévu

    Voici mon développement:

    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
    Private Sub rue_Change()
     
    Dim ligne As Long
    Dim derlign As Long
    Set f2 = Sheets("BDD_rues") 
    derlign = f2.Cells(Rows.count, 1).End(xlUp).Row 
    ligne = f2.[E:E].Find(What:=CP).Row 'ici je me positionne sur la 1ère cellule comprenant le CP souhaité
    For i = Cells(ligne, 5).Row To derlign Step 1 
        If Cells(ligne, 5) = Cells(ligne + 1, 5) Then   
            Me.rue.AddItem f2.Cells(ligne, "G")       
        Else    
            Exit For
        End If
    Next i
        Me.rue.DropDown 
     
    End Sub
    merci d'avance pour votre aide

  2. #2
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Bonjour,

    Ci-dessous une proposition de code qui suppose :
    ¤ que les données dans votre feuille Excel commencent à la ligne 2,
    ¤ que les codes postaux sont triés,
    ¤ qu'il n'y a pas de ligne vide avant la fin de votre tableau.

    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
    Private Sub rue_Change()
       Dim ligne As Long, trouv as Boolean
       trouv = False
       With Sheets("BDD_rues")
          ligne = 2
          Do While .Cells(ligne, 5).Text <> ""
             If .Cells(ligne, 5).Text = CP Then trouv = True
             If trouv Then
                If .Cells(ligne, 5).Text <> CP Then Exit Do
                Me.rue.AddItem .Cells(ligne, 7).Text
             End If
             ligne = ligne +1
          Loop
       End With
       Me.rue.DropDown
    End Sub
    Beaucoup de variations sont possibles.
    Mais pour ce type de boucle simple, il est généralement peu utile de surinvestir dans l'optimisation du code.

    Cdt

  3. #3
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 682
    Par défaut
    Bonjour,

    Pour ce qui est de ton problème, pourquoi ne pas utiliser un filtre tout simplement ? En plus d'être simple d'utilisation c'est aussi beaucoup plus rapide qu'une boucle.

  4. #4
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    EDIT

    Mille excuses, Pierre.
    Pendant que je rédigeais ma réponse, j'ai vaqué à une autre occupation, d'où ce télescopage.

    Bonjour,

    Ben

    Mais pour ce type de boucle simple, il est généralement peu utile de surinvestir dans l'optimisation du code
    Pas du tout, mais alors pas du tout d'accord.
    Un code s'optimise dès son départ.
    La rigueur servira à un meilleur développement par la suite et contribuera à une meilleure architecture du projet.
    Quant au Do While cells non vide...

    Halaster,

    Quand bien même les cellules seraient filtrées.
    Une boucle serait à envisager sur les cellules visibles.

    Pour ce qui me semble être la gestion de combobox en cas cade.

    Si tu as une structure de tableaux structurés ainsi conçue

    Nom : Capture_cbxcasc_20201028.JPG
Affichages : 97
Taille : 23,0 Ko

    Alors

    Procédure d'appel placée dans un module standard

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Option Explicit
     
    Sub ESSAI()
    Dim v As Range
    With Usf_choix_ville
            .Cb_Villes.Clear
            For Each v In Worksheets(1).Range("T_VILLES")
                    .Cb_Villes.AddItem v.Value
            Next v
            .Show
    End With
     
    End Sub
    Dans le code affecté au formulaire

    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
    Private Sub Cb_Villes_Change()
    Call filtre_tablostruc(Cb_Villes.Value)
    End Sub
     
    Public Sub filtre_tablostruc(choixville As String)
     
    Dim i As Long
     
    Me.Cb_Rues.Clear
     
    With Worksheets(1)
            For i = 1 To .Range("T_Localiltés[Ville]").Count
                    Debug.Print .Range("T_Localiltés[Ville]").Cells(i, 1).Value
                    If .Range("T_Localiltés[Ville]").Cells(i, 1).Value = choixville Then _
                            Cb_Rues.AddItem .Range("T_Localiltés[Rue]").Cells(i, 1).Value
            Next i
    End With
     
    End Sub
    C'est une base de départ.

    Plus élaborée mais plus performante reste la proposition de Pierre dans ce billet et cette discussion..

    (Gestion des Property...)

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur Méthodes Industrialisation
    Inscrit en
    Octobre 2020
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Méthodes Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2020
    Messages : 39
    Par défaut
    Bonjour propsper02,

    Je suis d'accord avec halaster08 sur le choix d'utiliser les filtres mais je vais corriger (l'erreur que j'ai trouvé) dans ton code malgré tout :

    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
    Private Sub rue_Change()
     
    Dim ligne As Long
    Dim derlign As Long
    Set f2 = Sheets("BDD_rues") 
    derlign = f2.Cells(Rows.count, 1).End(xlUp).Row 
    ligne = f2.[E:E].Find(What:=CP).Row 'ici je me positionne sur la 1ère cellule comprenant le CP souhaité
    For i = Cells(ligne, 5).Row To derlign Step 1 
        'If Cells(ligne, 5) = Cells(ligne + 1, 5) Then   'Tu as utilisé la variable "ligne" dans ton test, mais ligne ne varie pas avec le for. Il faut remplacer par "i"
        If Cells(i, 5) = Cells(i+ 1, 5) Then
            Me.rue.AddItem f2.Cells(ligne, "G")       
        Else    
            Exit For
        End If
    Next i
        Me.rue.DropDown 
     
    End Sub
    Zeabon

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Perso, j'éviterais les boucles et je travaillerais avec des tableaux structurés. C'est pour moi incontournable en 2020 et c'est presque une faute professionnelle de ne pas les utiliser...

    Vu le code que tu montres, j'ai supposé que tu travaillais avec un userform et des combobox pour le choix de la ville puis le choix des rues.

    L'avantage des tableaux structurés, c'est qu'ils permettent un code sans boucle, sans EXIT FOR (Beeeeuuurkkkk) et permettent de créer un code indépendant de l'emplacement des données dans ton classeur.

    Au départ, deux tableaux, un pour les villes et un pour les paires Ville/Rue. A l'appel du userform, ces tableaux seront triés, celui des villes sur les villes, celui des rues sur les villes puis les rues. On alimente le combobox des villes par une ligne de code, et lors du choix d'une ville, on alimente le combobox des rues grâce à 4 lignes de code sans boucle.

    Les deux tableaux structurés, t_Villes et t_Rues

    Nom : 2020-10-27_160312.png
Affichages : 99
Taille : 13,2 Ko

    Le code d'appel du userform (on pourrait rendre les procédures de tri génériques, bien entendu. Ce serait un plus indéniable pour tes développements futurs)
    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
    Sub test()
      With Range("t_Villes").ListObject.Sort
        .SortFields.Clear
        .SortFields.Add Range("t_Villes[Ville]")
        .Apply
      End With
     
      With Range("t_Rues").ListObject.Sort
        .SortFields.Clear
        .SortFields.Add Range("t_Rues[Ville]")
        .SortFields.Add Range("t_Rues[rue]")
        .Apply
      End With
     
      With UserForm1
        .cboCities.List = Range("t_Villes[Ville]").Value
        .Show
      End With
    End Sub
    Le code du userform
    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
    Option Explicit
     
    Private Sub cboCities_Change()
      PrepareCboStreets
    End Sub
     
    Sub PrepareCboStreets()
      Dim Pos As Long, CountOf As Long
      Dim Streets As Range
     
      Pos = Application.Match(cboCities.Value, Range("t_Rues[Ville]"), 0)
      CountOf = Application.CountIfs(Range("t_rues[Ville]"), cboCities.Value)
      Set Streets = Range("t_rues[Rue]")(Pos).Resize(CountOf)
      cboStreets.List = Streets.Value
    End Sub
    Fichiers attachés Fichiers attachés
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut Marcel,

    Pas de soucis. Un forum est un lieu d'échanges et chacun y publie la solution qui lui plait.

    Cela dit, je ne comprends pas pourquoi tu passes par une boucle pour alimenter le combobox des villes alors qu'un combobox expose List pour récupérer un array bien formé (comme une colonne d'une table de données) et Column pour récupérer un arrray transposé (en provenance d'un recordset, par exemple), tout cela en une ligne de code. Les boucles seront toujours plus lourdes que les outils natifs. Je ne vois donc pas le bénéfice de ta méthode.

    Je sais que certains esprits chagrins vont encore imaginer que je joue à qui a la meilleure, mais je pense qu'il faut au maximum utiliser Excel en VBA lorsque c'est possible (voir ma signature ). Si en plus on peut se passer de boucles qui sont toujours chronophages en VBA, autant en profiter.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut Pierre,

    Je n'avais pas consulté les liens en référence.
    Je viens d'ouvrir mon utilitaire et j'ai constaté mon omission. (Propriété List)
    Pire, je 'y avais pas pensé (fin de journée).

    Don't Act.

    Pas fâché

    Pas d'esprit chagrin de la part de Marcel. Pour preuve...

    Et ce jeu là...

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Marcel,

    Ca a permis la piqûre de rappel. C'est donc une bonne chose =>

    PS: Je ne t'oublie pas pour ma visite de l'Italie, mais COVID oblige, c'est reporté sine die, hélas...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Membre confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2013
    Messages : 72
    Par défaut
    Bonjour à tous,

    un grand merci pour votre aide qui m'a permis de régler mon problème et faire un pas en avant grâce à la notion de tableaux structurés.
    Merci aussi pour la correction des erreurs que j'avais commises dans mes lignes de code, çà m'a permis de comprendre, chose essentielle au final

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

Discussions similaires

  1. Problème de boucles imbriquées
    Par Gnux dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 09/12/2005, 20h26
  2. [Tableaux] Problème avec boucle
    Par MYster dans le forum Langage
    Réponses: 6
    Dernier message: 11/11/2005, 18h39
  3. Problème de boucle
    Par TheUltimaSephiroth dans le forum C
    Réponses: 8
    Dernier message: 10/10/2005, 13h58
  4. Problème de boucle
    Par Louis-Guillaume Morand dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/09/2005, 09h10
  5. Problème de boucle
    Par basclln dans le forum C++
    Réponses: 19
    Dernier message: 02/04/2005, 09h13

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