Macro excel pour accès données

BOGI35 -  
 BOGI35 -
Bonsoir,
Dans un classeur Excel, j'ai 3 feuilles:
- Habilitation
- Suivi individuel
- Liste globale

A partir de la feuille habilitation, j'ai créé des macros me permettant:
- d'accéder à la feuille suivi individuel lorsque je souhaite visualiser les résultats d'un joueur (menu déroulant)
- d'accéder à la liste globale. (avec des macros de filtre automatique)

Dans cette dernière, j'ai en colonne A le nom des joueurs, en B le nom de l'entraineur (équipe) et en colonnes suivantes les performances réalisées chaque mois.

A partir de cette liste j'aimerais également pouvoir accéder à la feuille Suivi individuel d'un joueur en cliquant uniquement sur le nom de celui ci (colonne A). (ce qui m'éviterait de repasser par la feuille habilitation pour avoir une fiche détaillée reprenant uniquement les performances d'un joueur)

Est ce possible de répondre à cette demande par une macro ?

Je remercie par avance toutes les personnes qui pourraient m'aider.

Petite précision: Je ne suis pas un pro des macros (pour ne pas dire que je suis nul) mais je progresse gentillement grâce à vous. Merci pour les conseils et les solutions que vous proposés sur ce forum.

BOGI35
Configuration: Windows Vista
Internet Explorer 7.0

