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 colonne fonction de la date + format colone


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 30
    Points : 20
    Points
    20
    Par défaut Sélection colonne fonction de la date + format colone
    Bonjour,

    Voila j'ai piqué un peu partout des éléments afin de créer ce que je désirais, mais visiblement j'ai quelques difficultés, votre aide est la bienvenu. Mon problème est celui-ci :

    Dans la plage G1:R1 j'ai des dates (ces dates sont liées à d'autres onglets). Elles vont de Janvier à Décembre de l'année en cours ! Parmi les colonnes allant de G1 à R1 je veux affichés que 2 colonnes. Exemple si je suis en septembre je veux afficher juillet et aout soit range M1 et range N1.

    Donc première étape boucle for dans cette plage et si je rencontre le mois système -1 et mois système -2 je les affiches, le reste je cache.

    Seconde étape et la je suis encore un peu plus perdu. Sur les 2 colonnes affichées je veux mettre en place une « mise en forme conditionnelle ». C’est-à-dire si je continu sur l’exemple précédent :
    Si la valeur en M2 supérieur à D2 la cellule devient rouge ;
    Si la valeur en M3 supérieur à D3 idem ;
    .... M4 et ainsi jusque M23 ;

    Et idem pour N.

    Actuellement j’ai écrit tout ceci :
    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
    Sub Macro6()
     
     
        Dim MoisReel As Variant 'je déclare le mois système -1
        Dim MoisInf As Variant  'je déclare le mois système -2
        Dim madate As Variant   'je déclare la date des cellules G1 à R1
        Dim ColCache As Integer 'je déclare les colonnes à cacher
        Dim Plage As Range
        Dim Cell As Range
     
        Set Plage = Range("G1:R1")
       ' Plage.NumberFormat = "@"  'j'ai vu sa ailleurs, mais j'avoue ne pas trop avoir compris le but ... dsl
        MoisReel = Month(Date) - 1 'valeur prise, je ne veux que le mois
        MoisInf = Month(Date) - 2
        MsgBox (MoisReel) 'hihi j'ai vérifié sa marche, j'ai bien (je suis en octobre) 09 ou septembre
        MsgBox (MoisInf)  'hihi j'ai vérifié sa marche, j'ai bien (je suis en octobre) 08 ou juillet
     
        For Each Cell In Plage   'dans la plage, je regarde chaque cellule
        madate = Cell.Value
     
             If Mid(madate, 2, 2) <> MoisReel Or MoisInf Then   'je veux qu'il ne fasse le test que sur le mois (mid... est la pour uniquement prendre le mois)
                ColCache = ActiveCell.Column    'ici je cache tout ce qui nest pas égal au mois système -1 et -2
                Columns(ColCache).Select
                Selection.EntireColumn.Hidden = True
             Else
                For i = 4 To 23 Step 1        'maintenant sur les 2 colonnes que je désire visualiser, je veux mettre le format
                    Range("").Select          'mais j'ai du mal a faire le boucle sur les colonnes que je désire
                    Selection.FormatConditions.Delete
                    Selection.Formatcontitions.Add Type:=xlCellValue, Operator:=xlGreater, Formula1:="=$" & i
                    Selection.FormatConditions(1).Interior.ColorIndex = 3
                Next
             End If
     
        Next
     
        Set Plage = Nothing
     
    End Sub

    je suis dispo pour tout renseignement, n'hésitez pas à me donner des idées, suis un peu novice en vba!

    Merci par avance

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    As-tu jeté un oeil sur la "Mise en forme conditionnelle" dans Excel ? (menu format)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    752
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 752
    Points : 832
    Points
    832
    Par défaut
    Plage.NumberFormat = "@" correspond au format texte pour la plage.

    Petite suggestion: remplace ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MoisReel = Month(Date) - 1 'valeur prise, je ne veux que le mois
        MoisInf = Month(Date) - 2
    par ceci qui est un peu plus rapide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MoisReel = Month(Date) - 1 'valeur prise, je ne veux que le mois
        MoisInf = MoisReel -1
    Tu as un problème au niveau de la cache. Essaye ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ColCache = ActiveCell.Column
    à la place de ceci:
    En effet, tu n'as jamais activé de cellule.

    Et enfin remplace ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                For i = 4 To 23 Step 1        'maintenant sur les 2 colonnes que je désire visualiser, je veux mettre le format
                    Range("").Select          'mais j'ai du mal a faire le boucle sur les colonnes que je désire
                    Selection.FormatConditions.Delete
                    Selection.Formatcontitions.Add Type:=xlCellValue, Operator:=xlGreater, Formula1:="=$" & i
                    Selection.FormatConditions(1).Interior.ColorIndex = 3
                Next
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                With Range(Cells(1, Cell.Column), Cells(24, Cell.Column))
                    ' Ici le bon code pour le format
                End With
    Cela tévite au passage de sélectionner ta cellule et aussi defaire une boucle.

    Je n'ai rien optimisé et je n'ai pas tout corrigé, et sinon je n'ai rien qui me permet de tester si tes formats de cellule fonctionnent.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 30
    Points : 20
    Points
    20
    Par défaut
    Re,

    Alors tout d'abord merci pour ce début de réponse

    Ensuite,
    Je désire mettre la forme conditionnelle uniquement sur les 2 colonnes sélectionnées. Mais ces colonnes changent tous les mois. C'est pour cela que je ne passe pas par le menu format etc...

    J'ai mis justement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ColCache = ActiveCell.Column


    enfin en ce qui concerne le while il y a un problème... C'est que je veux qu'il fasse un test "supérieur" à la même ligne mais colonne différente. CAD si j'ai colonne H non caché, je veux qu'il fasse un test pour voir si H4, H5 ... H23 sont supérieurs à D4,D5,... D23... et donc je crois devoir passé par la boucle For. Mais tu m'as donnée une idée, je peux faire comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For i = 4 To 23
    Range(Cells(i, Cell.Column)).Select
    .FormatConditions.Delete
    .Formatcontitions.Add Type:=xlCellValue, Operator:=xlGreater, Formula1:="=$D" & i
    .FormatConditions(1).Interior.ColorIndex = 3
    Next
    Je pense que sa doit être bon mais je demande confirmation

    Non je déconne en fait j'ai aucune idée de si c'est bon ou pas, je fais un peu sa au feeling

    et sinon quelqu'un sait si ce que j'ai mis comme condition ci dessous est correcte ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Mid(madate, 2, 2) <> MoisReel Or MoisInf Then
    Merci par avance

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    752
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 752
    Points : 832
    Points
    832
    Par défaut
    Oups j'ai inversé les deux: tu aurais pu t'en apercevoir. C'est ceci que tu dois utiliser:
    Ensuite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(Cells(i, Cell.Column)).Select
    ne fonctionnera pas: Range n'accepte pas qu'on lui donne un seul Cells. Utilise plus simplement:
    Pour ta comparaison de cellules, je ne vais pas te taper le code, mais je vais te donner une piste: parcours avec le for que tu as écrit, et compare la valeur de la cellule Cells(i, Cell.Column) à celle de la cellule Cells(i,4), où 4 correspond à la colonne D.

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/03/2015, 19h21
  2. Sélection colonne date courante
    Par j.mathieu dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 22/02/2009, 20h12
  3. Problème de sélection en fonction des dates
    Par skare dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 22/06/2007, 06h47
  4. Réponses: 5
    Dernier message: 20/02/2007, 17h52
  5. Regrouper une sélection en fonction d'un champ et d'une date
    Par 12_darte_12 dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 29/03/2006, 17h12

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