Icône de la ressource

VBA - Validation par ComboBox dynamique simulant une liste de validation V6

Le fichier à télécharger contient:
  1. Le UserForm ComboBoxValidation à importer dans le projet VBA.
  2. La feuille Feuil1 comme exemple de mise en œuvre.
Note: Voir toutes mes ressources -> https://excel-downloads.com/resources/?creator_id=268468

Les principales caractéristiques:
  • Permet de faire la saisie d'une cellule en simulant une liste de validation.

  • La position de la ComboBox est paramétrable:
    - Soit à gauche de la cellule de saisie,
    - Soit sur la cellule de saisie,
    - Soit à droite de la cellule de saisie.
Remarques:
  • Il est possible et même recommandé si la liste de valeurs est longue, d'ajouter le Module_SaisieFiltréeComboBox au projet VBA pour filtrer la saisie et réduire dynamiquement la liste aux valeurs contenant les mots saisis.
    (Voir la ressource https://excel-downloads.com/resources/vba-saisie-filtree-alias-saisie-intelligente-en-combobox.1319/)
    Insérer le Module et définir #Const SAISIE_FILTRÉE = True

  • Il est possible d'ajouter le Module_ScrollListComboTextBoxes au projet VBA pour le Scroll vertical en ComboBox.
    (Voir la ressource https://excel-downloads.com/resourc...xtbox-activex-en-feuille-et-en-userform.1385/)
    Insérer le Module et définir #Const SCROLL_COMBOBOX = True

  • La ComboBox en UserForm a été préférée à la ComboBox ActiveX car le caractère Modal du UserForm limite les actions utilisateur hors du UserForm et donc simplifie le traitement, mais surtout parce qu'un grave Bug VBA lié à la création dynamique d'un Control ActiveX en interdit l'usage en Office 32 bits.
Mise en œuvre très simple:
  • Insérer dans le Projet VBA:
    - le UserForm ComboBoxValidation

  • Insérer éventuellement dans le Projet VBA:
    - le Module_SaisieFiltréeComboBox (recommandé pour les longues listes de valeurs) et définir #Const SAISIE_FILTRÉE = True
    - le Module_ScrollListComboTextBoxes (moins utile si saisie filtrée) et définir #Const SCROLL_COMBOBOX = True

  • Sur l'évènement Worksheet_SelectionChange(), utiliser la fonction ComboBoxValidation.Création() avec les paramètres ad hoc.
    VB:
    'Constantes de la liste de validation
    Private Const AdresseCelluleSaisie = "D3"
    Private Const FeuilleListeValidation = "Feuil1"
    Private Const AdresseListeValidation = "A2:A10"
    
    '----------------------------------------------------------------------
    'Sur sélection de la cellule sujette à liste de validation par ComboBox
    '----------------------------------------------------------------------
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        If Target.Cells.Count > 1 Then Exit Sub
        If Intersect(Target, Me.Range(AdresseCelluleSaisie)) Is Nothing Then Exit Sub
    
        '=============================================================
        'Appel de la validation par ComboBox dynamique
        'Code à Copier dans la feuille concernée par la saisie Filtrée
        '=============================================================
    
        'Arguments:
        '---------
        ' RangeOrArray:             Range ou une Table des valeurs à 1 ou 2 dimensions
        ' Position:                 Position de la ComboBox par rapport à la cellule
        '                           xlHAlignLeft, xlHAlignRight, xlHAlignCenter (Optionnel, xlHAlignCenter par défaut)
        ' TypeFiltrage:             Si "Module_SaisieFiltréeComboBox" inclus: 0 aucun, 1 premières lettres, 2 contenu partiel (Optionnel, 2 par défaut)
        ' EmptyValueAllowed:        Saisie valeur vide autorisée (Optionnel, True par défaut)
        ' ListRows:                 Propriété ListRows de la ComboBox (Optionnel, 8 par défaut)
        ' OffsetRowsAfterInput:     Décalage lignes après saisie (Optionnel, 1 par défaut)
        ' OffsetColumnsAfterInput:  Décalage colonnes après saisie (Optionnel, 0 par défaut)
    
        'Saisie Liste de Validation avec liste de validation en Range
        Call ComboBoxValidation.Création(Me.Parent.Worksheets(FeuilleListeValidation).Range(AdresseListeValidation), _
                                         EmptyValueAllowed:=False, _
                                         ListRows:=10)
    End Sub
Versions:

Validation.gif
  • J'aime
  • J'adore
Réactions: TooFatBoy et ChTi160