4 réponses

  1. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Utilises une macro événementielle Worksheet_SelectionChange ou Worksheet_BeforeDoubleClick
    selon ton désir en ciblant avec intersect par exemple la plage concernée.
    0
    1. BOGI35
       
      Merci gbinforme,
      Pour l'instant, ça ne me dit pas grand chose (c'est pour te dire mon niveau de connaissance en macros) mais je suis pugnace, peux tu m'en dire un peu plus pour la syntaxe ?
      Petite précision supplémentaire, la feuille de liste globale est protégée et doit le rester.

      En tout cas merci encore d'avoir bien voulu prendre un moment pour me répondre.

      Dans l'attente de te lire,

      BOGI35
      0
      1. gilou > BOGI35
         
        bonjour
        Private Sub Worksheet_Change(ByVal Target As Range)
        Dim C As Range
        Static EnCours As Boolean
        If EnCours Then Exit Sub 'Pour éviter un effet circulaire
        'Si modif utilisateur en A3 ou B12
        If Not Application.Intersect(Target, Union(Range("A3"), Range("B12"))) Is Nothing Then
        'Recherche de l'élément en colonne E
        Set C = Columns("E").Find(Range("A3").Value)
        If Not C Is Nothing Then
        'Si A3 a été modifiée par l'utilisateur
        If Target.Address = "$A$3" Then
        Range("C12").Value = C.Offset(0, 1).Value
        Else
        'Si C12 a été modifiée par l'utilisateur
        Range("C12").Value = Range("C12").Value + Range("B12").Value
        C.Offset(0, 1).Value = Range("C12").Value
        EnCours = True
        Range("B12").ClearContents
        EnCours = False
        End If
        End If
        End If
        End Sub
        je vous ai trouvé cela ("A3) sera la cell ou vous saisissez le mon ;col E ce que vous chercher;("C12") le resultat obtenu on peut meme modifier (mise a jour)avec("b12")
        l'ideal est de crer en A3 une liste deroulante
        0
      2. BOGI35 > gilou
         
        Bonsoir Gilou,
        Tout d'abord merci pour la solution proposée.
        Maintenant, là où il faut moins de 5 mn pour un initié, pour moi il me faudra plusieurs heures pour comprendre et adapter la syntaxe à mon projet. Je ne suis cependant pas certain d'avoir bien présenter mon problème. C'est pourquoi j'ai apporté des précisions cet après midi.
        La fonction "Worksheet_BeforeDoubleClick " proposée par gbinforme me paraissait adaptée (mais je n'en suis pas sûr, mes compétences en terme de macro étant proches de zéro, peut être n'ai je pas bien compris le sens de cette fonction).
        A ce stade de mon projet,
        j'accède à la "feuille individuelle" à partir d'une macro. La valeur de la cellule M13 de la feuille "Habilitation" saisie à l'aide d'un menu déroulant (ce qui semble correspondre à la cellule A3 dans votre réponse) détermine les critères de recherches - Fonction RechercheV -.
        Une 2ème macro me permet d'accéder à la liste compacte de tous les joueurs.

        Je souhaiterais ajouter la possibilité d'accéder à la feuille individuelle d'un joueur sans avoir à revenir dans la feuille habilitation. Dans le scénario que j'imagine, je double clic (sans doute la fonction "Worksheet_BeforeDoubleClick ") sur le nom du joueur choisi dans la liste globale (colonne A de la feuille liste globale). Cette action a pour effet de renseigner la cellule M13 de la feuille habilitation (déterminante pour la rechercheV de la feuille individuelle) et simultanément à la feuille suivi individuelle.


        C'est bien mais je ne sais pas l'écrire en mode macro.

        Voilà, voilà.

        Encore merci,


        BOGI35
        0
    2. BOGI35
       
      Bonjour gbinforme,
      Comme je te l'expliquais je ne suis pas un pro des macros mais pugnace...donc j'y arriverai.

      Mon souci:
      Le suivi individuel est accessible à partir de la cellule M23 de la feuille "Habilitation". (Le nom du joueur, sélectionné dans un menu déroulant vient renseigner la cellule D12 de suivi individuel, ensuite c'est une succession de RechercheV qui me permet de voir l'équipe, l'entraineur...et bien entendu les performances). = Macro: Accès suivi individuel.

      La liste globale est accessible à partir de la cellule M25 de la feuille "Habilitation" = Macro: Accès liste globale dans laquelle j'y ai inséré des filtres automatiques (auto filter à partir de critères de la feuille habilitation).

      Ce que j'imaginais (mais peut être n'ai je pas la bonne approche), c'est qu'à partir d'une macro (DoubleClick comme tu me le préconises), la valeur de la cellule ainsi sélectionnée dans la liste globale vienne se copier dans la Cellule M23 de la feuille "Habilitation". (déterminante pour toutes les RechercheV du suivi individuel)

      Je ne suis pas certain que ça marche, la valeur de la cellule M23 étant soit une saisie soit une formule. Peut elle être les deux à la fois ?

      Sans abuser de ton obligeance, peux tu me guider pour la syntaxe.
      Les trois feuilles et le classeur sont protégés par un mot de passe (masqué dans une 4ème feuille).

      J'ai réussi à faire tout ça en lisant ce forum, (il y a 06 mois je ne savais ce qu'était une macro) mais il y a des moments ça me paraît difficile.


      Merci encore


      BOGI35
      0
  2. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Je ne suis pas certain que ça marche, la valeur de la cellule M23 étant soit une saisie soit une formule. Peut elle être les deux à la fois ?

    Non la cellule ne peux contenir qu'une formule ou une valeur et si tu fais une saisie sur la formule tu écrases la formule.

    Si j'ai à peu près compris ton souhait, tu pourrais avoir quelque chose comme ceci :
    Private Sub Worksheet_BeforeDoubleClick(ByVal sel As Range, Cancel As Boolean)
    If Not Intersect(sel, [select_plage]) Is Nothing Then
        [choix].Value = sel.Value
        Cancel = True
    End If
    End Sub

    Pour que cette macro fonctionne, il faut :
    - la mettre dans la feuille concernée (mode d'emploi)
    - nommer "select_plage" ou comme tu veux et tu remplaces dans la macro, la plage de cellules où tu fais ton choix par double clic.
    - nommer "choix" ou comme tu veux et tu remplaces dans la macro, la cellule où tu veux avoir le résultat sélectionné.

    Ensuite, lorsque tu double cliques sur une cellule de la plage, ton résultat est documenté.

    Regardes si l'on est très loin et on peut améliorer si cela ne fait pas selon ton besoin.
    0
    1. BOGI35
       
      Bonsoir gbinforme,
      La macro ci après fonctionne à peu près correctement.

      Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      Dim sel As Range
      Set sel = Range("B3:B400") 'plage a définir
      If Not Application.Intersect(sel, Range(Target.Address)) Is Nothing Then
      Sheets("Liste globale").Range("AT1") = ActiveCell.Value
      End If
      End Sub


      Deux évolutions à apporter (mais pas forcément dans cette macro)
      1) La feuille et le classeur sont protégés (sauf la cellule AT1) aussi lorsque je double clique, la valeur est bien rapportée dans la cellule AT1 mais j'ai le message qui m'indique que la feuille est protégée.....
      As tu une idée pour qu'il n'aparaisse pas ?

      2) La valeur en AT reste affichée lorsque je reviens sur la feuille habilitation (je vais modifier la macro permettant le retour à la feuille habilitation.

      Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      Dim sel As Range
      Set sel = Range("B3:B400") 'plage a définir
      If Not Application.Intersect(sel, Range(Target.Address)) Is Nothing Then
      Sheets("Liste globale").Range("AT1") = ActiveCell.Value
      End If
      End Sub


      Merci encore, tes précieux conseils me permettent de progresser.

      Merci également à Gilou

      Bonne soirée

      BOGI35
      0
  3. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonsoir BOGI35,

    La macro serait mieux ainsi :
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    
    If Not Application.Intersect( Range("B3:B400"), Target) Is Nothing Then
       Sheets("Liste globale").Range("AT1") = Target.Value
       cancel=true
    End If
    End Sub
    


    1) j'ai le message qui m'indique que la feuille est protégée.....
    As tu une idée pour qu'il n'aparaisse pas ?


    Il me semble que si tu coches autoriser la sélection des cellules lors de la protection cela devrait fonctionner.

    2) La valeur en AT reste affichée lorsque je reviens sur la feuille habilitation (je vais modifier la macro permettant le retour à la feuille habilitation.

    Je ne comprend pas la question ?
    Veux-tu effacer AT1 ?
    Après la consultation ?
    Si c'est lorsque tu quittes "Liste globale" tu peux mettre dans cette feuille
    Private Sub Worksheet_Deactivate()
        Range("AT1").Value = ""
    End Sub
    
    0
    1. BOGI35
       
      Bonjour gbinforme,
      Je ne saurai trop te remercier.
      Mon projet avance.
      J'ai remplacé la macro que je t'avais soumise par la tienne...ça marche "nickel" et de plus je n'ai plus le message d'erreur...que du bonheur !!!
      Pour ce qui est du 2nd point, la macro que tu me proposes fonctionne mais ne me permet pas de visualiser les données du joueur sélectionné. En effet, lorsque j'appelle (de manière classique) la feuille suivi individuel, celà a pour effet d'effacer le contenu de "Liste Globale" AT1...(logique), donc plus de référence à la valeur recherchée dans mes formules RechercheV.
      En fait, ce n'est pas trop grave, tout est protégé, j'ai créé une macro qui permet de sortir de l'application sans sauvegarde, comme à l'ouverture cette cellule est vide ...la solution est toute trouvée.
      Maintenant il me reste à créer la macro pour accéder directement au suivi individuel à partir du double clique et mon projet sera pratiquement terminé.

      Je m'y replongerai ce soir... après avoir avalé quelques kms en VTT, histoire de se changer les idées.


      BOGI35
      0
    2. BOGI35
       
      Bonjour gbinforme,
      Sans vouloir abuser de ta disponibilité, pourrais tu me conseiller une nouvelle fois ?
      L'apprentissage est difficile !!!

      Ci après les macros que j'ai créées.
      La macro évènementielle que tu m'as conseillée fonctionne. (Seul petit souci, les feuilles et classeur étant protégés il faut double cliquer 3 fois pour obtenir le résultat attendu...mais ce n'est pas bloquant).

      Là ou je n'arrive plus à m'y retrouver c'est dans la phase suivante...qui me paraissait pourtant plus simple...
      J'essaie de m'expliquer:
      Dans mon classeur j'ai (entre autre) une feuille "habilitation" permettant à un utilisateur de s'identifier et d'accéder aux données (meu déroulant) qu'il est autorisé à visualiser ("UO 3", "UO 2", "UO 5").
      Avec la macro évènementielle que je viens de créer, il peut désormais aussi double cliquer sur un nom d'une des feuilles "UO 3", "UO 2"; "UO 5". Une formule conditionnelle dans une autre cellule de la feuille "habilitation" renvoie la valeur recherchée. (priorité au menu déroulant).

      A partir de cette sélection des macros renvoies soit vers "Suivi PdV", soit vers "suivi GRP".

      La où je n'arrive plus "à faire", c'est lorsqu'il s'agit de changer d'utilisateur.
      Les cellules R1 et R2 des feuilles "UO 3" ou "UO 2" ou "UO 5" restent renseignées lorsqu'on sort de l'application (Macro Retour habilitation) et interdisent au nouvel utilisateur d'accéder à sa sélection.


      J'ai essayé la macro ci après (Sub Retour_habilitation), j'ai un message d'erreur à la ligne Sheets("liste globale").Select.
      J'ai également essayé ta suggestion
      Private Sub Worksheet_Deactivate()
      Range("R1:R2").Value = ""
      End Sub
      Lorsque l'on relance l'application avec un nouvel utilisateur la fonction 'Doubleclick' est désactivée.

      As tu une solution à me proposer ?


      Avec mes remerciements anticipés.i



      BOGI35







      Macro de la feuille "UO 3"

      Private Sub WorkSheet_beforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      Dim mdp As String
      mdp = Sheets("feuil1").Range("A1").Value
      ActiveWorkbook.Unprotect mdp
      ActiveSheet.Unprotect mdp
      If Not Application.Intersect(Range("A3:A4,A6,A8:A15,A17:A21,A23:A31"), Target) Is Nothing Then
      Sheets("UO 3").Range("R1") = Target.Value
      Cancel = True
      ActiveWindow.SelectedSheets.Visible = False
      Sheets("Suivi PdV").Visible = True
      Sheets("Suivi PdV").Select
      ActiveSheet.Protect mdp
      ActiveWorkbook.Protect mdp
      End If


      ActiveWorkbook.Unprotect mdp
      ActiveSheet.Unprotect mdp
      If Not Application.Intersect(Range("A5,A7,A16,A22,A32"), Target) Is Nothing Then
      Sheets("UO 3").Range("R2") = Target.Value
      Cancel = True
      ActiveWindow.SelectedSheets.Visible = False
      Sheets("Suivi GRP").Visible = True
      Sheets("Suivi GRP").Select
      ActiveSheet.Protect mdp
      ActiveWorkbook.Protect mdp
      End If
      End Sub






      Sub Retour_habilitation()
      '

      Dim mdp As String
      mdp = Sheets("feuil1").Range("A1").Value
      ActiveWorkbook.Unprotect mdp
      ActiveSheet.Unprotect mdp
      ActiveWindow.SelectedSheets.Visible = False
      ActiveWindow.Visible = True
      Windows("Suivi_ARV_PDV_2009.xls").Activate
      Sheets("Habilitation").Select
      Range("F10:H10").Select
      Sheets("UO 3").Select
      Range("R1,R2").Value = ""
      ActiveSheet.Protect mdp
      ActiveWorkbook.Protect mdp

      End Sub
      0
  4. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Ta macro de la feuille "UO 3" serait plus propre ainsi car tu n'as pas à déprotéger si tu n'es pas dans la condition remplie
    Private Sub WorkSheet_beforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim mdp As String
    mdp = Sheets("feuil1").Range("A1").Value
    If Not Application.Intersect(Range("A3:A4,A6,A8:A15,A17:A21,A23:A31"), Target) Is Nothing Then
        ActiveWorkbook.Unprotect mdp
        ActiveSheet.Unprotect mdp
        Sheets("UO 3").Range("R1") = Target.Value
        Cancel = True
        ActiveWindow.SelectedSheets.Visible = False
        Sheets("Suivi PdV").Visible = True
        Sheets("Suivi PdV").Select
        ActiveSheet.Protect mdp
        ActiveWorkbook.Protect mdp
    End If
    
    
    If Not Application.Intersect(Range("A5,A7,A16,A22,A32"), Target) Is Nothing Then
        ActiveWorkbook.Unprotect mdp
        ActiveSheet.Unprotect mdp
        Sheets("UO 3").Range("R2") = Target.Value
        Cancel = True
        ActiveWindow.SelectedSheets.Visible = False
        Sheets("Suivi GRP").Visible = True
        Sheets("Suivi GRP").Select
        ActiveSheet.Protect mdp
        ActiveWorkbook.Protect mdp
    End If
    End Sub

    J'ai essayé la macro ci après (Sub Retour_habilitation), j'ai un message d'erreur à la ligne Sheets("liste globale").Select.


    Pas vu cette ligne dans ta macro qui me parait plus conforme ainsi mais je n'ai pas tout sous les yeux.
    Sub Retour_habilitation()
    '
    Dim mdp As String
    mdp = Sheets("feuil1").Range("A1").Value
    ActiveWorkbook.Unprotect mdp
    With Sheets("UO 3")
        .Unprotect mdp
        .Range("R1,R2").Value = ""
        .Protect mdp
    End With
    ActiveWorkbook.Protect mdp
    
    ActiveWindow.SelectedSheets.Visible = False
    ' ActiveWindow.Visible = True inutile ?
    Windows("Suivi_ARV_PDV_2009.xls").Activate
    Sheets("Habilitation").Select
    Range("F10:H10").Select
    
    End Sub
    

    Lorsque l'on relance l'application avec un nouvel utilisateur la fonction 'Doubleclick' est désactivée.

    As tu une solution à me proposer ?


    Il doit sans doute y avoir une déactivation quelque part sinon ce n'est pas la macro désactivate qui bloque.

    Essaies, lorsque tu te positionnes sur la page du doubleclic de mettre :
    Application.EnableEvents = True
    0
    1. BOGI35
       
      Bonsoir gbinforme,

      Tu es génial et surtout patient.
      J'essaierai la syntaxe ce soir, pour l'instant je sature...
      Pas facile à plus de 53 piges de découvrir Excel et ses fonctionnalités. Les bouquins que j'achète sont souvent très difficiles "à décrypter" pour un débutant, heureusement qu'il y a des personnes comme toi.

      Au fait, si ça marche comment change t'on le statut pour le passer en résolu ? (au moins pour ce cas là, nul doute que je devrai encore solliciter de l'aide)

      Mille mercis

      Avec ma plus sincère reconnaissance

      Bonne soirée.


      BOGI 35
      0