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 :

Valeur Textbox non prise en compte


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier Avatar de alain78
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Points : 97
    Points
    97
    Par défaut Valeur Textbox non prise en compte
    Bonjour à toutes et à tous.

    24h de recherches et je ne trouve ni ne comprend l'erreur.

    Dans une userform j'ai une frame qui contient 2 textbox.

    Nom : test1.JPG
Affichages : 148
Taille : 20,8 Ko

    L'une permet de saisir un nom et l'autre une quantité.
    Ce qui est attendu :

    Si Click sur le bouton plus ==> insertion d'un nouvel item de la listbox active avec Nom dans la colonne 0 et Quantité dans la colonne 1. Ceci fonctionne correctement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub bouton_ajout_Click() 'ajouter un nouvel item dans listbox
        ref_aliment = Me.aliments_liste.ListCount
     
                    Me.aliments_liste.AddItem
                    Me.aliments_liste.List(ref_aliment, 0) = aliment_nom.Value
                    Me.aliments_liste.List(ref_aliment, 1) = aliment_quantite.Value
     
    End Sub
    Si Clik sur le bouton OK ==> remplacement pour l'item sélectionné dans la listbox du Nom (colonne0) et de Quantité (colonne1). Cela ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub bouton_plus_Click() ' modifier item dans listbox
        Me.aliments_liste.List(ref_aliment, 0) = aliment_nom
        Me.aliments_liste.List(ref_aliment, 1) = aliment_quantite
     
    End Sub
    Ce qui se passe.
    - dans la listbox la valeur du nom est bien remplacée. OK
    - dans la listbox la valeur de quantité n'est pas remplacée

    Précisions ;
    1/ ma variable ref_aliment est bien déclarée comme Public
    2/ en mode debug je constate que dans ma ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Me.aliments_liste.List(ref_aliment, 1) = aliment_quantite
    la variable aliment_quantité conserve son ancienne valeur et ignore la valeur nouvelle.
    3/ J'ai essayé avec ou sans l'attribue .value pour la textbox: rien ne change

    Je me perd en conjectures comme dirait Michel Audiard !

    Si vous voyez l'explication de ce mystère, je suis preneur.

    Merci pour votre aide.

    Bon weekend de Pâques.
    Images attachées Images attachées   
    Donnes un poisson à un homme tu le nourris un jour, apprends lui à pécher tu le nourris toute sa vie.

  2. #2
    Membre régulier Avatar de alain78
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Points : 97
    Points
    97
    Par défaut Une piste
    J'ai pu voir ce qui se produit mais je ne comprend pas pourquoi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    1	Private Sub aliments_liste_Click()
    2	    aliment_nom = Me.aliments_liste.List(Me.aliments_liste.ListIndex, 0)
    3	    aliment_quantite = Me.aliments_liste.List(Me.aliments_liste.ListIndex, 1)
     
    4	    ref_aliment = Me.aliments_liste.ListIndex
     
    5	End Sub
     
    6	Private Sub bouton_plus_Click() ' modifier item dans listbox
    7	    Me.aliments_liste.List(ref_aliment, 0) = aliment_nom
     
    8	    Me.aliments_liste.List(ref_aliment, 1) = aliment_quantite
     
    9	End Sub

    Ainsi :
    Un clic sur le bouton + ouvre la sub en ligne 6
    la valeur aliment_nom est bien récupérée et affecté à l'index de la listbox qui a été modifié. Si le nom a changé le nouveau nom est donc affecté à l'index.
    Puis après le code en ligne 7 le programme se reroute vers la ligne 1 ???? Pourquoi puisqu'on n'a pas cliqué A NOUVEAU sur aliment_list
    C'est donc dans cette sub que Excel affecte à aliment_quantité sa valeur qui existe dans aliment_liste sans tenir de celle saisie compte dans la textbox aliment_quantite.
    Puis il retourne en ligne 9

    Donc Je comprend que lorsque en ligne 6 on affecte une valeur à liste_aliment Excel assimile ça à un évènement click. Est ce bien cela ?
    Donnes un poisson à un homme tu le nourris un jour, apprends lui à pécher tu le nourris toute sa vie.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par alain78 Voir le message
    Bonjour,

    Utilisez la propriété ListIndex pour modifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       With Me.aliments_liste
            .List(.ListIndex, 0) = aliment_nom
            .List(.ListIndex, 1) = aliment_quantite
       End With

  4. #4
    Membre régulier Avatar de alain78
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Points : 97
    Points
    97
    Par défaut
    Citation Envoyé par Eric KERGRESSE Voir le message
    Bonjour,

    Utilisez la propriété ListIndex pour modifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       With Me.aliments_liste
            .List(.ListIndex, 0) = aliment_nom
            .List(.ListIndex, 1) = aliment_quantite
       End With
    Merci Eric.
    Cela ne provoque pas de blocage et semble se dérouler correctement sauf que ma liste n'est pas actualisée. Mais le résultat est le même.
    après avoir executé le code dans la procédure Private Sub bouton_plus_Click()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     .List(.ListIndex, 0) = aliment_nom
    il execute ensuite la procédure Private Sub aliments_liste_Click() dans laquelle il récupère les valeurs initiales nom et quantité qui annulent les valeurs saisies.

    J'ai contourné cette erreur que je ne m'explique pas en initiant une variable à 1 lorsque qu'on demande la modification. Puis lorsqu'on arrive sur la procédure Private Sub aliments_liste_Click() il ne l'execute pas si cette variable = 1.

    Ce n'est pas très correct mais au moins cela fonctionne jusqu'à ce que je trouve une solution correcte.

    Merci pour votre aide.

    A suivre .....

    Bonne fin de journée.
    Donnes un poisson à un homme tu le nourris un jour, apprends lui à pécher tu le nourris toute sa vie.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par alain78 Voir le message
    Il n'y a pas de raison que cela fonctionne chez moi et pas chez vous une fois sélectionné l'item dans la ListBox. Regardez la valeur de vos variables en insérant un Debug.print et en ouvrant la fenêtre exécution (Ctrl-G) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       Debug.Print "Nom : " & aliment_nom & ", quantité : " & aliment_quantite
       With Me.aliments_liste
            .List(.ListIndex, 0) = aliment_nom
            .List(.ListIndex, 1) = aliment_quantite
       End With

  6. #6
    Membre régulier Avatar de alain78
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Points : 97
    Points
    97
    Par défaut
    Bonjour, et Merci Eric

    J'ai déroulé la procédure en mode pas à pas avec un arrêt sur chaque ligne de code. Voici le résultat dans le tableau.

    Pour faciliter la lecture de ma réponse, voici le code incriminé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub aliments_liste_Click()
        aliment_nom = Me.aliments_liste.List(Me.aliments_liste.ListIndex, 0)
        aliment_quantite = Me.aliments_liste.List(Me.aliments_liste.ListIndex, 1)
        ref_aliment = Me.aliments_liste.ListIndex
    End Sub
    Private Sub bouton_plus_Click() ' modifier item dans listbox
       With Me.aliments_liste
            .List(.ListIndex, 0) = aliment_nom
            .List(.ListIndex, 1) = aliment_quantite
       End With
    End Sub



    ACTION DE L'UTILISATEUR

    L'utilisateur sélection dans liste_aliments l'item 1 nom_aliment="curcuma" ce qui a pour effet immédiat de renseigner les 2 textbox aliment_nom="Curcuma" et aliment_quantite="1 morceau".

    Nom : debug2.JPG
