Excel combobox listfillrange propriété pointant sur une formule à base de plage nommée a des problèmes
ActiveX zone de liste déroulante des objets dans Excel ne se comportent pas bien quand leur ListFillRange fait référence à une formule à base de Plage Nommée (Nom Défini).
Je pense que j'ai rencontré d'autres erreurs et même, éventuellement, Excel se bloque grâce à cela, mais pour l'instant, tout ce qui arrive est la combobox_change() événement est déclenché à tout moment n'IMPORTE quelle cellule du classeur est changé.
Je ne suis pas sûr si c'est vraiment un bug, ou si il y a une solution, ou une solution de contournement. Si c'est un bug, comment dois-je le signaler à l'Excel de personnes?
Et enfin, de la vraie chair de ma question est "Comment puis-je contourner ce problème le mieux?" J'aimerais avoir une formule basée sur des plages nommées, mais il semble comme ce ne sera pas possible.
Pour reproduire ce problème, procédez de la manière suivante:
- Créer un nouveau classeur. Sur Feuil3 créer un petit tableau de 3 colonnes à travers, et de plusieurs rangées de haut.
- Créer une plage nommée avec cette formule (ou un équivalent): =DECALER(Feuil3!$A$2:$C$36,0,0,COUNTA(Feuil3!$A:$A),NBVAL(Feuil3!$4:$4)) Pour ce faire, utilisez l'Entrée>Nom>Définir. Nom de la plage de quelque chose comme "demoRange"
- Aller à la feuille "Sheet1" et de créer une zone de liste déroulante, (il doit être sur une feuille séparée). (Utiliser le Contrôle de la boîte à outils menu, pas le menu Formulaires).
- Cliquez sur le bouton Mode création (le triangle bleu avec un crayon), puis à droite, cliquez sur la liste déroulante, puis cliquez sur Propriétés.
- Dans la fenêtre de propriétés de la zone de liste déroulante changer le ListFillRange de la propriété de sorte qu'elle pointe vers la plage nommée que vous avez créé à l'étape 2 ("demoRange").
- Vous pouvez modifier la propriété ColumnCount à 3, et le largeurcolonne (columnwidths) à la propriété "50,50,50"
- Définissez la propriété linkedCell à la cellule "A1" en tapant A1 dans la propriété linkedCell.
- Fermer la fenêtre propriétés, et double-cliquez sur la zone de liste déroulante pour définir son évolution() de l'événement.
- Mettre un Débogage.Assert(false) ou Msgbox("demo") dans le sous-programme pour la nouvelle zone de liste déroulante de l'événement de changement.
- Quitter le mode création
- important - Maintenant, sélectionnez un élément dans la zone de liste déroulante. L'événement devrait déclencher normalement la première fois. (Le bug n'affichera pas si vous ne le faites pas cette étape, quelque chose doit être sélectionné dans la liste déroulante)
- Modifier des cellules de n'importe où dans le classeur [Edit] ou de toute autre classeur ouvert [/edit], sur une feuille et de n'importe quel endroit. Chaque fois que vous modifiez n'importe quelle cellule, (au moins pour moi), l'événement onchange de la zone de liste déroulante exécuter.
Encore une fois, est-ce normal, et quelle est la meilleure solution pour ce que je suis en train de faire? Cette zone de liste déroulante obtient liés à différentes cellules, et est censé être un remplacement pour le petit de police dans la validation des données des listes déroulantes excel fournit par défaut.
OriginalL'auteur Kimball Robinson | 2009-08-11
Vous devez vous connecter pour publier un commentaire.
Mon conseil est de ne jamais utiliser ListFillRange et LinkedCell. Ils sont juste de l'ennui. Remplir de votre zone de liste avec la Liste et utilisez l'événement de Changement pour écrire dans la cellule. Quelque part, peut-être l'événement "Workbook_Open", remplir la zone de liste
Puis dans l'événement de changement dans la Feuil2 module, vérifiez que quelque chose a été cliqué et l'écrire dans la cellule
OriginalL'auteur Dick Kusleika
J'ai un peu d'options disponibles que je suis conscient de ce jour. Le mieux que je puisse vous arriver, c'est ça:
Éviter directement à l'aide de la formule basée sur les plages nommées. Au lieu de cela, définir une sous-routine qui va vérifier si la plage "demoRange" devrait être changé à partir de ce que sa valeur actuelle est. Exécutez cette sous-routine sur le workbook_open et sheet3_deactivate événements. Si nécessaire, demander à l'utilisateur pour lui demander si c'est tout droit à la mise à jour de la plage nommée. [modifier] La macro que les mises à jour "demoRange" pourrait probablement juste de copier à partir d'un "demoRange_FormulaBased" plage nommée dans "demoRange" qui serait statique. [/edit]
Cette solution fonctionne bien parce que vous pouvez continuer d'utiliser la propriété linkedcell, vous n'avez pas à utiliser VBA pour remplir les zones de liste modifiables, et la plage nommée peut encore être utilisé pour toutes les autres fins, elle avait déjà. Évitez d'utiliser l'événement onchange pour exécuter cette nouvelle sous-routine, car il pourrait finir par être déclenché des milliers de fois, si un utilisateur ouvre le dialogue Rechercher/Remplacer et choisit "Remplacer Tout".
Ma solution était peut-être pas clair à partir de ci-dessus. Vous pouvez créer deux plages nommées, dont l'une est basée sur une formule. Une macro peut faire quelque chose comme les noms.add("staticName", Thisworkbook.noms("formulaBasedName").refersto) à chaque fois que vous souhaitez mettre à jour la statique de la plage nommée. La zone de liste modifiable listfillrange peut ensuite point à la staticName plage nommée, de désactiver l'excel bug je l'ai indiqué ci-dessus.
OriginalL'auteur Kimball Robinson