Problème code VBA liste déroulante "BD"

Bonjour / Bonsoir

j'aurais besoin de votre aide.

J'ai un soucis avec une macro Vba, quand j'appuis sur le boutton " crée les listes nommées" cela me créé une cellules Liste en "H1" Ainsi que toute les donner insérais dans A2 a F24 , le soucis et que quand j'ajoute un nouveau niveau cela fait planter mon code vba a la ligne 29 celle en jaune, j'ai pourtant essayer de modifier le plus possible mais cela étais encore pire, donc si une personne a un solution je serais heureux merci beaucoup de votre aide .

test

Voici le fichier

11test-list-1.xlsm (79.23 Ko)

Bonjour TheTuto

Il faudrait peut-être en suivre un "Tuto" sur la méthode pour avoir de l'aide

Plus sérieusement, sans fichier cela va s’avérer très compliqué

@+

Bonjours BrunoM45 Merci de m'avoir répondu

je n'ai pas très bien compris il faut que je transfère mon fichier excel ?

Re,

Oups, je crois que j'ai les yeux pleins de "caca" je n'ai pas vu ton fichier tout en haut de l'image

@+

Re,

Oups, je crois que j'ai les yeux pleins de "caca" je n'ai pas vu ton fichier tout en haut de l'image

@+

Ne t'en fais pas c'est juste moi qui avais oublié de l'ajouté ^^ désolé

Re,

Voici le code corrigé

Sub CreeListeBD()
  colBD = 1
  colListe = 8
  Set f = Sheets("bd")
  ligne = 1
  f.Cells(ligne + 1, colListe).Resize(1000, 10).Clear
  Set mondico = CreateObject("Scripting.Dictionary")
  For Each c In Range(f.Cells(2, colBD), f.Cells(65000, colBD).End(xlUp))
    mondico(c.Value) = c.Value
  Next c
  f.Cells(ligne, colListe) = "Liste"
  f.Cells(ligne, colListe).Font.Bold = True
  f.Cells(ligne + 1, colListe).Resize(mondico.Count) = Application.Transpose(mondico.items)
  ActiveWorkbook.Names.Add Name:="Liste", RefersTo:=f.Cells(ligne + 1, colListe).Resize(mondico.Count)
  '---- niv 2,3,..
  For niv = 2 To 5                               ' adapter le nombre de niveaux
    colBD = colBD + 1
    colListe = colListe + 2
    ligne = 1
    For Each c In Range(f.Cells(2, colListe - 2), f.Cells(65000, colListe - 2).End(xlUp))
      If c <> "" And c.Font.Bold <> True Then
        Set mondico = CreateObject("Scripting.Dictionary")
        For Each d In Range(f.Cells(2, colBD), f.Cells(65000, colBD).End(xlUp))
          If d.Offset(, -1) = c Then mondico(d.Value) = d.Value
        Next d
        f.Cells(ligne, colListe) = c
        f.Cells(ligne, colListe).Font.Bold = True
        f.Cells(ligne + 1, colListe).Resize(mondico.Count) = Application.Transpose(mondico.items)
        Dim sNom As String
        sNom = Replace(c, " ", "_")
        If IsNumeric(Left(sNom, 2)) Then sNom = "_" & sNom
        ActiveWorkbook.Names.Add Name:=sNom, RefersTo:=f.Cells(ligne + 1, colListe).Resize(mondico.Count)
        ligne = ligne + mondico.Count + 1
      End If
    Next c
  Next niv
End Sub

Le problème était que tu voulais donner un nom commençant par un chiffre "2000x1500" par exemple

Et ça, Excel n'aime pas

J'ai donc mis un underscore en premier si ça commence par un chiffre, mais tu peux mettre autre chose

@+

Re,

Voici le code corrigé

