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

Macros et VBA Excel Discussion :

[ERREUR '50290'] Validation des données


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur géomaticien
    Inscrit en
    Juillet 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur géomaticien

    Informations forums :
    Inscription : Juillet 2015
    Messages : 34
    Points : 24
    Points
    24
    Par défaut [ERREUR '50290'] Validation des données
    Bonjour à tous !

    Je suis en train de développer une macro VBA qui doit fonctionner de concert avec des validations de données de type liste.
    Pour expliquer simplement, je paramètre une validation de données sur une cellule que l'utilisateur doit remplir et la liste déroulante associée doit adapter ses propositions en fonction de ce que l'utilisateur saisit (un peu à la manière d'une auto-complétion).

    Nom : 1.jpg
Affichages : 123
Taille : 38,7 Ko

    Je passe donc par un appel à l'écouteur d'évènement Worksheet_change afin de modifier dynamiquement la liste, stockée dans une autre feuille, qui est ensuite référencée par la validation de données.

    Ce mécanisme fonction bien sauf dans un cas, à savoir si l'utilisateur commence à saisir dans la cellule en question et, sans clôturer sa saisie par appui sur Entrée, clique sur la flèche de la liste déroulante. Si l'utilisateur valide sa saisie puis déroule la liste dans un second temps, pas de problème. Mais dans le premier cas, la macro plante sur le premier appel à une fonction Range et indique l'erreur suivante :

    Nom : 2.jpg
Affichages : 88
Taille : 34,4 Ko

    J'ai trouvé de nombreuses références sur le net concernant ce problème pour des possibles résolutions mais rien de satisfaisant en lien spécifiquement avec la validation des données. Pour le moment, je n'ai réussi qu'à stopper l'exécution par une gestion d'exception On Error afin d'éviter la fenêtre de bug mais c'est un peu près tout...
    Auriez-vous une solution pour prendre en charge ce cas ?

    Merci par avance pour votre aide !

    Jean

  2. #2
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    pour déformer une expression consacrée : pas de code, pas de chocolat

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur géomaticien
    Inscrit en
    Juillet 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur géomaticien

    Informations forums :
    Inscription : Juillet 2015
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par joe.levrai Voir le message
    pour déformer une expression consacrée : pas de code, pas de chocolat
    Fair enough
    Je vais essayer de compiler un code minimal reproduisant le problème.

  4. #4
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Salut,

    Sans VBA.
    Pour ma part, je base ma liste de validation sur une colonne de tableau structuré en lui affectant la méthode Indirect.

    =INDIRECT("Tableau1[Id]")
    Ce processus permet une grande souplesse.
    En effet, il suffit de modifier les données de la colonne du tableau structuré pour obtenir une liste de validation source modifiée automatiquement.

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  5. #5
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut.


    Avec la situation suivante:

    Nom : 2021-04-08_201820.png
Affichages : 80
Taille : 14,0 Ko

    J'ai aussi cette erreur dès que je cherche à modifier la liste de validation "en cours de saisie". Ca me semble normal car tu tentes de court-circuiter la validation d'Excel... Je pense qu'il n'est pas possible de réaliser ce que tu souhaites avec une liste de validation. Il faut obligatoirement valider la cellule PUIS ouvrir la liste.

    Voici le code que j'ai écrit pour le test:
    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
    Sub PrepareList()
      Dim i As Long
      Dim j As Long
     
      On Error GoTo Catch
      If Not Range("t_Liste").ListObject.DataBodyRange Is Nothing Then Range("t_Liste").ListObject.DataBodyRange.Delete
      For i = 1 To Range("tableau2").Rows.Count
        If UCase(Range("tableau2[Prénom]")(i).Value) Like "*" & UCase(Range("e4").Value) & "*" Then
          j = Range("t_Liste").ListObject.ListRows.Add.Index
          Range("t_Liste[Liste]")(j).Value = Range("tableau2[Prénom]")(i).Value
        End If
      Next
     
    Catch:
    End Sub
    Dans mon code, j'ai capturé l'erreur, et j'ai bien évidemment dû désactiver l'alerte pour donnée invalide. Je note aussi que ce code génère une erreur sur Application.ScreenUpdating = False lorsqu'on le met en début de la macro PrepareList, ce qui est une indication d'un télescopage entre notre macro et le moteur d'Excel.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Dommage que tu n'es pas en XL365, car avec cette version, ça devient possible, et sans VBA

    1. Utiliser FILTRE pour récupérer les données qui contiennent la saisie dans la cellule sur laquelle on a posé la liste de validation;
    2. Appuyer la liste de validation sur la plage # renvoyée par FILTRE, c'est-à-dire l'adresse de la première cellule suivie de #.


    Nom : 2021-04-08_204051.png
Affichages : 86
Taille : 62,4 Ko

    Nom : 2021-04-08_204207.png
Affichages : 104
Taille : 13,6 Ko



    On peut alors obtenir ce que tu souhaites sans plantage, même en cliquant de suite sur la flèche de la liste durant la saisie

    Nom : 2021-04-08_204229.png
Affichages : 101
Taille : 55,1 Ko

    Nom : 2021-04-08_204304.png
Affichages : 83
Taille : 52,8 Ko
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Membre à l'essai
    Homme Profil pro
    Ingénieur géomaticien
    Inscrit en
    Juillet 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur géomaticien

    Informations forums :
    Inscription : Juillet 2015
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Merci pour vos réponses !
    De mon côté je gère les listes de validation un peu différemment, car j'aurai besoin en production de mettre des listes de validation sur chaque ligne.
    Voilà un exemple minimal qui plante, effectivement sans doute à cause d'un conflit entre le système de validation et du code permettant de remplir la liste.
    Ça a l'air mal barré d'après vos retours mais je vais du coup détailler pour voir s'il y a moyen de faire autrement.

    Structure du fichier Excel
    • Une feuille Input contenant la validation en A2 (qui pourra ensuite être dupliquée en A3, A4, etc.)
    • Une feuille Aux contenant la liste utilisée par la validation en ligne 2 (qui pourra ensuite accueillir les listes suivantes en lignes 3, 4, etc.)

    Nom : Input.jpg
Affichages : 80
Taille : 19,2 Ko Nom : Auxi.jpg
Affichages : 81
Taille : 19,4 Ko

    Paramétrage de la validation des données
    Pour le paramétrage de la liste déroulante en A2, je définis dans le Gestionnaire de nom trois formules.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    p_v = Aux!$A2 'Position de la première valeur de la liste
    l_v = Aux!2:2 'Ligne comportant les valeurs de la liste
    f_v = DECALER(p_v;0;0;1;NBVAL(l_v)) 'La liste des valeurs sans les blancs à la fin
    f_v est la formule que je définis dans la validation des données de type liste.

    Nom : Validation.jpg
Affichages : 90
Taille : 40,3 Ko

    Macro VBA
    Le but de la macro est de mettre à jour dynamiquement la liste de validation (valeurs dans Aux!2:2 donc) afin de correspondre aux premières lettres de la saisie de l'utilisateur.
    Cela passe par l'écouteur d'évènement Workspace_Change sur la feuille Input.
    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
    'Dans Feuil1 (Input)
    Private Sub Worksheet_Change(ByVal target As Range)
        'Action only if the cell containing the data validation is triggered
        If target.Row = 2 And target.Column = 1 Then
            Update_based_on_input target
        End If
    End Sub 'Worksheet_Change
     
    Private Sub Update_based_on_input(ByVal cell As Range)
        'City list
        Const nb_cities = 5
        Dim cities(0 To nb_cities) As String
        cities(0) = "Marseille"
        cities(1) = "Meaux"
        cities(2) = "Miramas"
        cities(3) = "Paris"
        cities(4) = "Pau"
        cities(5) = "Troyes"
     
        'Search cities in list which match the start of the input
        Dim filtered_list() As String
        current_input = cell.Value
        nb_matches = 0
        For i = 0 To nb_cities
            element = cities(i)
            search_match = InStr(1, element, current_input, vbTextCompare)
            If search_match = 1 Then
                nb_matches = nb_matches + 1
                ReDim Preserve filtered_list(0 To nb_matches - 1)
                filtered_list(nb_matches - 1) = element
            End If
        Next i
     
        'Write the city list on the range for validation
        For i = 0 To nb_matches - 1
            Worksheets("Aux").Cells(2, i + 1).Value = filtered_list(i)
        Next i
     
        'Erase the other cells
        For i = nb_matches To nb_cities
            Worksheets("Aux").Cells(2, i + 1).Value = ""
        Next i
    End Sub 'Update_based_on_input
    L'erreur
    L'erreur '50290' se produit lors de la tentative d'écriture sur la plage asservie à la liste de validation si l'utilisateur ne valide pas la saisie.
    Nom : Error.jpg
Affichages : 76
Taille : 22,4 Ko

    J'ai joint à ce message le fichier Excel complet présentant ce test.

    Je crois avoir compris la problématique... Mais y aurait-il une solution selon vous ?
    Grand merci pour votre aide !
    Fichiers attachés Fichiers attachés

  8. #8
    Membre à l'essai
    Homme Profil pro
    Ingénieur géomaticien
    Inscrit en
    Juillet 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur géomaticien

    Informations forums :
    Inscription : Juillet 2015
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Dommage que tu n'es pas en XL365, car avec cette version, ça devient possible, et sans VBA
    Je suis obligé de faire avec Excel 2016
    En effet, l'idée est de partager le fichier avec des collègues qui auront la charge de le remplir et tout le monde utilise cette version...

Discussions similaires

  1. [XL-2019] Personnaliser les messages d'erreur de validation des données
    Par Dioon dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 17/03/2021, 06h27
  2. Réponses: 16
    Dernier message: 29/06/2016, 14h11
  3. [XL-2007] Validation des données par enrgeistrement => Erreur défiinie par l'App ou l'Objet
    Par mouftie dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/05/2015, 11h21
  4. Réponses: 2
    Dernier message: 05/10/2012, 12h51
  5. Validation des données et notification d'erreurs
    Par Loki13 dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 13/09/2008, 10h37

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