VB excel, changer de ligne

Résolu
Bonjour,

Je suis en train de créer une macro qui vérifie chaque cellules de la colonne G sur chaque ligne (jusqu'a la ligne 56), par rapport a ce qui est écrit dans cette cellule et dans une la colonne J sur la même ligne.

J'ai fait mes jolies boucles IF etc,etc, mais je n'arrive pas a changer à descendre à chaque tour de ma boucle For à la ligne en dessous.

Pourriez-vous éclairer ma lanterne à ce sujet ? Si vous avez besoin de plus d'informations n'hésitez pas à me demander. (je débute dans la prog VBA)

Merci beaucoup.

Bonne soirée.
Configuration: Windows XP Internet Explorer 6.0

24 réponses

  1. bien comme c'est résolu!
    bonne journée à tous.

    en plus je dis colorindex et j'écris .color ....
    besoin de vacances peut-être...
    1. je pense que tu peux simplifier ton code

      avec une boucle for each..... next

      je pense que tu devrais utiliser .Interior.colorindex = 3 ( ou une autre valeur)
      ainsi tu aurais directement ta couleur.
      par contre je ne comprends pas bien ton test and d < J

      un exemple de boucle for each
      si tu précises la référence de d et j je te l'écris

      Sub test1()
      Dim C As Variant
      
      For Each C In Sheets("Feuil9").Range("G6:G55")
          If C.Value <> "Terminée" And d < j Then
                  C.Interior.Color = 3
              ElseIf d > j - 7 Then
                  C.Interior.Color = 4
              
              End If
      
      
      Next
      End Sub
      1. je ne savais pas qu'avec les mises en forme conditionnelles on pouvait faire ça, du moins tout ça.

        et puis il fallait que ça s'exécute par un bouton et frenchement ça me tentait bien de me lancer là-dedans dans le cadre du boulot :)
        1. Contributeur
          Re, de rien mais j'étais en train d'éditer mon dernier msg...donc :
          autre remarque, ce code ne fait qu'une mise en forme en fonction de tes conditions, pourquoi ne pas utiliser une simple mise en forme conditionnelle ?
          1. pour la proposition de tompols: s'il y a une erreur dès le premier if, rajoute le nom de la feuille devant les range ou bien utilise with sheets("feuille9") au début et end with a la fin de la procédure et met un point juste avant le range
            1. Waouw, génial ça fonctionne.

              Merci énormement, j'étais pas si loin du but, mais je n'aurais pas su y arriver tout seul.

              C'est ma première macro en VB excel, donc merci.

              Bonne journée, je vais m'inscrire sur ce forum qui est génial, mon truc c'est le hardware mais j'adore la prog alors je vais pouvoir si possible aider.

              Merci encore à tous. Bonne journée et bonne continuation.
              1. Contributeur
                Ok, essaie comme ceci :
                Private Sub CommandButton1_Click()
                
                Dim n As Integer
                
                For n = 1 To 6
                If Range("J" & n).Value <> "Terminée" And Range("G" & n).Value < Range("A3").Value Then
                    Range("G" & n).Interior.Color = RGB(255, 0, 0)
                ElseIf d > j - 7 Then
                    Range("G" & n).Interior.Color = RGB(255, 255, 0)
                End If
                Next
                
                MsgBox "La colonne délai a été triée", vbInformation
                
                End Sub 

                EDIT : ptite remarque sur ta msgbox à la fin, à ta place je n'utiliserais pas le terme "triée" (c'est faux, tu ne fais aucun tri) mais plutot "traitée" ou "colorée"...
                EDIT2 : autre remarque, ce code ne fait qu'une mise en forme en fonction de tes conditions, pourquoi ne pas utiliser une simple mise en forme conditionelle ?
                1. pour utiliser la valeur d'une cellule tu peu rajouter .value après ton range

                  le cells ne contient pas de "", juste le numéro de la ligne et le numéro de la colonne (séparé par une virgule) de plus dans ton cas tu doit rajouter .adress a ton cells pour renvoyer l'adresse sous la forme A1 a ton range
                  1. Okay, merci encore et voila ce que j'ai modifié :

                    Private Sub CommandButton1_Click()

                    Dim s, d, j As Object
                    Dim n As Byte

                    s = Feuil9.Range(Cells("n & 10"))
                    d = Feuil9.Range(Cells("n & 7"))
                    j = Range("A3")

                    For n = 6 To 55 Step 1
                    If s <> "Terminée" And d < j Then
                    Range(d).Interior.Color = RGB(255, 0, 0)
                    ElseIf d > j - 7 Then
                    Range(d).Interior.Color = RGB(255, 255, 0)
                    End If
                    Next

                    MsgBox "La colonne délai a été triée", vbInformation

                    End Sub

                    Le fait est que je veux coloré les cases de la colonne G en rouge ou en jaune par rapport à J(c'est une date) et à S(c'est écrit soit "terminée", soit "en cours" soit "pas débutée".

                    Merci.
                    1. Contributeur
                      re,
                      plusieurs remarques :
                      - Feuil9.Range("J6 & n") s'écrit en fait : Feuil9.Range("J" & n)
                      - je ne comprends pas pourquoi utiliser des variables au debut si la valeur est fixe : Feuil9.Range("J6") suffit.
                      - ton initialisation de n, s, d et j ne sert à rien puisque tu ne les utilises pas (s et j) ou que tu écrases la valeur(d et n).
                      - ta variable d renvoi un numéro de couleur, Range(d) n'est donc pas correct.
                      - tu utilises ElseIF mais sans le IF ( if = "si", elseif = "sinon" => elseif ne peut s'employer que si If est avant)...
                      Je vois que u cherches à colorer des cases...peux-tu stp expliquer tes criteres, ce sera plus simple pour t'aider sur le code (tu parles de statut et de date au post 3) ?
                      1. s = Range("J6") 'il vaudrai mieux avoir déclaré s comme une variable objet pour qu'elle puisse etre utilisé en remplacement du range("J6")
                        d = Range(Cells("7" & n)).Interior.Color 'idem et cells ("7" & n) est faux puisque la syntaxe est cells(numligne,numcolonne) et ce n'est pas utile de le coupler a range
                        j = Range("A3")'idem que le premier commentaire
                        n = 6'pas utile
                        
                        For n = n To 55 Step 1 'remplace n=n par n=6
                        If statut <> "Terminée" And d < jour Then 'statut veut dire quoi ? d ne peut pas etre inférieur a jour puisque d est égal a la couleur d'une cellule
                        d = RGB(255, 0, 0)
                        ElseIf d > jour - 7 Then 'encore une fois, d ne peut pas etre comparé a jour car on ne compare pas une couleur a une date
                        d = RGB(255, 255, 0)
                        End If
                        Next 


                        bon ben voila mes commentaires ^^

                        ps: correction pour la "variable objet" j'ai vu que tu avai déclaré en variant juste au dessus
                        1. Merci pour votre motivation, le message d'erreur qui s'affiche est :

                          Erreur d'exécution "1004" : erreur définie par l'application ou par l'objet

                          Private Sub CommandButton1_Click()

                          Dim s, d, j As Variant
                          Dim n As Byte

                          n = 6
                          s = Feuil9.Range("J6 & n")
                          d = Feuil9.Range("G6 & n").Interior.Color
                          j = Range("A3")

                          For n = n To 55 Step 1
                          Range(d) = RGB(255, 0, 0)
                          ElseIf d > j - 7 Then
                          Range(d) = RGB(255, 255, 0)
                          End If
                          Next

                          MsgBox "La colonne délai a été triée", vbInformation

                          End Sub

                          Voila, je vous ai mis tout le code, en éspérant que ça puisse vous aider.
                          1. Contributeur
                            Bonjour D-Rabbit,
                            s = Range("J6")
                            d = Range(Cells("7" & n)).Interior.Color
                            j = Range("A3")
                            n = 6 

                            dans ce code, tu initialises la valeur de n après d = Range(Cells("7" & n)).Interior.Color ..... d'où l'erreur....
                            ce que je ne comprends pas c'est l'utilisation de n (et d) avant ta boucle......peux-tu stp mettre ton code que l'on regarde....
                            1. Sheets("Feuil9").Range("G" & n).Interior.Color ou Feuil9.Range("G" & n).Interior.Color sont équivalents dans la mesure ou Feuil9 existe. Je l'ai vérifié

                              D-Rabbit, tu n'as très probablement pas initialisé n à un numéro de ligne comme je te l'avais dit. donc tu essayes de lire la couleur de G0, ce qui ne marche pas car G0 n'existe pas. Quel est ton message d'erreur ?
                              1. Okay, et vous êtes sûr du ("G" & n) ? parce que quand je l'enlève et le remplace juste par "G6" par exemple, ça fonctionne.
                                1. c'est Sheets("feuil9").Range("G" & n).Interior.Color (enfin pour le Interior.color je ne suis pas sur puisque je n'utilise pas cette fonction, cependant pour le sheets et le range je suis sur)
                                  1. D'accord, mais j'ai l'impression que l'erreur vient de ça :

                                    d = feuil9.range("G" & n).Interior.Color
                                    1. Je rectifie un peu mon explication : Feuil9 n'est pas une variable quelconque, c'est quand même une feuille (type worksheet). Tu as donc le choix des écritures :
                                      d = Sheets("Feuil9").Range("G" & n).Interior.Color
                                      ou
                                      d = Feuil9.Range("G" & n).Interior.Color
                                      mais dans tous les cas d = Sheets(Feuil9).Range("G" & n).Interior.Color est incorrect
                                      1. Bonjour

                                        Comme tu n'as pas mis de guillemets autour de Feuil9, c'est pour lui une variable quelconque, initialisée à 0. Alors que Sheets a besoin d'une chaine (le nom de la feuille) comme paramètre
                                        Remets des guillemets autour de Feuil9 et cette ligne-là va re-rentrer dans l'ordre - si n est initialisé à un numéro de ligne avant

                                        Par contre, je crois que tu vas avoir de mauvaises surprises plus loin. Quand tu feras d = RGB(255, 0, 0) , ne crois surtout pas que ça fera la même chose que Sheets(Feuil9).Range("G" & n).Interior.Color = RGB(255, 0, 0) !

                                        Au passage le for n=n to 55 avec n initialisé à 6 était parfaitement correct. pas orthodoxe, mais correct
                                        1. Waouw, merci beaucoup, j'ai encore un soucis. :s

                                          mon problème ce trouve là :

                                          d = Sheets(Feuil9).Range("G" & n).Interior.Color

                                          Il me met "Erreur d'exécution de type 13" Incompabilité de type quand je souhaite l'exécuté.

                                          Que fais-je de faux ?

                                          Merci énormement pour vos réponses et désolé du dérangement.
                                          • 1
                                          • 2