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. Bonjour,

    For i = 1 to 56
       If Sheets(1).Range("G" & i).Value = "toto" Then
          MsgBox "Gagné !!!"
       Else
          MsgBox " Perdu !!! Try again ..."
       End If
    


    ;o)
    0
    1. salut.... à tous
      pour terminer l'exemple...
      bien sur après il y a next i

      Heu! c'était pour dire bonjour. : )
      0
      1. Merci, mais je vais vous donner un bout de code pour que ce soit plus clair.

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

        For n = n To 55 Step 1
        If statut <> "Terminée" And d < jour Then
        d = RGB(255, 0, 0)
        ElseIf d > jour - 7 Then
        d = RGB(255, 255, 0)
        End If
        Next

        Voila, je voulais savoir ce qui cloche la dedans pour que ça ne fonctionne pas.
        0
        1. n = 6

          For n = n To 55 Step 1
          tu donne une valeur a n avant la boucle et tu n'en donne pas pour l'initialisation du for

          enleve le n=6 et met for n=6 to 55

          le step 1 est facultatif
          0
          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.
            0
            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
              0
              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
                0
                1. D'accord, mais j'ai l'impression que l'erreur vient de ça :

                  d = feuil9.range("G" & n).Interior.Color
                  0
                  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)
                    0
                    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.
                      0
                      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 ?
                        0
                        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....
                          0
                          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.
                            0
                            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
                              0
                              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) ?
                                0
                                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.
                                  0
                                  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
                                    0
                                    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 ?
                                      0
                                      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.
                                        0
                                        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
                                          0
                                          • 1
                                          • 2