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

IHM Discussion :

Coloration dynamique des cellules d'une feuille de données


Sujet :

IHM

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Coloration dynamique des cellules d'une feuille de données
    Bonjour à tous,

    J'ai un petit soucis, je m'explique :

    Je possède une requête d'analyse croisée sur une table. La table alimentant cette requête est composée ainsi : Nom, Destination, Profession, date
    Cette requête me renvoi comme résultat un tableau à double entrée :
    - Chaque ligne correspond à une personne présente dans la table
    - Chaque colonne correspond à une destination différente.
    - Chaque cellule correspond au nombre de fois où la personne s'est rendue à la destination (count sur le nombre de date)
    J'effectue un where sur la profession pour ne lister par exemple que les commerciaux


    Ce que je voudrais faire, c'est mettre en rouge les cellules qui sont inférieures à 3. J'ai pour cela essayé de créer un formulaire "plusieurs éléments" basé sur cette requête, mais le nombre de destination (et donc de colonnes) n'étant pas fixe et pouvant diminuer ou augmenter, impossible de mettre en place une mise en forme conditionnelle correcte. De plus, le mode d'affichage idéal serait le formulaire "feuille de données". Ce que j'aimerai, c'est au chargement de ce dernier, parcourir toutes les "cellules" pour en changer le background si la valeur est inférieur à 3. Je n'ai malheureusement pas trouvé le code permettant cela.

    Est ce possible ? Ou y a t'il une autre solution me permettant d'obtenir ce que je veux ?

    Merci d'avance !

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Bonjour,

    Si tu peux déterminer le nombre maximum de valeurs de tes destinations, tu pourrais "figer" les noms de colonnes dans ton tableau croisé dynamique et utiliser ainsi la mise en forme conditionnelle.
    Pour figer les colonnes, tu énumères les possibilités dans le critère et tu utilises IN.

    Sinon, il faudrait "programmer" le nom des champs dans le formulaire et coder en VBA la coloration des champs.

    Cordialement.
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Merci pour ta réponse.

    C'est ce que j'essaie un peu de faire dans le formulaire plusieurs éléments : le créer à partir de toutes les colonnes existantes pour appliquer la mise en forme conditionnelle, et mettre à 0 les colonnes qui ne sont pas présentes dans la requête. Seul problème, lorsque le source contrôle indiqué n'existe plus, j'ai un magnifique "#Name?", il faudrait que je trouve le moyen de le remplacer par 0 dans ce cas.

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Hum, directement dans la requête, je ne pense pas.

    Pour le formulaire en mode feuille de données, la seule méthode que j'ai trouvée pour colorer une cellule c'est justement la mise en forme conditionnelle.

    Je te suggère la solution suivante :

    Créer un formulaire qui affiche les nombres maximum de colonnes que ta requête peut renvoyer.
    Si tes champs dans ta requête tout en étant variables portent toujours les mêmes noms, nomme tes champs dans le formulaire de la même façon.
    Ensuite lors du chargement du formulaire tu caches les colonnes dont les champs qui ne sont pas disponibles dans la source.

    Si tes noms de champs dans la source changent, alors il faut créer toujours autant de champs que de colonnes max puis assigner dynamiquement les étiquettes et les sources de champs au moment du chargement.
    Les champs inutilisés sont masques.

    Une dernière possibilité plus lourde (à mon avis) est de construire dynamiquement le formulaire à chaque usage. En plus de demander plus de travail que les solutions précédentes, cette dernière n'est pas possible avec les versions "runtime" de Access.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Merci pour ta réponse. c'est effectivement ce que j'essaie de faire : Un formulaire à plusieurs éléments contenant toutes les colonnes possibles. Je place la mise en forme conditionnelle. Lorsque la data source change, certaines colonnes n'existent plus en source Contrôle et m'affiche donc "#Name", il faudrait soit que je remplace "#Name# par 0, soit que je cache la colonne.

    Etant donné que je n'arrive pas à accéder directement aux éléments dans le code, je ne vois pas comment remplacer "#Name", les propriétés de valeur par défaut ne marchent pas non plus.

    Quant à mes colonnes, j'ai simplement un label en titre et une zone de texte par ligne générée (liée par source contrôle). J'ai essayé d'utilisé ColumnHidden ou ColumnWidth sur le champs texte mais aucun résultat =/

    Nom : téléchargement.png
Affichages : 323
Taille : 25,4 Ko

    ici on voit bien mon contrôle zone de texte lié à "Other", or la colonne other n'existe plus. Je n'arrive ni à cacher la colonne, ni à lui mettre une largeur nulle, ni à mettre une valeur si le source contrôle est mauvais.

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Pour cacher le colonnes :

    à mettre "dans" le formulaire

    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
    private function EstChampExistant(prmNomChamp) as boolean
        'Vérifie si le champ existe dans la source de données.
        dim result as boolean:result=false
     
        dim f as dao.field:for each f in me.recordset.fields
     
           if f.name=prmNomChamp then
             result=true
             exit for
           end if
     
        next f
     
        EstChampExistant=result
    end function
    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
     
    Public Sub GererAffichageControle(prmFormulaire As Form, prmNomControle As String, prmEstAffiche As Boolean)
        'Affiche ou cache le contrôle et sa colonne associée
     
        Dim c As Control: Set c = prmFormulaire.Controls(prmNomControle)
     
        If c.Name = prmFormulaire.ActiveControl.Name Then
            Call RepositionnerFocus(prmFormulaire, c)
        End If
     
        c.Visible = prmEstAffiche
     
        If ProprieteExiste(c, "ColumnHidden") Then
            c.ColumnHidden = (Not prmEstAffiche)
     
            If c.ColumnHidden = False Then
                c.ColumnWidth = -2 'Auto ajustée
            End If
     
        End If
     
    End Sub
    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 RepositionnerFocus(prmFormulaire As Form, prmControle As Control)
        'Déplace le focus sur le prochain contrôle visible
     
        Dim c2 As Control
     
        For Each c2 In prmFormulaire.Section(acDetail).Controls
     
            If ProprieteExiste(c2, "TabIndex") And ProprieteExiste(c2, "ColumnHidden") Then
     
                If c2.TabIndex > prmControle.TabIndex _
                   And c2.Enabled _
                   And c2.Visible _
                   And Not c2.ColumnHidden Then
                    c2.SetFocus
                    Exit For
                End If
     
            End If
     
        Next c2
     
    End Sub
    à mettre dans l'événement sur chargement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    '=== Cache les contrôles inutilisés
    dim c as control:for each c in me.controls
     
       if c.type=acTextBox then
     
          if not EstChampExistant(c.name) then
            GererAffichageControle(me, c.name, false)
          end if
     
       end if
    next c
    '--- Cache les contrôles inutilisés
    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Bonjour à Tous,

    Revirement de situation, j'ai obtenu la liste de l'intégralité des colonnes qui pourraient apparaître ; j'ai donc utilisé la méthode de madefemere en rajoutant l'instruction In au pivot de ma requête afin de fixer les colonnes.

    Merci à vous deux !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/07/2007, 09h19
  2. copier des cellules d'une feuille dans une autres sous condition
    Par olivertwist dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 16/05/2007, 10h42
  3. Problème de lecture des cellules dans une feuille Excel
    Par wangjun dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/10/2006, 09h35
  4. [VBA-E]Trouver et recopier des cellules d'une feuille à une autre
    Par sk8bcn dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 24/08/2006, 16h01
  5. [VBA-E]définir l'ensemble des cellules d'une feuille?
    Par yaya54 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 02/03/2006, 08h46

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