VB excel, changer de ligne

Résolu/Fermé
D-Rabbit - 20 janv. 2010 à 16:29
Bidouilleu_R Messages postés 1181 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 12 juillet 2012 - 21 janv. 2010 à 10:39
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.
A voir également:

24 réponses

Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
20 janv. 2010 à 18:17
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
Bidouilleu_R Messages postés 1181 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 12 juillet 2012 289
20 janv. 2010 à 20:30
salut.... à tous
pour terminer l'exemple...
bien sur après il y a next i

Heu! c'était pour dire bonjour. : )
0
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
garion28 Messages postés 1543 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 3 avril 2011 404
21 janv. 2010 à 07:55
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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
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
D'accord, mais j'ai l'impression que l'erreur vient de ça :

d = feuil9.range("G" & n).Interior.Color
0
garion28 Messages postés 1543 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 3 avril 2011 404
21 janv. 2010 à 09:26
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
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
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
tompols Messages postés 1273 Date d'inscription jeudi 29 juillet 2004 Statut Contributeur Dernière intervention 25 novembre 2013 435
21 janv. 2010 à 09:44
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
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
garion28 Messages postés 1543 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 3 avril 2011 404
21 janv. 2010 à 09:53
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
tompols Messages postés 1273 Date d'inscription jeudi 29 juillet 2004 Statut Contributeur Dernière intervention 25 novembre 2013 435
21 janv. 2010 à 09:57
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
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
garion28 Messages postés 1543 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 3 avril 2011 404
21 janv. 2010 à 10:14
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
tompols Messages postés 1273 Date d'inscription jeudi 29 juillet 2004 Statut Contributeur Dernière intervention 25 novembre 2013 435
21 janv. 2010 à 10:14
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
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
garion28 Messages postés 1543 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 3 avril 2011 404
21 janv. 2010 à 10:22
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