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

Excel Discussion :

Combinaison de listes glissantes multi-sources [Toutes versions]


Sujet :

Excel

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 132
    Points
    132
    Par défaut Combinaison de listes glissantes multi-sources
    Bonsoir à tous,

    J'utilise dans un tableur des listes "glissantes", définies par le biais de cette excellente formule, régulièrement conseillée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =DECALER(feuilleA!$A$2;;;NBVAL(feuilleA!$A:$A)-1;1)
    Je souhaiterai savoir s'il serait possible, pour une nouvelle liste, d'utiliser une combinaison de 2 listes glissantes, issues de 2 feuilles distinctes de mon classeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =DECALER(feuilleA!$A$2;;;NBVAL(feuilleA!$A:$A)-1;1) ET DECALER(feuilleB!$A$2;;;NBVAL(feuilleB!$A:$A)-1;1)
    Je ne sais pas comment écrire ce genre de combinaison (remplacer le "ET" par "&" ou "+" ???)

    D'ailleurs, est-ce seulement possible ?

    Merci à vous !

    Sylvain M.

  2. #2
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Je ne pense pas qu'il existe en fonctions Excel l'équivalent du Union du VBA.

    Même en utilisant INDIRECT pour essayer de simuler une syntaxe du style "A1:A10;E1:E10", ça ne fonctionne pas.
    Pourtant MAX(A1:A10;E1:E10) marche sans problème.

    Donc, je doute qu'il y ait une solution direct à ton problème.

    La solution, si elle existe, viendrait sans doute de la recomposition dans un groupe de cellules adjacentes de la zone convoitée.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 132
    Points
    132
    Par défaut
    Aïe, je me disais bien aussi.
    Maintenant, mes listes sont créées pour être appelées dans un formulaire.
    Donc, si en VBA on peut unir 2 listes, et les utiliser dans une liste déroulante, c'est certainement par là qu'il faut creuser : tu as une idée ?

  4. #4
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Fabriquer une fonction personnalisée en VBA qui utiliserait la fonction Union pour qu'elle soit utilisable dans Excel.
    Mais j'avoue que je n'ai encore jamais tenter d'utiliser une fonction personnalisée dans la cible d'une validation de données de type liste.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

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

    Avec la fonction Fusion(), on écrit

    Private Sub UserForm_Initialize()
    Me.ComboBox1.List = Fusion([tab1], [tab2])
    End Sub




    Si on veut une liste triée

    a=fusion([tab1],[tab2])
    Call Tri(a,1,ubound(a))
    Me.combobox1.list=a

    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
     
    Function Fusion(tab1, tab2, Optional tab3)
     Dim temp()
     Set MonDico1 = CreateObject("Scripting.Dictionary")
     For Each c In tab1
       If c <> "" And c <> 0 Then tmp = c: MonDico1(tmp) = ""
     Next c
     For Each c In tab2
       If c <> "" And c <> 0 Then tmp = c: MonDico1(tmp) = ""
     Next c
     If Not IsMissing(tab3) Then
        For Each c In tab3
         If c <> "" And c <> 0 Then tmp = c: MonDico1(tmp) = ""
        Next c
     End If
     On Error Resume Next
     tmp = Application.Caller.Rows.Count
     If Err = 0 Then ReDim temp(1 To Application.Caller.Rows.Count) Else ReDim temp(1 To MonDico1.Count)
     On Error GoTo 0
     i = 1
     For Each c In MonDico1.keys
        temp(i) = c
        i = i + 1
     Next
     Fusion = Application.Transpose(temp)
    End Function
    Jacques Boisgontier

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 132
    Points
    132
    Par défaut
    Super ça : merci Jacques !
    Ya plus qu'à adapter tout ça à mon classeur/userform !
    Merci !!!

    Sylvain M.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 132
    Points
    132
    Par défaut
    Super Jacques : je suis bien parvenu, grâce à tes codes et ton exemple, à utiliser une fusion de listes dans mon formulaire !
    Je bloque sur un tout petit détail : j'essaie d'utiliser l'option "Tri" que tu propose avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a=fusion([tab1],[tab2])
    Call Tri(a,1,ubound(a))
    Me.combobox1.list=a
    Cependant, il fait appel à une fonction Tri, et quand je regarde ton site (excellent !), je trouve beaucoup de fonctions et ne sais laquelle est adaptée à ce cas.
    Pourrais-tu m'indiquer la fonction de Tri compatible avec ce code ?
    Merci à toi.

    Sylvain M.

  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
    Bonjour,


    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
    50
     
    Private Sub UserForm_Initialize()
      Dim c()
      a = [tab1].Value
      b = [tab2].Value
      c = Fusion(a, b)
      Call tri(c(), LBound(c), UBound(c))
      Me.ComboBox1.List = c
    End Sub
     
    Function Fusion(tab1, tab2, Optional tab3)
     Dim temp()
     Set MonDico1 = CreateObject("Scripting.Dictionary")
     For Each c In tab1
       If c <> "" And c <> 0 Then tmp = c: MonDico1(tmp) = ""
     Next c
     For Each c In tab2
       If c <> "" And c <> 0 Then tmp = c: MonDico1(tmp) = ""
     Next c
     If Not IsMissing(tab3) Then
        For Each c In tab3
         If c <> "" And c <> 0 Then tmp = c: MonDico1(tmp) = ""
        Next c
     End If
     On Error Resume Next
     tmp = Application.Caller.Rows.Count
     If Err = 0 Then ReDim temp(1 To Application.Caller.Rows.Count) Else ReDim temp(1 To MonDico1.Count)
     On Error GoTo 0
     i = 1
     For Each c In MonDico1.keys
        temp(i) = c
        i = i + 1
     Next
     Fusion = temp
    End Function
     
    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
    Jacques Boisgontier

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 132
    Points
    132
    Par défaut
    trop fort : merci !

    Sylvain M.

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

Discussions similaires

  1. Combinaison de liste déroulante pour créer une requete
    Par jeje22 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 11/09/2006, 16h23
  2. Liste déroulante multi colonne
    Par justiniany dans le forum Access
    Réponses: 3
    Dernier message: 11/09/2006, 02h01
  3. [InnoSetup] recuperer la liste des fichiers source
    Par Ben_Le_Cool dans le forum Installation, Déploiement et Sécurité
    Réponses: 5
    Dernier message: 26/07/2006, 17h30

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