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 :

Optimisation code selon contenu ListBox


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Par défaut Optimisation code selon contenu ListBox
    Bonjour A tous,

    Mon projet se compose actuellement:

    - une ComboBox (alimentée par le nom des pages de mon projet - ACTIVITES PROFESSIONNELLES),

    - une TextBox (alimentée par l'item sélectionné depuis la Combobox),

    - une ListBox (alimentée par une Banque de Donnée conditionnée par l'activité sélectionnée - RISQUES PROFESSIONNELS),

    - 24 icônes représentant chacune un risque professionnel,

    - 24 images vierges qui se chargent lorsque le nom du risque apparaît dans la ListBox.

    L'objectif est d'obtenir une fiche de risques dynamique par activité.

    Nom : aideforum.jpg
Affichages : 143
Taille : 509,0 Ko

    MON PROBLEME:

    Lorsque je sélectionne une activité comportant moins de risques que d'images prévues par mon code, un message d'erreur apparaît:

    "Erreur d'exécution '381':
    Impossible de lire la propriété List. Index de table de propriétés non valide."

    ci dessous le code mis en cause:

    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
    Private Sub ComboBox1_Click()
     
    Me.TextBox1 = ComboBox1
    Me.ListBox1.Clear
     
    Set f = Sheets(Me.TextBox1.Text)
      Set MonDico = CreateObject("Scripting.Dictionary")
      bd = f.Range("B9:B" & f.[F65000].End(xlUp).Row)  ' tableau bd(n,1) pour rapidité
        For i = LBound(bd) To UBound(bd)
       If bd(i, 1) <> "" Then MonDico(bd(i, 1)) = ""
      Next i
      Me.ListBox1.List = MonDico.keys
     
     '--avec tri
      temp = MonDico.keys
      Call Tri(temp, LBound(temp), UBound(temp))
      Me.ListBox1.List = temp
     
    With ListBox1
     
     Image1.Picture = Controls("Risque" & .List(.ListIndex, 0)).Picture
     Image2.Picture = Controls("Risque" & .List(.ListIndex + 1, 0)).Picture
     Image3.Picture = Controls("Risque" & .List(.ListIndex + 2, 0)).Picture
     Image4.Picture = Controls("Risque" & .List(.ListIndex + 3, 0)).Picture
     Image5.Picture = Controls("Risque" & .List(.ListIndex + 4, 0)).Picture
     Image6.Picture = Controls("Risque" & .List(.ListIndex + 5, 0)).Picture
     Image7.Picture = Controls("Risque" & .List(.ListIndex + 6, 0)).Picture
     Image8.Picture = Controls("Risque" & .List(.ListIndex + 7, 0)).Picture
     Image9.Picture = Controls("Risque" & .List(.ListIndex + 8, 0)).Picture
     Image10.Picture = Controls("Risque" & .List(.ListIndex + 9, 0)).Picture
     Image11.Picture = Controls("Risque" & .List(.ListIndex + 10, 0)).Picture
     Image12.Picture = Controls("Risque" & .List(.ListIndex + 11, 0)).Picture
     Image13.Picture = Controls("Risque" & .List(.ListIndex + 12, 0)).Picture
     Image14.Picture = Controls("Risque" & .List(.ListIndex + 13, 0)).Picture
     Image15.Picture = Controls("Risque" & .List(.ListIndex + 14, 0)).Picture
    End With
    End Sub
    Il me semble que je pourrais optimiser ces lignes de code en une ligne générique sous conditions de "remplissage" de l'index de la ListBox, mais toutes mes tentatives échouent!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image1.Picture = Controls("Risque" & .List(.ListIndex, 0)).Picture
    Une âme charitable aurait-elle une piste à me proposer?

    Merci!

  2. #2
    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 173
    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 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    MON PROBLEME:
    Lorsque je sélectionne une activité comportant moins de risques que d'images prévues par mon code, un message d'erreur apparaît:
    "Erreur d'exécution '381':
    Impossible de lire la propriété List. Index de table de propriétés non valide."
    A la grosse louche sans avoir examiné toute la procédure et selon la description que tu as faites de ton problème, je supprimerais les lignes 21 à 35 que je remplacerais par une boucle avec un test sur le contenu de .List(.ListIndex + 12, 0) où la constante 12 doit être remplacé par l'indice de la boucle.
    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

  3. #3
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Par défaut
    @ Philippe Tulliez

    C'est ce que je tâtonne depuis hier,
    mais autodidacte récent, je ne maîtrise pas suffisamment le langage VBA pour rédiger une boucle fonctionnelle!
    J'imagine que rédiger une boucle doit être une des bases de la programmation... je n'en ai malheureusement aucune!

    @Ben_L

    Ca fonctionne parfaitement! Merci beaucoup pour cette solution rapide et pertinente!
    Il ne me reste plus qu'à analyser ce code pour en comprendre le mécanisme!

    edit: Aïe: ma première sélection Combox fonctionne, pas les sélections suivantes...

    N'y aurait-il pas conflit entre ces lignes?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Me.ListBox1.List = temp
     
    temp = Array(Me.Image1, Me.Image2, Me.Image3, Me.Image4, Me.Image5, Me.Image6, Me.Image7, _
                Me.Image8, Me.Image9, Me.Image10, Me.Image11, Me.Image12, Me.Image13, Me.Image14, Me.Image15)

  4. #4
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Par défaut
    J'ai localisé le soucis:

    Si la ListBox contient moins d'items que d'images à charger, le code bloque et retourne le message d'erreur:

    "Erreur d'exécution '381':
    Impossible de lire la propriété List. Index de table de propriétés non valide."

    On en revient au problème initial...

    Il faudrait pouvoir adapter le nombre d'images à charger en fonction du nombre d'items de la ListBox à chaque changement de sélection de la ComboBox!

    J'enrage de ne pouvoir me débrouiller à ce stade, ça ne me paraît pas sorcier, mais avec mes lacunes...

  5. #5
    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 173
    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 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    On en revient à l'idée de boucle.
    La propriété ListCount du contrôle ListBox te donnera le nombre d'éléments qu'il y a dans la liste.
    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

  6. #6
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Par défaut
    ... et donc je dois intégrer cette commande avant d'effectuer la suite de l'opération j'imagine...


    par exemple?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
       n = Me.ListBox1.ListCount 
     
    temp = Array(Me.Image1, Me.Image2, Me.Image3, Me.Image4, Me.Image5, Me.Image6, Me.Image7, _
                Me.Image8, Me.Image9, Me.Image10, Me.Image11, Me.Image12, Me.Image13, Me.Image14, Me.Image15)
     
    With Me.ListBox1
        For i = 0 To n
     
            temp(i).Picture = Controls("Risque" & .List(.ListIndex + i, 0)).Picture
        Next i
    End With
    pas fonctionnel mais je ne suis pas apte à comprendre pourquoi...

  7. #7
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Bonjour,

    Concernant l'erreur que vous rencontrez, avez-vous comparé les valeurs de "ListBox1.ListIndex + 14" et de "ListBox1.ListCount" ?

    Pour ce qui est factoriser une partie de votre code, vous pourriez remplacer tout le contenu de votre With par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    temp = Array(Me.Image1, Me.Image2, Me.Image3, Me.Image4, Me.Image5, Me.Image6, Me.Image7, _
                Me.Image8, Me.Image9, Me.Image10, Me.Image11, Me.Image12, Me.Image13, Me.Image14, Me.Image15)
    With Me.ListBox1
        For i = 0 To UBound(temp)
            temp(i).Picture = Controls("Risque" & .List(.ListIndex + i, 0)).Picture
        Next i
    End With

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

Discussions similaires

  1. [Toutes versions] Rendre images visible selon contenu de ListBox
    Par IronHeavy dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 23/08/2017, 17h16
  2. Comment appeller par code le contenu d'une liste
    Par sakia dans le forum VBA Access
    Réponses: 3
    Dernier message: 26/05/2007, 19h50
  3. Réponses: 4
    Dernier message: 18/02/2007, 20h28
  4. Réponses: 4
    Dernier message: 17/02/2006, 15h07
  5. Réponses: 1
    Dernier message: 28/09/2005, 23h37

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