Affichages : 111
Taille : 18,3 Ko

    L'utilisateur modifie la Texbox aliment quantité en renseignant aliment quantite = "1 morceau 123"

    Nom : debug3.JPG
Affichages : 111
Taille : 21,9 Ko

    Puis l'utilisateur clique sur le bouton bouton_plus (MODIFIER ALIMENT)

    TABLEAU DE SUIVI DU CODE

    Nom : debug4.JPG
Affichages : 98
Taille : 59,6 Ko


    CONSTAT


    Etape 1 : normale c'est la procédure associée au click sur le bouton. Il exécute le première instruction sur aliment_nom.

    Etape 2 :
    - il change de procédure ????? AVANT d'avoir exécuté la seconde instruction sur aliment_nom.
    - il exécute le code sur le aliment_nom. Il dit VRAI car aliment_nom de la TEXTBOX est égal à le nom de l'idem sélectionné dans aliments_liste

    Etape3 :
    - il exécute le code de aliment_quantité. Il dit FAUX car aliment_quantite de la TextBox est différent de quantité de l'item sélectionné dans aliments_liste.
    - il modifie donc aliment_quantite en remplaçant la valeur saisie par l'utilisateur (textbox) par celle qui exite dans la listbox.

    Etape4:
    - Il revient à la procédure appelante après avoir mis à jour les textbox.

    CONCLUSION

    Il y a 2 problèmes :

    1° A l'étape 2 il change de procédure. Il passe de Sub bouton_plus_Click() à Sub aliments_liste_Click() après avoir execute le code .List(.ListIndex, 0) = aliment_nom
    Il considère que cette instruction est équivalent à un click sur la listbox !!!

    2° A l'étape 3
    Il attribue la valeur existante dans aliments_liste à la TextBox aliment_quantite.


    DETECTION DU PROBLEME

    Donc après examen la question est:

    Pourquoi Excel assimile l'instruction .List(.ListIndex, 0) = aliment_nom à l'instruction aliments_liste_Click()
    Considère t il que l'actualisation d'une listbox par le programme est comme un click sur la listbox ???



    J'espère pouvoir obtenir une explication.

    Dans cette attente je vous souhaite de bonnes fêtes de Pâques.
    Images attachées Images attachées  
    Donnes un poisson à un homme tu le nourris un jour, apprends lui à pécher tu le nourris toute sa vie.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par alain78 Voir le message
    Le plus simple serait de mettre votre fichier en ligne au format zip.

  8. #8
    Membre régulier Avatar de alain78
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Points : 97
    Points
    97
    Par défaut
    Bonjour,

    Voici un extrait du fichier. Tout y est pour reproduire le bug. Ne tenez pas compte svp de l'ergonomie ni du nettoyage du code ce n'est qu'un fichier de travail à l'état primaire. Par contre si vous trouvez des optimisations, je les accepte volontiers.

    Merci encore pour votre aide.


    Debug_recettes.zip


    Merci encore pour votre aide.
    Bon Lundi de Pâques à vous.
    Donnes un poisson à un homme tu le nourris un jour, apprends lui à pécher tu le nourris toute sa vie.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par alain78 Voir le message
    Une solution partielle possible dans le fichier joint.

  10. #10
    Membre régulier Avatar de alain78
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Points : 97
    Points
    97
    Par défaut
    Bonjour à toutes et tous,

    Merci Eric.
    Votre proposition est excellente. Je vais prendre quelques temps pour l'analyser mais surtout pour essayer de tout comprendre car elle comporte des notions et syntaxes nouvelles pour moi.
    Par exemple le M03 ou M04 devant une liste.

    Pour ma part je continue à utiliser mon code qui interdit l'appel de Private Sub aliments_liste_Click() dès lors qu'on est mode mode modification via Private Sub bouton_plus_Click() . Je teste cet état avec une variable temporaire.

    Merci encore pour votre aide.

    Cependant je n'ai toujours pas la réponse à ma question

    Pourquoi Excel assimile l'instruction .List(.ListIndex, 0) = aliment_nom à l'instruction aliments_liste_Click()

    Considère t il que l'actualisation d'une listbox par le programme équivaut à un click sur la listbox ???

    Bonne journée.
    Donnes un poisson à un homme tu le nourris un jour, apprends lui à pécher tu le nourris toute sa vie.

  11. #11
    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 941
    Points
    55 941
    Billets dans le blog
    131
    Par défaut
    Salut


    Citation Envoyé par alain78 Voir le message
    [...]
    Cependant je n'ai toujours pas la réponse à ma question

    Pourquoi Excel assimile l'instruction .List(.ListIndex, 0) = aliment_nom à l'instruction aliments_liste_Click()

    Considère t il que l'actualisation d'une listbox par le programme équivaut à un click sur la listbox ???[...]
    Oui


    Reste à voir si sur le plan ergonomique, il est logique d'avoir ces évènements qui se télescopent, mais sans savoir ce que fait ton Listbox_click, difficile de répondre. Tu peux court-circuiter l'évènement avec une variable de module... Voici un exemple avec un sémaphore (un flag en anglais) qui désactive l'évènement ListBox_Click lorsqu'il n'est pas la conséquence d'un choix de l'utilisateur. La gestion d'erreur permet d'être certain de rétablir la gestion du click

    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
    Option Explicit
     
    Private ClickFlag As Boolean
     
    Private Sub CommandButton1_Click()
      On Error GoTo Catch:
     
      ClickFlag = True
      ListBox1.Value = "E 2"
     
    Catch:
      ClickFlag = False
    End Sub
     
     
    Private Sub ListBox1_Click()
      If Not ClickFlag Then
        MsgBox "Clic de l'utilisateur sur la liste"
      Else
        MsgBox "Modif par code"
      End If
    End Sub
    "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...
    ---------------

Discussions similaires

  1. [AC-2010] requête à valeur null non prise en compte
    Par Arkops dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 23/07/2019, 16h21
  2. Valeur champs non prise en compte
    Par alexking2005 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 05/11/2009, 11h56
  3. Réponses: 1
    Dernier message: 06/08/2008, 15h58
  4. getchar et scanf : valeur non prise en compte
    Par Angelina007 dans le forum C
    Réponses: 8
    Dernier message: 25/10/2007, 13h47
  5. [VBA-A] valeur non prise en compte par un composant
    Par robert_trudel dans le forum VBA Access
    Réponses: 4
    Dernier message: 01/07/2006, 22h25

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