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 :

Débutant - affichage conditionnel [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Septembre 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 12
    Par défaut Débutant - affichage conditionnel
    Bonjour
    J'ai un souci avec mon projet excel : sur la FEUIL1, j'ai en colonne A différentes questions : vaccination, jeune, malade, amputé, etc. avec en colonne B des listes déroulantes de choix, avec "OK" ou "KO" (il faut savoir que OK est une réponse commune a toutes les questions pour l'affirmative, pour le négatif les choix peuvent être : "non", "KO" etc).

    Je suis en train de faire une macro pour que sur la FEUIL2 ressorte uniquement les questions répondues par la négative. Je m'explique :
    Par exemple je rentre le nom du chat en haut colonne A feuil1 et je réponds aux questions : immaginons que je réponde "OK" à toutes les questions, alors sur la feuil2 j'aurai en colonne A le nom du chat en haut avec un message positif quelconque en dessous.

    Mais si par exemple je n'ai pas mis "OK" à vaccination ni à "jeune", alors il faudrait que sur la feuil2, en dessous du nom du chat apparaît un message négatif avec en dessous : "vaccination" et encore en dessous : "jeune".

    J'ai réussi à faire ce que je voulais, mais j'ai fait ça avec des if A3 <> "OK".
    Ce qui fait que quand j'ai plusieurs réponses négatives, je n'ai qu'une seule réponse négative enregistrée en feuil2, puisqu'une fois la macro à trouvé une seule réponse différente de "OK", elle l'enregistre dans la feuil2 et s'arrête, sans chercher d'autres réponses négatives.
    Or j'ai besoin de lister en feuil2 toutes les réponses négatives, comment puis-je faire ?

    La seule solution que je connaisse est de faire une condition pour chaque état :
    si A1 <> "ok" and A2="ok" and A3<>"ok" etc etc etc mais vu le nombre de ligne que j'ai je vais y passer des mois et je suis sûr qu'il y a plus optimisé comme technique.

    Merci

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut Mihtsyou et le forum
    our un débutant, tu as bien exposé ton problème. Mais (il y a toujours un mais ^^) :
    -Tu parles d'une macro que tu aurais faite. Dans ce cas, donne ton code : ça nous servira de base.

    Pas sûr de ce que tu veux en final, alors quelques idées, issues de ton poste :
    Je créerais deux feuilles de base :
    - une feuille de saisie/modification qu'on remplit à chaque nouveau nom/identifiant, soit manuellement, soit si il existe déjà, à partir de la seconde feuille
    - Une feuille Base de donnée : à chaque validation de la première feuille, on range les différentes informations en ligne, soit sur une nouvelle ligne, soit, s'il était existant, à la place de l'ancien.
    Une telle disposition facilite le travail sur un grand nombre de données. Mais demande souvent qu'on travaille en VBA.
    Le problème réel sera de déterminer un identifiant unique pour chaque enregistrement : le même nom pouvant être attribuer à plus d'un "animal", il convient qu'on soit sûr que c'est le bon qui représente les valeurs de la ligne. Il faut juste y réfléchir.

    Dans une base de données, perso, je commence toujours par la fin : qu'est-ce que je dois pouvoir avoir en final. C'est ce qui va me donner mes champs (une info=un champs, l'ensemble des champs donne un enregistrement).
    Le plus dur, c'est de savoir ce que je veux (ou voudrais) en faire : un exemple simple : si je mets dans une cellule CP + Ville : il sera difficile de rechercher par ville. il me faudra une manipulation de champs pour en extraire la ville. Alors que si j'utilise 2 champs, un pour le CP, un Pour la ville, le traitement sera facilité.
    Plus on passe de temps à réfléchir avant, moins c'est difficile d'extraire ce que l'on veut après.

    - Une troisième feuille peut servir à synthétiser les anomalies ou données particulières de la feuille de BdD.

    Sinon, sans parler base de données, mettre le nom dans la même colonne que le titre des infos ne me semble pas une bonne idée.
    En A les titres des infos en B les infos demandées est déjà mieux. Mais si je veux travailler plus facilement, je mettrais en B le nom et en C les infos => une cellule non vide en B donne X lignes renseignées (ou non) en C.
    A+

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 12
    Par défaut
    Merci Gorfael pour ta réponse.
    Ma demande est actuellement plus simple (je pense) que la constitution d'une BDD.
    J'ai recréé un exemple très simple qui reprends grossierement comment s'organise mon projet, il est en pièce jointe.
    J'ai pour cette exmple codé cette macro :

    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
    Sub test()
    If Range("B4") = "oui" And Range("B5") = "oui" And Range("B6") = "oui" And Range("B7") = "oui" Then GoTo ok Else GoTo ko
     
    ok:
    Sheets("Feuil2").Select
    Range("A2") = "OK"
    Exit Sub
     
    ko:
    If Range("B4") <> "oui" And Range("B5") = "oui" And Range("B6") = "oui" And Range("B7") = "oui" Then GoTo vac
    If Range("B4") <> "oui" And Range("B5") <> "oui" And Range("B6") = "oui" And Range("B7") = "oui" Then GoTo vactat
     
    vac:
    Sheets("Feuil2").Select
    Range("A2") = "KO"
    Range("A3") = "Pas vacciné"
    Exit Sub
     
    vactat:
    Sheets("Feuil2").Select
    Range("A2") = "KO"
    Range("A3") = "Pas vacciné"
    Range("A4") = "Pas tatoué"
    Exit Sub
     
    End Sub
    On y voit mon problème : je gère l'affiche final en Feuil2 suivant les états de la feuille1 :
    -si tout est ok alors on affiche ok
    -si vaccin pas ok mais tout le reste ok, on marque juste vaccin
    -si vaccin pas ok, tatouage pas ok et tout le reste ok, on affiche vaccin et tatouage
    -etc, etc

    Ce qui fait que je me retrouverai à devoir coder toutes les combinaisons de ok-pas ok possibles, à savoir des centaines et des centaines dans mon réel projet.

    Je voulais savoir s'il existait un moyen pour VBA de regarder lui même les réponses, de conserver les valeurs "non ok" pour les recoller proprement dans la feuille2.

    Merci
    Fichiers attachés Fichiers attachés

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut
    bonjour

    tout d'abords ton fichier joint n'ai pas trop parlant

    ensuite dans l'exemple de macro tu sélectionne aucune feuille a vérifier

    si je me fi a l'exemple que tu a joint je suppose qu'il y auras une feuille pour chaque animal


    ensuite si j'ai bien compris il y a en fait 3 variables possible au niveau du résultat

    en gros :
    ok
    pas ok
    ok a moitié

    mais si tu veux de l aide il faut être un peu plus précis a tout les niveau que je viens d'énumérer

    je vais neammoins essayer quelque tour de passe passe en suivant l'idée en gros

    au plaisir

    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
     
    Sub test2()
    Dim resultat As String
    For i = 4 To 7
    resultat = resultat & Sheets(1).Range("b" & i).Value 'ici c'est le sheets (1) qui est testé mais je suppose que la il y a une omission de ta part
    Next
    '1ere condition
    If resultat = "ouiouiouioui" Then
    Sheets("Feuil2").Select
    Range("A2") = "OK"
     
    '2eme condition
    ElseIf resultat = "nonouiouioui" Then
    Sheets("Feuil2").Select
    Range("A2") = "KO"
    Range("A3") = "Pas vacciné"
    '3eme condition
    ElseIf resultat = "nonnonouioui" Then
    Sheets("Feuil2").Select
    Range("A2") = "KO"
    Range("A3") = "Pas vacciné"
    Range("A4") = "Pas tatoué"
    End If
    End Sub
    au plaisir
    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
    Membre habitué
    Inscrit en
    Septembre 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 12
    Par défaut
    Merci de ta réponse patricktoulon.
    D'après ce que je comprends de ton code, tu arrives au même problème que précédemment : devoir lister manuellement toutes les possibilités, matérialisées ici en tant que "ouinonnonnon" ou "ouinonnonoui" ou encore "nonouinonoui" etc...

    Or ce que je voudrais c'est que :
    -la macro balaye une colonne (disons B)
    -quand elle trouve le terme défini (par exemple ici "KO"), elle stocke la valeur de la cellule qui se trouve à la gauche immédiate (donc en colonne A) de la valeur "KO" trouvée, et continue sa recherche.
    -Une fois la colonne balayée et toutes les valeurs correspondant aux "KO" stockées, les coller proprement dans un endroit défini (Feuil2 par exemple).

    Voila, et merci pour votre aide

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut Mihtsyou et le forum
    Pas très clair, ta demande : en admettant que je stocke ce que tu dis, et que vacciné soit "KO", tu te retrouves avec "Vacciné" en feuil2. Je présume que dans ta Feuil1, tu n'as pas qu'un seul animal (j'ai supposé qu'ils étaient tous en B avec le même formatage). Si tu as 50 animeaux, tu vas savoir que 2 sont abandonné, 3 pas vaccinés, etc.. et ça te sert à quoi ? Il faut savoir lequel est abandonné et lequel n'est pas vacciné, non ?

    Une proposition suivant ton exemple. Je suis parti du principe que les 7 lignes sont répétées pour chaque animal, en colonne A et B :
    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
    54
    55
    56
    57
    58
    59
    60
    Sub test()
    'Déclarations ---------------------------
    Dim F1 As Worksheet, F2 As Worksheet
    Dim Cel As Range, Celr As Range
    Dim X As Long, Y As Long
    Dim Tab_v()
    'MEI ------------------------------------
    Set F1 = Sheets("Feuil1")   'Feuille source
    Set F2 = Sheets("Feuil2")   'Feuille destination
    'Initialisation du traitement -----------
    Set Celr = F1.Range("A:A").Find("Nom", after:=Cells(Rows.Count, "A"))
    'recherche de la première cellule "Nom" en commençant de la ligne 1
    If Celr Is Nothing Then Exit Sub Else Set Cel = Celr
    'si Cel réf est vide on sort, sinon Celr=Cel
    ReDim Tab_v(6, 0)
    'Initialisation du tableau de variables
    Do  'début de boucle
        If Cel.Offset(0, 1) <> "" Then
        'si cellule à droite de "nom" n'est pas vide, alors
            For X = 3 To 6
            'Pour x de 3 à 6
                If Cel.Offset(X, 1) <> "oui" Then
                'si la cellule de la colonne B à x ligne de Non n'est pas "Oui", alors
                    ReDim Preserve Tab_v(6, UBound(Tab_v, 2) + 1)
                    'redimmensionner le tableau avec 6 colonne et 1 ligne de plus
                    Tab_v(1, UBound(Tab_v, 2)) = Cel.Offset(0, 0)
                    'Tableau colonne1, dernière ligne = nom
                    Tab_v(2, UBound(Tab_v, 2)) = Cel.Offset(0, 1)
                    Tab_v(3, UBound(Tab_v, 2)) = Cel.Offset(1, 0)
                    Tab_v(4, UBound(Tab_v, 2)) = Cel.Offset(1, 1)
                    Tab_v(5, UBound(Tab_v, 2)) = Cel.Offset(X, 0)
                    Tab_v(6, UBound(Tab_v, 2)) = Cel.Offset(X, 1)
                End If
            Next X
            'X suivant
        End If
        Set Cel = F1.Range("A:A").FindNext(Cel)
        'Cel = Prochaine cellule contenant "Nom" à partir de Cel
    Loop Until Cel.Row = Celr.Row Or Cel Is Nothing
    'Bouclage jusqu'à cel vide, ou retour à la première trouvée
    If UBound(Tab_v, 2) = 0 Then Exit Sub
    'si on est resté à 0 (on n'a rien trouvé), alors sortir de la macro
    Y = F2.Range("A" & Rows.Count).End(xlUp).Row
    'Y= première ligne de A non vide en partant de la dernière et en remontant
    If F2.Range("A" & Y) <> "" Then Y = Y + 1
    'si Ay = vide on est sur la ligne 1, sinon, y=y+1
    For X = 1 To UBound(Tab_v, 2)
    'pour x=1 à dernier indice de ligne de Tab_V
        F2.Range("A" & Y + 0) = Tab_v(1, X)
        'on recopie Tab_V dans F2
        F2.Range("A" & Y + 1) = Tab_v(2, X)
        F2.Range("B" & Y + 0) = Tab_v(3, X)
        F2.Range("B" & Y + 1) = Tab_v(4, X)
        F2.Range("C" & Y + 0) = Tab_v(5, X)
        F2.Range("C" & Y + 1) = Tab_v(6, X)
        Y = Y + 2
        'on saute les 2 lignes (Y et Y+1) qu'on vient de remplir
    Next X
    'X suivant
    End Sub
    Moins on a plus d'infos, plus on a moins à deviner.
    Je conçois (en un seul mot) que tu sois perdu et que certaines choses semblent si évidentes qu'il ne semble pas nécessaire de les mentionner.
    Mais on n'est pas dans ta tête. Et ce que tu demandes ne correspond pas à une logique de travail classique pour ce type de besoin. Donc, il faut expliquer. Et, de préférence, tes exemples doivent être cohérents avec tes explications.

    Si on doit interpréter, dis-toi que ce sera différemment de ce que toi tu penses, et pas dans le bon sens, comme nous l'a enseigné Murphy.

    Quand on fait un fichier d'exemple, pour qu'il soit réellement utile, il a 2 ou 3 exemples différents, avec des valeurs repérables et différentes, et une feuille avec le résultat que la macro doit fournir. Avec ça, plus les explications de comment on arrive au résuktat voulu, généralement, on peut dire si c'est possible, ou pourquoi ça ne l'est pas. Si on détecte des incohérences, si on a mieux à proposer, et la raison de cette proposition.
    A+

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

Discussions similaires

  1. [VB.NET] Affichage conditionnel dans un repeater
    Par NicoNGRI dans le forum ASP.NET
    Réponses: 4
    Dernier message: 07/02/2005, 12h58
  2. [Débutant] Affichage d'une grille
    Par Mathieu.J dans le forum OpenGL
    Réponses: 25
    Dernier message: 13/06/2004, 19h38
  3. [STRUTS] [JAVA] Affichage conditionnel de bean:write
    Par babylone7 dans le forum Struts 1
    Réponses: 6
    Dernier message: 29/04/2004, 16h20
  4. [QuickReport][Débutant] Affichage d'un graphique
    Par poufouille dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/03/2004, 09h03
  5. [Débutant] Affichage impossible en local
    Par Alberto dans le forum ASP
    Réponses: 2
    Dernier message: 29/11/2003, 16h45

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