VB excel, changer de ligne

Résolu
D-Rabbit -  
Bidouilleu_R Messages postés 1209 Statut Membre -
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
  • 2
  1. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
  2. Bidouilleu_R Messages postés 1209 Statut Membre 296
     
    salut.... à tous
    pour terminer l'exemple...
    bien sur après il y a next i

    Heu! c'était pour dire bonjour. : )
    0
  3. D-Rabbit
     
    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
  4. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. D-Rabbit
     
    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
  7. le père
     
    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
  8. le père
     
    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
  9. D-Rabbit
     
    D'accord, mais j'ai l'impression que l'erreur vient de ça :

    d = feuil9.range("G" & n).Interior.Color
    0
  10. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    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
  11. D-Rabbit
     
    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
  12. le père
     
    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
  13. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    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
  14. D-Rabbit
     
    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
  15. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    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
  16. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    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
  17. D-Rabbit
     
    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
  18. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    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
  19. tompols Messages postés 1273 Date d'inscription   Statut Contributeur Dernière intervention   460
     
    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
  20. D-Rabbit
     
    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
  21. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    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