probleme VBA boucle IF

emma13

Habitué
salut !!
alors j'ai fait un petit programme, mais il ne me fait pas ce que je veux !!

[cpp]Sub calcule()
Dim i, j As Integer


For i = 7 To 24
For j = 6 To 23

if Cells(i, j).Offset(-1, 0).Interior.ColorIndex = 2 And Cells(i,
j).Offset(-1, 1).Interior.ColorIndex = 2 And Cells(i, j).Offset(0,
1).Interior.ColorIndex = 2 And Cells(i, j).Offset(1, 1).interior.ColorIndex = 2
And Cells(i, j).Offset(1, 0).Interior.ColorIndex = 2 And Cells(i,
j).Offset(1, -1).Interior.ColorIndex = 2 And Cells(i, j).Offset(0,
-1).Interior.ColorIndex = 2 And Cells(i, j).Offset(-1, -1).Interior.ColorIndex =
2

Cells(i, j).Value = 9

else cells(i,j)=13

endif

Next j
Next i

End Sub
[/cpp]
il ne m'affiche jamais la valeur 9. quoi que je fasse c'est toujours 13.
j'ai beau regardé ce qu'il n'allait pas, mais la je vois pas, ça doit etre un truc tout bete mais qui m'echappe.
Merci de votre aide.
 

galopin01

Habitué
Bonjour,
Bah... Tu dois être un peu perdu dans ton labyrinthe d'offset !
La macro fonctionne bien... sauf que 2 c'est blanc et incolore ce n'est pas blanc : c'est xlNone.

Si tu écris ligne 3 :
Cells.Interior.ColorIndex = 2

Toutes tes cellules seront blanches et tu n'auras que des 9
Si tu veux tester des cellules incolores il faut écrire :
...ColorIndex = xlNone

Conseil :
Cells(i, j).Offset(-1, 0).Interior.ColorIndex = ... c'est la même chose que
Cells(i-1, j).Interior.ColorIndex =...
utilise le caractère _ quand tu as des lignes interminables c'est plus lisible...

[cpp]Sub calcule()
Dim i, j As Integer
Cells.Interior.ColorIndex = 2
For i = 7 To 24
For j = 6 To 23
If Cells(i - 1, j).Interior.ColorIndex = 2 And _
Cells(i - 1, j + 1).Interior.ColorIndex = 2 And _
Cells(i, j + 1).Interior.ColorIndex = 2 And _
Cells(i + 1, j + 1).Interior.ColorIndex = 2 And _
Cells(i + 1, j).Interior.ColorIndex = 2 And _
Cells(i + 1, j - 1).Interior.ColorIndex = 2 And _
Cells(i, j - 1).Interior.ColorIndex = 2 And _
Cells(i - 1, j - 1).Interior.ColorIndex = 2 Then
Cells(i, j).Value = 9
Else
Cells(i, j) = 13
End If
Next j
Next i
End Sub[/cpp]
c'est déjà mieux...

Ceci dit on se demande bien ce que tu as voulu faire !
A+
 

zeb

Modérateur
Autre conseil :
En phase de développement/debugage, écris tes lignes autrement tu condenseras après. Ensuite avec le debugger, tu vois exactement quelle condition n'est pas remplie :

Code:
Cells(i, j) = 13
if Cells(i, j).Offset(-1, 0).Interior.ColorIndex = 2 then
    debug.print "ok1"
    if Cells(i,j).Offset(-1, 1).Interior.ColorIndex = 2 then
    	debug.print "ok2"
    	if Cells(i, j).Offset(0,1).Interior.ColorIndex = 2 then
    		debug.print "ok3"
    		if Cells(i, j).Offset(1, 1).interior.ColorIndex = 2 then
    		    debug.print "ok4"
    		    if Cells(i, j).Offset(1, 0).Interior.ColorIndex = 2 then
    		        debug.print "ok5"
    		        if Cells(i, j).Offset(1, -1).Interior.ColorIndex = 2 then
    		            debug.print "ok6"
    		            if Cells(i, j).Offset(0, -1).Interior.ColorIndex = 2 then
    		                debug.print "ok7"
    		                if Cells(i, j).Offset(-1, -1).Interior.ColorIndex = 2 then
    		                    debug.print "ok8"
    		                    Cells(i, j).Value = 9
                            End If
                        End If
                    End If
                End If
            End If
        End If
    End If
End If

Et indente ton code.
 

hoegarden31

Expert
lol mdr ^^ zeb je t'ai jamais vu faire un truc comme ça mdr ^^

c mieux d'utiliser le select case ^^ beaucoup plus clair
 

zeb

Modérateur
Salut BiereBlanche :hello:

Non, regarde mieux. Chaque condifition porte sur une cellule différente.
La syntaxe de galopin est la meilleure, mais en mode débug, ce que je propose est plus pratique. Bien sûr, dès que le problème est résolu, remettre le code à la manière de galopin, bien sûr.
 

hoegarden31

Expert
oui en effet ^^ mdr dsl j'avais pas vu ^^ par contre il veux faire quoi avec ça ?? et pourquoi tester comme ça ?? pourquoi pas 1 seul test pour les colonnes ?
 

hoegarden31

Expert
oui aussi bonne remarque ^^ mais je crois qu'on est pas obliger de le mettre je suis pas sur
 

zeb

Modérateur
Non, non. Il y a avait un End If de trop. Corrigé.
Mais en général, il ne faut pas recopier bêtement le code donné.
Il faut le comprendre et éventuellement l'adapter, bien sûr.

Personnellement, je ne l'ai pas testé. (Je n'ai pas le reste du code, etc).
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 054
Membres
1 586 393
Dernier membre
mathhh28
Partager cette page
Haut