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 :

Usf Cascade2nivTries - pb d'adaptation à mon cas


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 631
    Points : 255
    Points
    255
    Par défaut Usf Cascade2nivTries - pb d'adaptation à mon cas
    Bonjour,
    J'ouvre une 2ème discussion, car je ne l'ai pas poté dans le bon Forum (Merci à Marc L ).
    je voudrais utiliser un outil proposé par Jacques Boisgontier, mais je n'arrive pas à l'adapter à mon cas, tout au moins la partie tri, que je ne comprends pas du tout...
    Est-ce quelqu'un peut me l'expliquer svp, et me corriger les déclarations. Merci
    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
    Sub TriCascad()
    Dim f   as Worksheets
    Dim MonDico As Scripting object
    Dim c As Object
    Dim temp   'table temporaire du dico
    Dim a, gauc, droi   'variables des tris
    Dim ref, g, D      
    Sub Tri(a, gauc, droi) 
       ref = a((gauc + droi) \ 2)
       g = gauc: D = droi
       Do
          Do While a(g) < ref: g = g + 1: Loop
          Do While ref < a(D): D = D - 1: Loop
          If g <= D Then
            temp = a(g): a(g) = a(D): a(D) = temp
            g = g + 1: D = D - 1
         End If
       Loop While g <= D
       If g < droi Then Call Tri(a, g, droi)
       If gauc < D Then Call Tri(a, gauc, D)
    End Sub
    Quand je fais du pas à pas, tout se déroule bien, jusqu'à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     temp = a(g): a(g) = a(D): a(D) = temp
    où "g=2 et D=2, a(g) et a(D)" renvoient "Incompatibilité de type"

    Merci de votre aide.

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour,
    je vois bien une déclaration de a (en variant), mais je n'en vois nulle part l'initialisation !
    cette variable a, de type variant (puisque non spécifié), n'est donc pas un tableau et a(index) n'a donc aucun sens, quel que puisse être la valeur de index ...
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  3. #3
    Membre actif
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 631
    Points : 255
    Points
    255
    Par défaut
    Bonjour Unparia,
    Merci de ta réponse,
    Pourtant, dans l'exemple de J Boisgontier (Form_Cascade2NivTrie.xls), cela fonctionne bien

  4. #4
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Désolé, mais je n'ouvre jamais un classeur tiers (quelle qu'en puisse être la provenance).
    Je ne peux que réitérer ce que je t'ai dit de cette variable a.

    Et je doute TRES FORT que l'auteur de cet exemple (connu pour être sérieux) ait écrit dans la même procédure cette déclaration de a, sans l'initialiser et en l'utilisant ensuite comme s'il s'agissait d'un tableau !
    Je lui laisse le soin, s'il passe par là, de réagir à ce que tu affirmes sans sourciller.

    EDIT : et je viens de relire (inconfortablement car présenté entre balises citation et non balises code) ton bout de code.
    Et c'est quoi ? la première procédure sans End Sub ?
    Je doute TRES FORT que l'auteur ait pu faire une telle erreur !
    Et je devine non moins fortement que l'auteur a, lui, défini dans une autre procédure une variable qu'il passe en paramètre à la procédure tri (la variable a, précisément).
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  5. #5
    Membre actif
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 631
    Points : 255
    Points
    255
    Par défaut
    bonjour Unparia,
    Voici la copie complète du code de J Boisgontier, qui fonctionne très bien avec son exemple.
    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
    Dim f
    Private Sub UserForm_Initialize()
      Set f = Sheets("base")
      Set MonDico = CreateObject("Scripting.Dictionary")
      For Each c In f.Range("B2:B" & f.[B65000].End(xlUp).Row)   ' on explore la colonne de niveau 1
        MonDico(c.Value) = ""                                    ' on ajoute l'élément de la famille au dictionnaire
      Next c
      temp = MonDico.keys      'les clés du dico dans la table temp()
      Call Tri(temp, LBound(temp), UBound(temp))
      Me.Famille.List = temp
    End Sub
    Private Sub famille_click()
      Me.SousFamille.Clear
      Set MonDico = CreateObject("Scripting.Dictionary")
      For Each c In f.Range("B2:B" & f.[B65000].End(xlUp).Row)      ' on explore la colonne de niveau 1
         If c = Me.Famille Then MonDico(c.Offset(, 1).Value) = ""   ' si famille alors on ajoute l'élément de la sous-famille au dictionnaire
      Next c
      temp = MonDico.keys        'les clés du dico dans la table temp()
      Call Tri(temp, LBound(temp), UBound(temp))
      Me.SousFamille.List = temp
    End Sub
    Sub Tri(a, gauc, droi) ' Quick sort
       ref = a((gauc + droi) \ 2)
       g = gauc: D = droi
       Do
          Do While a(g) < ref: g = g + 1: Loop
          Do While ref < a(D): D = D - 1: Loop
          If g <= D Then
            temp = a(g): a(g) = a(D): a(D) = temp
            g = g + 1: D = D - 1
         End If
       Loop While g <= D
       If g < droi Then Call Tri(a, g, droi)
       If gauc < D Then Call Tri(a, gauc, D)
    End Sub
    Peut-être y a-t-il un autre moyen de trier des combo en chaine ?
    Merci

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    faire une méthode de trié? quelle drôle d’idée!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test() Set SL1 = CreateObject("System.Collections.SortedList")
        For i = 10 To 0 Step -1
       If SL1.ContainsKey(i) = False Then SL1.Add i, CStr(i)
       Next
     For i = 0 To 10
     Debug.Print SL1(SL1.GetKey(i))
     Next
    End Sub

  7. #7
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour dysorthographie (et toute mon amitié)
    Il y a des cas "où" (le demandeur n'écrit pas au hasard) et des cas "où non" (hé oui ... il écrit ... pour écrire ...et ne semble même pas avoir compris que si l'on veut trier, il faut d'abord savoir - et avoir défini- ce que l'on veut trier ) ...
    Je crains que nous ne soyons là dans le cas "où non" (celui qui fait que je me sauve à toutes jambes.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  8. #8
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonsoir,

    >faire une méthode de trié? quelle drôle d’idée!

    1- System.Collections.SortedList n'est pas présent sur toutes les PC.
    2- Cette méthode est moins rapide qu'un tri Quick-Sort (Pour 10.000 items avec Contains: 4 fois + lent)


    -a,gauc, droi sont des paramètres de la procédure TRI() et non pas des variables
    -temp, ref, g,d sont des variables de la procédure de tri. Si on les déclare, c'est DANS la procédure qu'il faut les déclarer.

    Boisgontier
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. [XL-2010] Usf Cascade2nivTries - adaptation à mon cas
    Par mouftie dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/09/2016, 14h25
  2. CDlive Router dans mon cas
    Par Death83 dans le forum Développement
    Réponses: 1
    Dernier message: 11/10/2005, 16h34
  3. adapter mon application a l'anglais
    Par fatima dans le forum ASP
    Réponses: 2
    Dernier message: 30/09/2005, 14h53
  4. [Débutant][JList] Comment ça marche dans mon cas ?
    Par gcore dans le forum Composants
    Réponses: 31
    Dernier message: 28/06/2004, 10h45
  5. Quel type de BDD dans mon cas
    Par zoubidaman dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 10/06/2004, 18h00

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