Excel VBA, perte d'accès listes déroulantes

Fermé
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 - Modifié par mic13710 le 6/11/2011 à 16:20
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 - 6 nov. 2011 à 18:45
Bonjour,

Voila une info qui peut servir.

J'ai été confronté comme certains au problème de disparition des listes déroulantes.
Comme par exemple sur ce fil :
https://forums.commentcamarche.net/forum/affich-10527777-excel-liste-deroulante-qui-ne-deroule-plus
J'ai cherché un bon moment quelle pouvait en être la cause et je pense avoir trouvé d'où vient le problème.
En fait, il semble que la flèche d'accès associée aux listes déroulantes ne soit pas créée avec la liste mais soit attachée en tant qu'objet à la feuille initiale.
Et c'est là tout le problème, car si on élimine toutes les formes de la feuille avec VBA comme ceci :

Dim img As Object 
For Each img In ActiveSheet.Shapes 
         img.Delete 
Next

celle de la flèche d'accès aux listes déroulantes est elle aussi définitivement éliminée. Il est alors impossible d'activer les listes ou d'en créer de nouvelles dans la feuille et je n'ai pas trouvé de solution pour la restituer, hormis celle de recopier l'ensemble de la feuille sur une nouvelle, comme cela a été suggéré dans le fil ci-dessus.

Pour pallier ce problème, il suffit simplement de ne pas supprimer cette fameuse forme et le tour est joué !

Le nom donné par Excel à cette forme étant "Drop Down xx", (xx sont des numéros d'ordre), la macro devient alors :

Dim img As Object 
For Each img In ActiveSheet.Shapes 
    If Not img.Name Like "Drop*" Then 
         img.Delete 
    End If 
Next

Ainsi, le forme "liste déroulante" n'est pas supprimée de la feuille et les listes fonctionnent normalement.



Michel
A voir également:

1 réponse

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776
6 nov. 2011 à 17:32
Bonjour,

Il serait plus logique d'écrire :
Dim shp As Shape
For Each shp In ActiveSheet.Shapes
  If shp.Type <> msoFormControl Then
    shp.Delete
  End If
Next

Pour identifier les DropDown :
For Each shp In ActiveSheet.Shapes
  If shp.Type = msoFormControl Then
    If shp.FormControlType = xlDropDown Then
      MsgBox shp.Name
    End If
  End If
Next
0
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 354
6 nov. 2011 à 18:45
Salut Patrice,

Effectivement, c'est infiniment mieux adapté.
C'est certain que la qualité de mon code laisse à désirer et je vais de ce pas corriger le mien dans mon appli.
Le but de mon message était surtout de donner une piste à ceux qui comme moi ont eut la désagréable expérience de voir leurs listes disparaitre et de ne pas savoir pourquoi.
Mais effectivement, le msoFormControl est beaucoup plus efficace puisqu'il concerne toutes les formes de la feuille et pas seulement les listes.

Merci pour cet apport.

Michel
0