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 :

Sélection d'une plage ou lignes en fonction de la cellule active


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Femme Profil pro
    assistante de formation
    Inscrit en
    Septembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : assistante de formation
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2018
    Messages : 6
    Par défaut Sélection d'une plage ou lignes en fonction de la cellule active
    Bonjour à tous,
    Evidemment mon brouillon ne s'est pas enregistré...je recommence ! lol
    Je bloque sur une macro et je suis certaine que c'est tout bête...mais je tourne en rond depuis des heures sans trouver de solution.
    J'ai un tableau excel pour répertorier toutes les inscriptions aux formations que nous organisons.
    Colonne 1 = n° de la formation
    colonnes suivantes = renseignements agents + renseignements sur la formation
    Beaucoup de colonnes en double mais ce fichier me sert pour le publipostage également.
    J'ai besoin d'une macro pour agir sur les cellules qui se trouvent à droite de la cellule active (ex : formation1), ça c'est ok, elle fonctionne.
    J'ai également besoin que cette macro agisse sur toutes les lignes à droite du contenu de la cellule active. En bref, je souhaiterais agir sur toutes les cellules qui concernent la formation1.
    Pour le moment ma macro est celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Range(ActiveCell, ActiveCell.Offset(0, 8)).Select
        Selection.Font.Bold = True
        Selection.Font.Italic = True
        Selection.Font.Underline = xlUnderlineStyleSingle
        With Selection.Interior
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
            .Color = 65535
            .TintAndShade = 0
            .PatternTintAndShade = 0
        End With
    End Sub
    Pour info, j'ai presque tout appris toute seule, je ne sais pas lire le langage vba, je me débrouille comme je peux !
    Pouvez-vous m'aider ?
    Un grand merci.
    Hermy

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par HERMY Voir le message

    Bonjour,

    Un exemple dans le fichier joint. La mise en forme peut se faire soit sur clic droit dans une cellule de la colonne A, soit sur toutes les lignes avec le bouton de mise en forme.

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par HERMY Voir le message
    J'ai besoin d'une macro pour agir sur les cellules qui se trouvent à droite de la cellule active (ex : formation1), ça c'est ok, elle fonctionne.
    J'ai également besoin que cette macro agisse sur toutes les lignes à droite du contenu de la cellule active.
    Peux-tu expliquer ce que tu entends par "les lignes à droite" ? Tu veux parler de cellules (mais, dans ce cas, je ne vois pas la différence avec la phrase précédente), de colonnes, de lignes en dessous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(ActiveCell, ActiveCell.Offset(0, 8)).Select
    Perso, j'aurais plutôt écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Cible As Range
    Set Cible = ActiveCell.Resize(1, 9)
    en remplaçant "Selection" par "Cible" dans la suite du code.

  4. #4
    Membre à l'essai
    Femme Profil pro
    assistante de formation
    Inscrit en
    Septembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : assistante de formation
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2018
    Messages : 6
    Par défaut
    Déjà un grand merci pour vos réponses !
    Eric, j'ai testé ta macro mais elle me colore tout le tableau. Sur la colonne de gauche, tu as mis formationA, formationB, formationC, en fait dans mon tableau, il y plein de fois formationA, formationB, formationC.
    Ce que je voudrais, c'est que lorsque je suis positionnée sur une cellule formationA, la macro agisse sur toutes les autres lignes qui débutent également par formationA.
    Je n'emploie peut-être pas les bons termes .

    Menhir, oui, il s'agit bien des cellules à droite et non des lignes ! Pardon.
    J'ai bien une macro qui s'applique à la ligne sur laquelle je suis, qui colore tant de cellules à droite de la cellule active. Je voudrais qu'elle s'applique aussi aux autres lignes qui débutent par le même contenu que la cellule active.

    encore merci pour votre aide.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par HERMY Voir le message
    Ce que je voudrais, c'est que lorsque je suis positionnée sur une cellule formationA, la macro agisse sur toutes les autres lignes qui débutent également par formationA.
    Le fichier joint contient la solution, mais quel code dois-tu écrire pour ne sélectionner que ces enregistrements en prenant comme modèle la procédure qui traite tout le tableau ?
    Procédure qui remplacera ensuite celle dans l'événement clic-droit.

  6. #6
    Membre à l'essai
    Femme Profil pro
    assistante de formation
    Inscrit en
    Septembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : assistante de formation
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2018
    Messages : 6
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Peux-tu expliquer ce que tu entends par "les lignes à droite" ? Tu veux parler de cellules (mais, dans ce cas, je ne vois pas la différence avec la phrase précédente), de colonnes, de lignes en dessous ?

    J'ai également besoin que cette macro agisse sur toutes les lignes à droite du contenu de la cellule active. : oui ce n'est pas très clair ! Je parlais des autres lignes qui contiennent la même chose que la cellule où je me trouve.


    Perso, j'aurais plutôt écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Cible As Range
    Set Cible = ActiveCell.Resize(1, 9)
    en remplaçant "Selection" par "Cible" dans la suite du code.

  7. #7
    Membre à l'essai
    Femme Profil pro
    assistante de formation
    Inscrit en
    Septembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : assistante de formation
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2018
    Messages : 6
    Par défaut
    Citation Envoyé par Eric KERGRESSE Voir le message
    Le fichier joint contient la solution, mais quel code dois-tu écrire pour ne sélectionner que ces enregistrements en prenant comme modèle la procédure qui traite tout le tableau ?
    Procédure qui remplacera ensuite celle dans l'événement clic-droit.
    Merci Eric, c'est bien ça, lorsque je suis sur le 1er A, je voudrais que la macro colore en gris les 20 cellules à droite et qu'elle colore de la même manière les autres lignes qui commence par A.

    Un grand merci pour le temps que tu me consacres.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par HERMY Voir le message
    Merci Eric, c'est bien ça, lorsque je suis sur le 1er A, je voudrais que la macro colore en gris les 20 cellules à droite et qu'elle colore de la même manière les autres lignes qui commence par A.
    .
    Tu devrais pouvoir modifier le code par toi-même, il n'est pas difficile à déchiffrer.
    Demande si tu ne comprends pas.

  9. #9
    Membre à l'essai
    Femme Profil pro
    assistante de formation
    Inscrit en
    Septembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : assistante de formation
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2018
    Messages : 6
    Par défaut
    Citation Envoyé par Eric KERGRESSE Voir le message
    Tu devrais pouvoir modifier le code par toi-même, il n'est pas difficile à déchiffrer.
    Demande si tu ne comprends pas.
    Eric, lorsque je clique sur "macros", il n'y a rien dans la liste ! les 2 lignes "A" sont bien colorées (changer la couleur, étendre le nombre de cellules à sélectionner sur la droite, souligner si j'en ai envie...ça je dois pouvoir le faire) mais rien dans les macros !! Elle est cachée ailleurs ??

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par HERMY Voir le message
    Eric, lorsque je clique sur "macros", il n'y a rien dans la liste ! les 2 lignes "A" sont bien colorées (changer la couleur, étendre le nombre de cellules à sélectionner sur la droite, souligner si j'en ai envie...ça je dois pouvoir le faire) mais rien dans les macros !! Elle est cachée ailleurs ??
    Parce que ce sont des macros paramétriques. Il faut que tu ailles dans l'éditeur VBA (Alt-F11) pour les trouver.

  11. #11
    Membre à l'essai
    Femme Profil pro
    assistante de formation
    Inscrit en
    Septembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : assistante de formation
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2018
    Messages : 6
    Par défaut
    Bon, ça ne fonctionne toujours pas, j'arrive bien à colorer la ligne si je suis dessus mais pas à colorer toutes les lignes qui contiennent la même valeur que la cellule active. Je vais continuer à chercher jusqu'à ce que je trouve une solution.
    Merci pour votre aide. J'ai malgré tout appris plein d'autres trucs grâce au forum !!

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par HERMY Voir le message
    Bon, ça ne fonctionne toujours pas, j'arrive bien à colorer la ligne si je suis dessus mais pas à colorer toutes les lignes qui contiennent la même valeur que la cellule active. Je vais continuer à chercher jusqu'à ce que je trouve une solution.
    Si tu vas dans le module de l'onglet Feuil1 du dernier fichier que j'ai mis en ligne, regarde ce code.
    Je viens simplement d'ajouter une variable DerniereLigne pour limiter la macro à ton tableau.

    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
     
     
    Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
     
    Dim DerniereLigne As Long
     
        If Target.Count > 1 Then Exit Sub
     
        DerniereLigne = Range("A" & Rows.Count).End(xlUp).Row
     
        If Not Intersect(Target, Range("A11:A" & DerniereLigne)) Is Nothing Then
     
           RazToutLeTableau ActiveSheet
           MiseEnFormeCellulesFormationV2 ActiveSheet, Target
     
           Cancel = True
     
        End If
     
    End Sub


    Avec un double-clic sur le nom de la macro MiseEnFormeCellulesFormationV2 puis avec clic-droit, tu choisis "Définition" comme dans le vidage d'écran ci-dessous. Cela va t'amener directement sur la procédure :

    Pièce jointe 415910



    Celle-ci lance la macro : MiseEnFormeCellulesFormation. Rebelote, double-clic sur le nom, clic-droit et Définition.
    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
     
     
    Sub MiseEnFormeCellulesFormationV2(ByVal FeuilleFormation As Worksheet, ByRef CelluleEnCours As Range)
     
    Dim LigneEnCours As Long, LigneDeTitre As Long, DerniereLigne As Long
     
        On Error GoTo Fin
     
        Application.ScreenUpdating = False
     
        LigneEnCours = CelluleEnCours.Row
     
        With FeuilleFormation
     
             LigneDeTitre = 10
             DerniereLigne = .Cells(.Rows.Count, 1).End(xlUp).Row
     
             If DerniereLigne <= LigneDeTitre Then
                MsgBox "Pas de formation dans le tableau !", vbCritical
                GoTo Fin
             End If
     
             For LigneEnCours = LigneDeTitre + 1 To DerniereLigne
                 If .Cells(LigneEnCours, 1) = CelluleEnCours Then
                    MiseEnFormeCellulesFormation FeuilleFormation, LigneEnCours
                End If
             Next LigneEnCours
     
             Application.ScreenUpdating = True
     
           '  MsgBox "Fin de mise en forme !", vbInformation
     
        End With
     
        CelluleEnCours.Select
     
    Fin:
     
         Application.ScreenUpdating = True
     
    End Sub


    Cette procédure contient deux autres procédures. C'est l'une d'elles que tu cherches à modifier.
    Nb : C'est vrai que j'aurais faire plus simple et mettre ces procédures directement dans MiseEnFormeCellulesFormationV2, mais je pratique comme cela pour clarifier le code car dans MiseEnFormeCellulesFormation, on aurait pu avoir plusieurs dizaines de lignes.

    Il te faut maintenant :
    • Neutraliser la ligne MefCellulesFormatType2, car c'est elle qui colorie en bleu pastel les cellules de la colonne 9 à la colonne 12.
    • Modifier la ligne MefCellulesFormatType1 en changeant les numéros de colonne pour aller de 1 à 20.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Sub MiseEnFormeCellulesFormation(ByVal FeuilleFormation As Worksheet, ByVal LigneEnCours As Long)
     
        With FeuilleFormation
     
            MefCellulesFormatType1 .Range(.Cells(LigneEnCours, 2), .Cells(LigneEnCours, 8))
            MefCellulesFormatType2 .Range(.Cells(LigneEnCours, 9), .Cells(LigneEnCours, 12))
     
        End With
     
    End Sub

    Ton code devrait ressembler à celui là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Sub MiseEnFormeCellulesFormation(ByVal FeuilleFormation As Worksheet, ByVal LigneEnCours As Long)
     
        With FeuilleFormation
     
            MefCellulesFormatType1 .Range(.Cells(LigneEnCours, 1), .Cells(LigneEnCours, 20))
           ' MefCellulesFormatType2 .Range(.Cells(LigneEnCours, 9), .Cells(LigneEnCours, 12))
     
        End With
     
    End Sub

    Pièce jointe 415915

  13. #13
    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 114
    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 114
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Solution plus basique et peut-être plus simple à mettre en place en utilisant les outils natifs d'excel et une procédure événementielle de la feuille (pour l'exemple un double clic)
    Il est possible bien entendu d'activer cette mise en forme conditionnelle par
    • simple sélection
    • clic droit
    • double clic
    • modification de la valeur d'une cellule
    • etc.


    Etapes à suivre
    1. à l'aide de l'outil Gestionnaire des noms créer une constante nommée (par exemple pRef avec comme référence ="B" (juste pour tester la MFC)
    2. sélectionner les données du tableau (par exemple A2:H200)
    3. dans la mise en forme conditionnelle, choisir la règle Choisir une formule pour déterminer pour quelles cellules le format sera appliqué,
    4. écrire cette formule et choisir le format à appliquer


    Code de la procédure événementielle de la feuille où se trouve le tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      If Target.Column = 1 Then ' A améliorer 
        ThisWorkbook.Names("pRef").Value = Target.Value
        Cancel = True
      End If
    End Sub
    Il y a lieu d'améliorer la ligne 2 de la procédure (par exemple en ajoutant INTERSECT mais je n'ai pas le temps pour l'instant. Je ne sais pas nons plus si le tableau est un tableau structuré ou une plage de données

    [EDIT]
    J'ai modifié la procédure pour que cela ne concerne que le tableau. Pour l'exemple c'est un tableau structuré et il est seul dans la feuille
    J'ai ajouté un classeur de démonstration

    Code de la procédure modifiée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      If Not Application.Intersect(Target, Me.ListObjects(1).DataBodyRange) Is Nothing Then
        If Target.Column = 1 Then
          If Len(Target) Then ThisWorkbook.Names("pRef").Value = Target.Value
          Cancel = True
        End If
      End If
    End Sub
    Autre exemple avec la procédure événementielle SelectionChange (Simple sélection de la cellule de la colonne A)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      If Not Application.Intersect(Target, Me.ListObjects(1).DataBodyRange) Is Nothing Then
        With Target
         If .Column = 1 And Len(.Value) Then ThisWorkbook.Names("pRef").Value = .Value
        End With
      End If
    End Sub
    Fichiers attachés Fichiers attachés
    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

Discussions similaires

  1. selectionner une plage de lignes vides
    Par anaisanais dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 30/01/2008, 16h21
  2. Sélection d'une plage (je n'y arrive pas même avec la FAQ :'( )
    Par Zak Blayde dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 11/01/2008, 14h26
  3. Selection d'une plage avec ligne variable
    Par ginkas31 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/01/2008, 07h04
  4. Userform pour sélection d'une plage de cellule
    Par humbp dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/01/2008, 12h41
  5. Sélection d'une plage de dates
    Par Bouanda dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/10/2004, 20h27

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