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 :

Problème de deselection listbox lors de sa mise a jour [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Problème de deselection listbox lors de sa mise a jour
    Tout d'abord, bonjour à tous.

    J'ai recherché mon problème sur le forum mais je n'ai malheureusement pas trouvé la solution.

    J'utilise une feuille excel dans laquelle je stocke des informations sur une liste de personnes: nom, prenom, propriété 1, propriété 2, propriété 3. Cette plage de données est associée à un nom par la fonction décaler sur l'ensemble de ces cinq colonnes.
    Je lance ensuite une macro qui m'ouvre un userform dans lequelle j'initialise une listbox avec le nom précédent et la proprietes rowsource. Le userform me permet de venir ajouter des éléments dans les colonnes propriétés de ma plage de données précédentes pour toutes les personnes sélectionnées dans la listbox (en mode multiselect et multicolonnes)

    Mon problème est que quand je valide le userform, ma macro lit la première ligne sélectionnée et vient remplir les colonnes propriétés. Si j'ai plusieurs noms sélectionnés ma macro s'arrête.
    J'ai recherché le problème en faisant une lecture pas à pas de ma macro et j'ai constaté que lorsque je remplis ma plage de données, la listbox du userform se met automatiquement à jour avec les nouvelles propriétés mais cela entraîne la deselection de toutes les lignes suivantes... Raison pour laquelle ma macro n'enregistre que le premier nom sélectionné.

    Auriez-vous une solution à mon problème autre que l'enregistrement à un autre endroit des infos puis sa recopie dans ma plage de données ? J'aurais bien aimé bloquer la mise à jour de la listbox durant le traitement (tant que le userform nest pas fermé)

    Merci d'avance pour votre aide

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonsoir
    tout d'abord il faut être sur que ta List box permette le multi select ca se règle dans le panneau de gauche dans les propriétés

    ensuite si tu avais délicatement appuyé sur la touche F ou cliquer sur l'icon "Aide"
    tu aurais trouvé très facilement

    pour traiter tout les items sélectionnés il faut utiliser la propriété "selected(X)" dans une boucle sur tout les items de la liste
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub CommandButton1_Click()
    For i = 0 To ListBox1.ListCount - 1
    If ListBox1.Selected(i) = True Then MsgBox ListBox1.List(i)
    Next
    End Sub
    et si tu veux simplement récupéré l'index de la ligne c'est "i"
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour PatrickToulon et merci pour ta réponse.

    Néanmoins, tu ne réponds pas à ma question. J'ai précisé que ma listbox est déjà en mode multiselect. De plus, j'ai déjà cliqué "délicatement" sur le bouton aide et n'ayant trouvé la réponse, ni dans l'aide, ni sur le forum, je me suis permis de poser la question.

    J'utilise déjà une boucle avec la fonction selected associée aux objets listbox. Cette boucle lit l'ensemble des lignes sélectionnées. Mon problème ne vient pas de là.

    Lorsque je lance la lecture de la listbox (avec la fonction selected comme tu le précises), je viens modifier la plage de données qui initialise ma listbox. Comme la plage est modifiée, elle remet à jour le contenu de la listbox qui entraine la déselection de toutes les lignes.

    Du coup, quand je lance la lecture de la listbox, je lis correctement la première ligne sélectionnée. J'enregistre les données correspondantes. Cet enregistrement entraîne la modification de la place de données initialisant ma listbox qui se met à jour et entraine la déselection de toutes les lignes... ma macro cherche ensuite la ligne sélectionnée suivante et s'arrête donc puisqu'aucune ligne n'est plus sélectionnée du fait de sa mise à jour.

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    d'accord je vois le problème

    est ce que tu utiliserait pas la propriété rowsource par hasard??


    EDIT
    OUI !!!JE VIENS DE LE RELIRE DANS TON ENNONCE

    CA VIENS DE LA!!!

    en fait la propriété rowsource implique un rafraichissement de la liste box des que tu modifie une cellule de cette source

    et donc un rafraichissement anile tout évènement de la liste box forcement

    il te faut utiliser un autre moyen de remplir ta liste box

    entre autre une solution ypper simple avec une variable tableau

    exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim liste 
    liste=range("A1:c10")
    userform1.lisbox1.list=liste
    en faisant comme ca ,quand tu modifie une cellule de la plage tu ne touche pas a la source de la liste box puisque la source c'est la variable tableau
    qui a été remplie avant donc la liste de la listbox sera toujours "liste"
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Initialement, effectivement, j'utilisais la propriété rowsource directement dans les propriétés pour ne pas avoir à le mettre dans le code. Mais je l'ai ensuite vidée pour la coder en dur directement dans la procédure "initialize" du userform en espérant que la listbox ne se mettrait pas à jour... mais non !

    En parallèle, j'ai également utilisé une procédure "listbox_change" qui empêche l'utilisateur de sélectionner plus de six lignes. Mais j'ai bien pris soin de ne pas demander de réinitialisation de la listbox dans cette procédure... du coup je suis un peu perdu. Je ne comprends d'où vient cette mise à jour durant la lecture.

    La seule piste que j'ai imaginé vient de la méthode d'initialisation : j'utilise la fonction "décaler" dans le gestionnaire des noms. Et comme je viens modifier la plage de données, je pense que ça vient de là.

    J'ai fait le test : au lieu de mettre dans la listbox l'ensemble des cinq colonnes de ma plage, je n'ai mis que les deux premières (nom et prénom) et pas les colonnes que je modifie. Et là effectivement ça marche. Mais je voudrais que l'utilisateur voit ce qu'il y a dans ces colones donc cette solution ne me convenait pas.


    EDIT :
    J'utilise la fonction rowsource avec la fonction décaler car comme l'utilisateur peut (par un autre userform) ajouter des noms dans la plage initiale, je ne connais pas la taille de cette plage qui peut évoluer.
    Dans la solution que tu me proposes, est-ce qu'il y a un moyen d'initialiser la listbox mais sans spécifier la plage ? Ou alors il faudrait que je récupère le nombre de lignes remplies dans la colonne A en recherchant la dernière ligne non vide ? (je sais utiliser cette méthode, et il n'est pas possible qu'il y ait des cellules vides au milieu de la plage car j'oblige à renseigner le nom)

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    c'est pareil qu'est ce que tu apelle "en dur"???
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Désolé, les termes ne sont peut-être pas les bons.
    Quand je dis "en dur", ça veut dire en écrivant directement : listbox.rowsource = "Feuille!Nom" et non en remplissant la propriété rowsource de la fenêtre propriétés de l'objet (ainsi je choisis le moment où se fait l'initialisation).

    Voici les morceaux de mon code qui me pose problème :

    Le code d'initialisation de la listbox dans la procédure initialize est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Userform.listbox.RowSource = "Feuill1!Liste_Nom"
    Le code associé à la validation du userform : il remplit la première colonne non vide (entre les colonnes C, D et E) avec les infos de la combobox et du textbox. Je sais que cette partie n'est pas optimisée pour rechercher la première colonne non vide mais comme je ne trouvais pas de solution à mon problème je suis revenu à un code bien brutal en testant chaque colonne à tour de rôle.

    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
    Dim n, p As Integer
     
            For n = 1 To Userform.Listbox.ListCount - 1 '(la ligne 0 contient les titres des colonnes)
     
                If Userform.Listbox.Selected(n) = True Then
                    If Worksheets("feuill1").Range("C" & n + 9).Value = "" Then
                    Worksheets("feuill1").Range("C" & n + 9).Value = Userform.Combobox.Value & Userform.Textbox.Value
                    Else
                        If Worksheets("feuill1").Range("D" & n + 9).Value = "" Then
                        Worksheets("feuill1").Range("D" & n + 9).Value = Userform.Combobox.Value & Userform.Textbox.Value
                        Else
                            If Worksheets("feuill1").Range("E" & n + 9).Value = "" Then
                            Worksheets("feuill1").Range("E" & n + 9).Value = Userform.Combobox.Value & Userform.Textbox.Value
                            End If
                        End If
                    End If
                End If
     
            Next n
    Quand j'éxécute mon code et que j'arrive à cet endroit, si j'ai la ligne 1 et la ligne 2 de ma listbox de sélectionnées et que toutes les colonnes C, D et E sont vides, alors les lignes 5, 6 et 7 s'exécutent normalement et la colonne C de la ligne correspondante est remplie. A ce moment précis, l'ensemble des lignes sélectionnées de ma listbox (la 1 et la 2) se déselectionnent et quand le code passe à n=2, il ne trouve plus rien de sélectionné jusqu'à la fin de la boucle.

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    oui c'est bien ce que je dis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Userform.listbox.RowSource = "Feuill1!Liste_Nom"
    il te faut utiliser une autre méthode de remplissage de listbox
    si tu sélectionne les items de 4 a 8par exemple

    l'exécution va commencer et des que la ligne correspondant a l'item 8 la liste box va se mettre a jour et donc les items se désélectionner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tablo=range(.....)
    listbow1.list=tablo
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Ok, merci.
    Je vais essayer dans cette voie et me passer de la fonction Decaler (qui est si pratique) !

    EDIT :
    Jai remplacé ma ligne d'initialisation avec rowsource par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Userform.Listbox.List() = Worksheets("feuill1").Range("A9:E" & Worksheets("feuill1").Range("A10").End(xlDown).Row).Value
    Et ca semble marcher !
    Je vais tester le code dans tous les sens mais la fonction de base fonctionne.

    Merci pour ton aide !
    Et désolé si je n'ai pas été clair au début, je n'ai pas l'habitude de poster sur le forum car je trouve souvent l'information dans un post existant !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/04/2010, 11h32
  2. garder hitorique lors d'une mise a jour
    Par billainfo dans le forum SQL
    Réponses: 8
    Dernier message: 30/07/2007, 09h26
  3. prise en compte javascript lors d'une mise a jour
    Par maximus84 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 04/06/2007, 16h36
  4. Réponses: 2
    Dernier message: 20/04/2006, 17h53
  5. Réponses: 18
    Dernier message: 24/08/2005, 09h52

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