Sub CreeListeBD()
  colBD = 1
  colListe = 8
  Set f = Sheets("bd")
  ligne = 1
  f.Cells(ligne + 1, colListe).Resize(1000, 10).Clear
  Set mondico = CreateObject("Scripting.Dictionary")
  For Each c In Range(f.Cells(2, colBD), f.Cells(65000, colBD).End(xlUp))
    mondico(c.Value) = c.Value
  Next c
  f.Cells(ligne, colListe) = "Liste"
  f.Cells(ligne, colListe).Font.Bold = True
  f.Cells(ligne + 1, colListe).Resize(mondico.Count) = Application.Transpose(mondico.items)
  ActiveWorkbook.Names.Add Name:="Liste", RefersTo:=f.Cells(ligne + 1, colListe).Resize(mondico.Count)
  '---- niv 2,3,..
  For niv = 2 To 5                               ' adapter le nombre de niveaux
    colBD = colBD + 1
    colListe = colListe + 2
    ligne = 1
    For Each c In Range(f.Cells(2, colListe - 2), f.Cells(65000, colListe - 2).End(xlUp))
      If c <> "" And c.Font.Bold <> True Then
        Set mondico = CreateObject("Scripting.Dictionary")
        For Each d In Range(f.Cells(2, colBD), f.Cells(65000, colBD).End(xlUp))
          If d.Offset(, -1) = c Then mondico(d.Value) = d.Value
        Next d
        f.Cells(ligne, colListe) = c
        f.Cells(ligne, colListe).Font.Bold = True
        f.Cells(ligne + 1, colListe).Resize(mondico.Count) = Application.Transpose(mondico.items)
        Dim sNom As String
        sNom = Replace(c, " ", "_")
        If IsNumeric(Left(sNom, 2)) Then sNom = "_" & sNom
        ActiveWorkbook.Names.Add Name:=sNom, RefersTo:=f.Cells(ligne + 1, colListe).Resize(mondico.Count)
        ligne = ligne + mondico.Count + 1
      End If
    Next c
  Next niv
End Sub

Le problème était que tu voulais donner un nom commençant par un chiffre "2000x1500" par exemple

Et ça, Excel n'aime pas

J'ai donc mis un underscore en premier si ça commence par un chiffre, mais tu peux mettre autre chose

@+

C'est vraiment génial de ta part j'ai passé une journée, mes je n'ai rien compris en fait c'étais tout bête ^^ Vraiment merci a toi tu me sauve la vie , mais je comprend pas pourquoi mon Choix 5 ne marche pas alors qu'il est bien relier a ma liste étrange non ?

test 5

Arf,

Vu le code que j'ai mis, la donnée de validation à mettre est

=INDIRECT("_" & V5)

Bonjour à tous,

Une proposition sans VBA.

Réalisé avec Récupérer et transformer (Power Query).

Prévoir le café et le doliprane.

Cdlt.

10test-list-1.xlsx (30.83 Ko)

holà

C'est presque ça Bruno , j'ai effectivement remplacer la formule ça fonctionne. Seulement le choix 3 ne donne pas les bonnes valeur , il donne un résultat à partir du mot qu'il trouve dans le choix 2, mais il oublie finalement le trie qu'on n'a effectuer dans le choix 1 , du coup pareil pour le choix 4 et 5, si on recherche seulement ce que nous propose "PIERRE" nous ne devrions avoir qu'un seul choix possible dans toutes les cases.

Merci à toi Jean-Eric pour ton aide mais ce n'est pas une liste dynamique ,

j'ai mis des détails dans le Excel ci-dessous :

11test-list1.xlsm (77.79 Ko)

Bonjour,

Que veux-tu dire par non dynamique ?

Ta solution n'est pas dynamique : tu dois cliquer sur un bouton.

Toutes les données sont sous forme de tableaux structurés (dynamiques).

Pour la solution Power Query, c'est : Ruban, Données, Actualiser tout...

Et si tu veux actualiser avec un bouton :

Public Sub RefreshQueries()
    ThisWorkbook.RefreshAll
End Sub

Cdlt.

10test-list-1-1.xlsm (38.87 Ko)

Bonjour,

Un petit retour ?

Cdlt.

Bonjour,

Que veux-tu dire par non dynamique ?

Ta solution n'est pas dynamique : tu dois cliquer sur un bouton.

Toutes les données sont sous forme de tableaux structurés (dynamiques).

Pour la solution Power Query, c'est : Ruban, Données, Actualiser tout...

Et si tu veux actualiser avec un bouton :

Public Sub RefreshQueries()
    ThisWorkbook.RefreshAll
End Sub

Cdlt.

Test List 1 (1).xlsm

Hey Jean-Eric , pour commencer excuse-moi de ne pas avoir répondu plutôt, j'avais des problèmes des famille.

Ce que je veux dire par dynamique, c'est que mon filtre doit marcher à partir de ma liste, je te montre un exemple :

Je tiens à te remercier car c'est super gentil à toi de vouloir m'aider.

excel
5test-filtre.xlsm (42.94 Ko)
Rechercher des sujets similaires à "probleme code vba liste deroulante"