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 listbox qui prend soit Null soit ""


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 8
    Par défaut Problème de listbox qui prend soit Null soit ""
    Bonjour,
    Après beaucoup de tentatives pour trouver une solution et pas mal de recherches sur internet, je viens vous expliquer mon problème.
    Suite à un projet informatique dans ma formation, on est amené à réaliser une tâche particulière. Celle que moi et mon binôme devons réaliser est assez simple à comprendre :
    Le projet globale visant grâce à des user form à remplir une fiche personnage pour un jeu de rôle. Notre tâche consiste à proposer différents avantages et désavantages à l'utilisateur.
    Le programme marche plutôt bien (je tiens à préciser que je ne code que depuis cette année scolaire donc soyez indulgents ce ne sont sûrement pas les meilleures façons de faire les choses).
    Alors voilà le problème :
    Une fois que l'utilisateur a choisi ses avantages et désavantages, nous devons passer les avantages et désavantages choisis d'une listbox à des cellules. Pour ce faire, on a créé un programme que l'on call le nombre de fois qu'il y a de listbox où sont les valeurs concernées. Mais voilà, les valeurs ne sont copiées qu'environ une fois sur 2 selon les essais de résolution de solution et ça semble assez aléatoire. On a remarqué que lorsque l'on call ce programme, on lui donne en paramètre un objet qui correspond au nom d'une listbox et on ne sait pas pourquoi mais cet objet prend soit la valeur Null (ce qui a pour effet de correctement copier les valeurs), mais il prend aussi certaines fois la valeur "" ce qui laisse un blanc dans la cellule.
    Merci d'avance pour votre aide.
    Si vous avez d’autres suggestions concernant le programme pour l'optimiser ou autre, n'hésitez pas, on a envie d'apprendre à coder correctement !

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Si tu te demandes pourquoi je ne saurais répondre à tes questions, lis donc ceci
    https://www.developpez.net/forums/d8...s-discussions/
    puis lis le texte de ma signature
    puis reviens en montrant que tu sais parfaitement isoler la difficulté rencontrée et les lignes de code qui la concernent seule.
    Merci de faire cet effort.
    EDIT : j'ai essayé (en vain) de comprendre ce que pouvait bien vouloir dire ceci :
    Pour ce faire, on a créé un programme que l'on call le nombre de fois qu'il y a de listbox où sont les valeurs concernées. Mais voilà, les valeurs ne sont copiées qu'environ une fois sur 2 selon les essais de résolution de solution et ça semble assez aléatoire
    A traduire en langage compréhensible, technique et clair, s'il te plait.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 8
    Par défaut
    Bonjour,

    Merci pour votre réponse rapide et désolé pour ce message qui n'explique pas très bien le problème.

    Je vais essayer d'être plus clair :

    - On dispose d'un programme qui va chercher des données dans une listbox et qui les met dans une suite de cellules (La première valeur trouvée est mise dans la première cellule, la seconde dans une autre cellule et ainsi de suite.)

    - Ce programme marche parfaitement quand il est utilisé pour une seule listbox.

    - Pour éviter d'avoir le même programme pour chacune des listbox auxquelles on veut appliquer ce programme on a décidé de faire un call de ce programme à chaque fois que nous en avons besoin.

    - Le programme est donc appelé avec en paramètre le nom de la listbox qui nous intéresse à ce moment et ça autant de fois qu'on a de listbox. Call NomDuProgramme(Nomdelalistbox).

    - Le paramètre est définie dans le programme comme un objet, on a écrit : Sub NomDuProgramme (Nomdelavariable as object).

    - Donc lorsque l'on appel ce programme il va s’exécuter dans la listbox demandé.

    - Le problème (enfin ce que nous avons remarqué qui semble expliquer quelque chose) c'est que lorsque l'on appel ce programme avec le nom de la listbox en paramètre, en mode pas à pas on remarque que celle-ci est soit :

    ou bien

    Dans le premier cas, au lieu de mettre la valeur demandé dans la cellule, la cellule reste "vide" ou en tout cas la valeur n'y apparaît pas.

    Dans le second cas la valeur est bien mise dans la cellule.

    Le programme tourne normalement mais des cellules restes blanches.

    J'espère avoir mieux expliquer le problème, si vous voulez plus de précisions n'hésitez pas.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 178
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Exemple à placer soit dans le module UserForm soit dans un module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub InitListBox(ctrlListBox As Object, ByVal ListRange As Range)
     ' Initialisation du ListBox
     ' Propriété Width automatique basée sur largeur des colonnes de RowSource
     ' Arguments
     ' ctrListBox : (ListBox) Ctrl ListBox à initialiser
     ' ListRange  : Liste traitée par le ListBox --> Propriété RowSource
     With ctrlListBox
      MsgBox .Name & vbCrLf & .Parent.Name
     End With
    End Sub
    On appelle cette procédure depuis le UserForm concerné par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub UserForm_Initialize()
     Dim rng As Range
     Set rng = ThisWorkbook.Worksheets("db").Range("A1").CurrentRegion
     InitListBox ListBox1, rng
    End Sub
    Au lieu de déclarer l'argument nommé comme un objet, tu peux aussi le déclarer comme objet ListBox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub InitListBox(ctrlListBox As ListBox, ByVal ListRange As Range)
    Moi j'utilise Object car j'emploie cette procédure aussi bien pour les ListBox que les ComboBox mais si la procédure ne doit concerner que les ListBox la deuxième solution est préférable car tu bénéficies du complément automatique des instructions.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 8
    Par défaut
    Bonjour,
    merci pour ces explications, j'ai essayé quelques trucs mais je ne pense pas que le problème vienne de là.
    Lorsque j'appelle le programme avec une certaine listbox, selon la listbox le programme va bien me copier les valeurs présentes dans la listbox concernée ou bien il va laisser un blanc dans la cellule où la valeur de la listbox aurait dû être copiée. J'ai l'impression que le problème vient plus de la listbox que du programme.

    PS : Comment faut il faire pour mettre du code dans la discussion comme vous faites ?

    Encore merci pour votre aide !

  6. #6
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 705
    Par défaut
    Bonjour,
    PS : Comment faut il faire pour mettre du code dans la discussion comme vous faites ?
    En effet, on arriverait mieux à t'aider si tu nous montrais ton code
    Copie ton code depuis VBA, colle-le dans ton message. Surligne le code et appuie sur le bouton # (qui se situe en haut du cadre pour écrire le message).

    EDIT : exemple : http://club.developpez.com/aidenouve...es/Balises.gif

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 8
    Par défaut
    Merci !

    Alors voilà le programme que j'appelle à plusieurs reprises (soyez indulgents c'est pas très propre) :

    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
    Sub Inscrit(Objet2 As Object)
     
      Dim i As Integer, c As Integer, compteur As Integer
     
      Workbooks("Projet Info IUT 2017  Feuille de personnage vierge").Activate
      ActiveWorkbook.Sheets("Personnage").Activate
     
      If Objet2.ListCount <> 0 Then
        Objet2.Selected(Objet2.ListIndex = 0) = True
        compteur = 0
        While compteur <> 1 And Ligne <= 14 And c <= 20
          Cells(Ligne, Colonne) = Objet2.Value
          Ligne = Ligne + 1
     
          If Ligne = 15 And Colonne = 19 Then
            Colonne = 20
            Ligne = 8
          End If
     
          If Objet2.ListIndex = Objet2.ListCount - 1 Then
            compteur = 1
            Else
              Objet2.Selected(Objet2.ListIndex + 1) = True
          End If
        Wend
     
        Objet2.Selected(Objet2.ListIndex) = False
     
      End If
     
    End Sub
    Et voilà comment je l'appelle (Le problème est plutôt à ce niveau je pense) :

    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
    Private Sub CBTest_Click()
    Workbooks("Projet Info IUT 2017  Feuille de personnage vierge").Activate
    ActiveWorkbook.Sheets("Personnage").Activate
    Range("S8:V14").ClearContents
     
    Call Inscrit(UF_TacheV.LB_MaAdvantages)
     
    Call Inscrit(UF_TacheV.LB_PhAdvantages)
     
    Call Inscrit(UF_TacheV.LB_SoAdvantages)
     
    Call Inscrit(UF_TacheV.LB_MeAdvantages)
     
    Call Inscrit(UF_TacheV.LB_SpAdvantages)
     
    Call Inscrit(UF_TacheV.LB_MyAdvantages)
     
    End Sub

  8. #8
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 705
    Par défaut
    Je ne sais pas si ça va résoudre le problème, mais voici quelques remarques et questions (j'ai pas très bien compris tout ce tu fais dans la méthode Inscrit) :

    Ici tu ne passes plus par le nom du contôle, mais par l'objet lui-même. Du coup, est-ce que tu as encore des problèmes, si oui lesquels exactement?

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 8
    Par défaut
    Effectivement c'est ce que je voulais faire, le selected j'ai un peu appris tout seul comment ça marche !
    J'ai donc changé le code à ce niveau mais ça ne change rien.

    Voilà ce que j'ai remarqué qui explique peut-être quelque chose :

    Nom : Pb 1.png
Affichages : 1393
Taille : 22,9 Ko

    Nom : Pb 2.png
Affichages : 1408
Taille : 23,7 Ko

    Sur ces 2 images on voit qu'une des listbox est à "" et l'autre à Null, lorsque la listbox est à Null aucun problème mais lorsqu'elle est à "" la cellule reste blanche sans la valeur et le programme continue et il passe quand même à la suite comme si il avait remarqué qu'il y avait quand même un valeur. Je sais pas si je suis très compréhensible mais je ne comprend pas très bien le problème :/
    Au final je me retrouve avec certaines cellules avec des valeurs et d'autres restes blanches.

    Merci pour l'aide en tout cas !

    EDIT : Je ne comprend pas très bien lorsque tu dis :
    Attention, tu n'initialises pas les variables Ligne et Colonne.
    EDIT2 : Les variables ligne et colonne sont des variables public.

  10. #10
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour.

    Quand on travaille avec plusieurs Workbooks, on ne travaille pas avec les objets Workbooks, Worksheets directement.
    On met les objets dans une variable objet et on ne travaille qu'avec les variables objet.


    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Private Sub CBTest_Click()
     Dim wb As Workbook
     Dim sh As Worksheet
    'Workbooks("Projet Info IUT 2017  Feuille de personnage vierge.xslm").Activate
    For Each wbs In Workbooks
     If wbs.Name = "Projet Info IUT 2017  Feuille de personnage vierge.xlsm" Then
      Set wb = wbs
      Set sh = wb.Sheets("Personnage")
      'wb.Activate
      'sh.Activate
     End If
    Next
     
    sh.Range("S8:V14").ClearContents
     
    Call Inscrit(sh, UF_TacheV.LB_MaAdvantages)
     
    End Sub
     
    Sub Inscrit(sh As Worksheet, Objet2 As Object)
     
      Dim i As Integer, c As Integer, compteur As Integer
     
     ' sh.Parent.Activate
     ' sh.Activate
     
      If Objet2.ListCount <> 0 Then
       Objet2.ListIndex = 0
     
        compteur = 0
        ligne = 1
        colonne = 1
        While compteur <> 1 And ligne <= 14 And c <= 20
          sh.Cells(ligne, colonne).Value = Objet2.List(Objet2.ListIndex)
          ligne = ligne + 1
     
          If ligne = 15 And colonne = 19 Then
            colonne = 20
            ligne = 8
          End If
     
          If Objet2.ListIndex = Objet2.ListCount - 1 Then
            compteur = 1
            Else
              Objet2.ListIndex = Objet2.ListIndex + 1
          End If
        Wend
     
        Objet2.Selected(Objet2.ListIndex) = False
     
      End If
     
    End Sub

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 8
    Par défaut
    Merci pour ta réponse j'ai changé mon programme.

    2 choses :

    - Les variables ligne et colonne sont des variables public qui me permettent à chaque fois que j'appelle le programme de repartir de la bonne cellule pour continuer à entrer les valeurs des listbox suivantes.

    - Lorsque je lance le programme, ça me dit que la variable wbs n'est pas définie et je n'ai pas bien compris ce qu'elle faisait.

  12. #12
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Citation Envoyé par Firety Voir le message

    2 choses :

    - Les variables ligne et colonne sont des variables public qui me permettent à chaque fois que j'appelle le programme de repartir de la bonne cellule pour continuer à entrer les valeurs des listbox suivantes.
    OK. Continue avec les variables Public ligne et colonne.

    - Lorsque je lance le programme, ça me dit que la variable wbs n'est pas définie et je n'ai pas bien compris ce qu'elle faisait.
    Tu as probablement Option Explicit qui apparait en tete du module, ce qui fait qu'il faut declarer toutes les variables dont la variable wbs.
    Donc il suffit d'ajouter Dim wbs As Workbook.

    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
    Private Sub CBTest_Click()
     
     Dim wbs As Workbook
     Dim wb As Workbook
     Dim sh As Worksheet
     
     
    'Workbooks("Projet Info IUT 2017  Feuille de personnage vierge.xslm").Activate
    For Each wbs In Workbooks
     Debug.Print wbs.Name
     If wbs.Name = "Projet Info IUT 2017  Feuille de personnage vierge.xlsm" Then
      Set wb = wbs
      Set sh = wb.Sheets("Personnage")
      'wb.Activate
      'sh.Activate
     End If
    Next
     
    sh.Range("S8:V14").ClearContents
     
    Call Inscrit(sh, UF_TacheV.LB_MaAdvantages)
     
    End Sub
    Plutot que d'ecrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set wbs  = Workbooks("Projet Info IUT 2017  Feuille de personnage vierge.xlsm")
    qui est contre le principe de ne jamais utiliser dans notre code la syntaxe Workbooks("Projet Info IUT 2017 Feuille de personnage vierge.xlsm")

    on fait une iteration de tous les classeurs ouverts pour chercher le classeur "Projet Info IUT 2017 Feuille de personnage vierge.xlsm" et l'attribuer a la variable objet wb en utilisant la syntaxe


  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 8
    Par défaut
    Sur ce coup là j'ai tout compris et tout changé !
    Le problème reste le même, sur les 2 captures d'écrans que j'ai mis plus haut, les listbox prennent des valeurs bizarres, soit "" soit Null et je ne comprend pas pourquoi.

    Merci encore pour votre aide !

  14. #14
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Citation Envoyé par Firety Voir le message
    Le problème reste le même, sur les 2 captures d'écrans que j'ai mis plus haut, les listbox prennent des valeurs bizarres, soit "" soit Null et je ne comprend pas pourquoi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Objet2.Selected(Objet2.ListIndex) = False
    C'est a cause de cette commande qui attribue la valeur False au seul item selectionne. Quand il n'y a aucun item selectionne parmi les items de la Lisbox, la valeur de Lisbox.value est Null.
    Tu peux le tester par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if IsNull(Lisbox.value)  then
    [

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 8
    Par défaut
    J'ai essayer de changer pas mal de choses mais le problème persistais j'ai donc complètement revu la méthode.
    A chaque fois qu'une valeur est entrée dans n'importe quelle des listbox elle est aussi entrée dans une listbox qui regroupe toutes les valeurs et que je cache.
    Je vais chercher directement mes valeurs dans cette unique listbox quand j'en ai besoin.

    Merci beaucoup pour toutes vos réponses rapides et votre aide j'ai quand même appris pas mal de choses avec ce problème !

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 19/04/2015, 16h51
  2. Problème avec variable int qui vaut soit 0 soit 1
    Par gkn28 dans le forum Langage
    Réponses: 4
    Dernier message: 21/04/2013, 18h55
  3. Problème de valeurs qui se mettent en <null> pour des stocks
    Par Heytabernak dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/11/2008, 11h42
  4. problème de champs not null qui sont marqués null à la création
    Par Elianora la blanche dans le forum Outils
    Réponses: 6
    Dernier message: 02/02/2007, 09h33
  5. Problème de Thread qui prend trop de mémoire
    Par petozak dans le forum Général Java
    Réponses: 20
    Dernier message: 11/12/2006, 15h24

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