6
Ce message vous semble utile, votez !- Signaler ce message aux modérateurs
|
Par hnok, le lundi 2 avril 2007 à 16:56:20 |
 |  |  | Bonjour,
voila, j'ai un tableau de données dont je voudrais parcourir la 2è colonne pour en déduire de nouvelles données. que j'afficherai dans une autre colonne.
pour le moment à priori, lorsque je parcours le programme pas à pas, mon code permet de parcourir par ligne, donc je n'ai pas le résultat escompté.
voici mon code :
If (Cells(i, 2).Value = Cells(i - 1, 2).Value) Then nbadjacence = nbadjacence + 1
j'ai essayé de rajouter column devant cells, mais ca marche pas.
sinon, comment on fait pour mettre plusieurs conditions dans un if ??
lorsque j'en mets plusieurs, j'ai des messages incohérents du genre :
"endif without if", "next without for"
merci d'avance Répondre à hnok
7
Ce message vous semble utile, votez !- Signaler ce message aux modérateurs
|
Par xjl, le lundi 2 avril 2007 à 17:07:14 |
 |  |  | Salut,
la ligne que tu nous donne concerne ton if, or si tu parcours par ligne et non par colonne comme tu le voudrais, ça vient sûrement plus de ta boucle for que tu as placé avant, donc pour t'aider il nous faudrait un peu plus de code que ça...
Ensuite, pour mettre plusieurs conditions dans un if, tu peux les séparer par un or ou un and suivant ce que tu veux faire, ou alors utiliser des if imbriqués...
A toi de voir ! Répondre à xjl
8
Ce message vous semble utile, votez !- Signaler ce message aux modérateurs
|
Par hnok, le mardi 3 avril 2007 à 00:08:06 |
 |  |  | voila le code que j'ai pour l'instant :
sub adjacence()
nbadjacence = 0
For i = 2 To 10 Columns.End(xldown)
If (Cells(i, 2).Value = Cells(i - 1, 2).Value) Then nbadjacence = nbadjacence + 1
If (Cells(i, 2).Value <> Cells(i - 1, 2).Value) Then Cells(i - 1, 4).Value = nbadjacence and nbadjacence = 0
Next i
End Sub
Si 2 cellules adjacentes ont un contenu different, je souhaite afficher le nombre de cellules au contenu identique qui viennent d'être parcourues dans chacune des lignes correspondantes de la colonne 4; éventuellement regrouper ces cellules au contenu identique dans une meme ligne sur un nouveau worksheet.
Connais tu comment parcourir la colonne ?
C peut etre 2 for imbriqués, mais je vois pas comment faire ca :-~ Répondre à hnok
9
Ce message vous semble utile, votez !- Signaler ce message aux modérateurs
|
Par hnok, le mardi 3 avril 2007 à 00:10:08 |
 |  |  | oupss, le 10 dans le For n'a pas lieu d'être, désolé, erreur de frappe Répondre à hnok
10
Ce message vous semble utile, votez !- Signaler ce message aux modérateurs
|
Par xjl, le mardi 3 avril 2007 à 08:26:36 |
 |  |  | Salut,
ben en fait, non seulement il faut que tu enlèves le 10, mais il est également préférable que tu mettes un
Range("B1").End(xlDown).Count à la place de ton Columns.End(xlDown)... Au moins là t'es sûr que ça va te renvoyer le nombre de lignes entre ta case B1 et la fin de ta colonne.
Après si tu as mis "For 2 To..." je suppose que c'est parce que tu as une ligne d'en-tête dans tes colonnes, et dans ce cas tu peux remplacer B1 par B2...Sinon tu mets 1 à la place de 2 dans ton for... Répondre à xjl | |
11
Ce message vous semble utile, votez !- Signaler ce message aux modérateurs
|
Par xjl, le mardi 3 avril 2007 à 08:31:03 |
 |  |  | J'ai cru que mon message précédent avait buggé...
Bon si la solution fonctionne, pense à cloturer le sujet ! ;-) Répondre à xjl |
12
Ce message vous semble utile, votez !- Signaler ce message aux modérateurs
|
Par hnok, le mardi 3 avril 2007 à 11:04:07 |
 |  |  | Salut xjl !
merci pour ton aide;-) J'en ai tenu compte, mais ça donnait pas tout à fait le résultat que je voulais. après réflexion, j'ai pu avancer un peu. voici le code que j'ai :
nbadjacence = 0
i = 1
j = 2
For i = Cells(j, 2) To Range("B2").End(xlDown)
Cells(j, 2).Select
If (Columns.Cells(j, 2) = Columns.Cells(j - 1, 2)) Then nbadjacence = nbadjacence + 1
'si 2 cellules adjacentes ont un contenu different
If (Cells(j, 2).Value <> Cells(j - 1, 2).Value) Then Cells(j - 1, 4).Value = nbadjacence
j = j + 1
Next i
End Sub
actuellement, j'arrive à parcourir la colonne :-) (le Cells(j,2).select permet de visualiser ca), mais j'ai toujours un problème concernant le compteur nbadjacence.
en effet, lorsque l'on rentre dans le then de la 2è condition, nbadjacence passe à 0 en meme temps que d'afficher sa valeur dans la cellule correspondante de la colonne 4. cad que j'ai que des 0 dans la colonne 4 :-(
Est ce que tu sais comment implémenter cette instruction?
Je voudrais pouvoir afficher la valeur de nbadjacence dans la cellule de la colonne 4, PUIS, initialiser nbadjacence à 0.
Et le 2è problème que j'ai, c'est que je n'ai pas la bonne valeur de nbadjacence. c'est à dire que si dans la colonne B, j'ai 3 cellules de valeur 9, suivies de 3 cellules de valeur 10, j'aurai nbadjacence à 2, puis 2, dans la colonne 4 (ou plutot 2, puis 4, vu que j'initialise pas nbadjacence). Aurais tu une piste pour résoudre ce pbm ??
Merci d'avance !! Répondre à hnok
13
Ce message vous semble utile, votez !- Signaler ce message aux modérateurs
|
Par xjl, le mardi 3 avril 2007 à 11:28:13 |
 |  |  | Alors, déjà je trouve que ta manière de boucler sur la colonne est un peu spéciale, mais bon, admettons...
Ensuite, ton deuxième if ne sert à rien, il te suffit de mettre un else après le premier if et d'y mettre ton Cells(j - 1, 4).Value = nbadjacence
Ce qui me choque également, c'est que t'as pas de End if pour clôturer ton if, pour moi ça peut pas marcher, alors je sais pas si tu l'as pas copier sur le site ou si t'en as vraiment pas mais à vérifier...
Enfin, si c'est vraiment le nombre total de cases égales qui se suivent que tu veux, alors ton nbadjacence, tu peux essayer de l'initialiser à 1 après ton Cells(j - 1, 4).Value = nbadjacence and nbadjacence=1 et il faut d'ailleurs que tu l'initialises à 1 au départ et non à 0
je sais pas si ça va marcher mais ça vaut le coup d'essayer... Répondre à xjl |
14
Ce message vous semble utile, votez !- Signaler ce message aux modérateurs
|
Par hnok, le mardi 3 avril 2007 à 16:10:04 |
 |  |  | merci ! ^^
alors concernant les conditions, tu as raison et effectivement j'ai rectifié. les if que j'avais écris l'étaient de manière provisoire vu que j'avais des messages d'erreurs bizarres du genre "endif without if".
donc j'avais écris ca comme ca pour pouvoir avancer sur le programme et pas perdre trop de temps. en fait j'ai compris que ces messages d'erreur venaient du fait que je respectais pas bien l'indentation. elle a de l'importance ici à priori (MSExcel pro 2003)
donc ca c'est corrigé.
pour calculer le nbadjacence, le problème est corrigé également :-)
je récupère la valeur désirée.
il me reste 2 p'tits pbm :
la 2è borne du for qui devrait permettre d'atteindre la fin de la colonne, ne fait qu'atteindre qu'une ligne aléatoire (pas toujours la meme) en cours de colonne. ... c'est un mystère....
et l'autre truc qui me manque désormais, est que dans la colonne 4 ou j'affiche le "nbadjacence", je voudrais que la valeur de ce nbadjacence apparaisse à chaque ligne.
c'est à dire que actuellement, dans la colonne 2, si j'ai 3 cellules à 9 suivies de 3 cellules à 10, j'aurai 3 qui apparaitra à l'intersection de la colonne 4 et de la dernière ligne contenant la valeur 9. Or, je voudrais que cette valeur de nbadjacence (3 dans l'exemple, car 3 cellules à 9) apparaisse dans chaque ligne qui contient le 9 de la colonne 2. en effet, chaque ligne contient dans une autre colonne un identifiant unique auquel on peut avoir à se référer par la suite.
NB : j'ai vraiment l'impression de progresser en VBA :-)) j'ai commencé de 0 il y a 10 jours :-~ merci pour ton aide!
sinon, voici le code que j'ai à présent :
'initialisation des variables de parcours de la colonne
nbadjacence = 0
i = 1
j = 2
For i = Cells(j, 2) To Range("B2").End(xlDown)
Cells(j, 2).Select
If (Columns.Cells(j, 2).Value = Columns.Cells(j - 1, 2).Value) Then
nbadjacence = nbadjacence + 1
'si 2 cellules adjacentes ont un contenu different
'il faut d'abord incrémenter nbadjacence de 1 pour prendre en compte le passage a la nouvelle valeur
'puis reinitialiser le compteur
Else
nbadjacence = nbadjacence + 1
'pour ne pas ecraser le nom du parametre
If j > 2 Then
Cells(j - 1, 4).Value = nbadjacence
End If
nbadjacence = 0
End If
j = j + 1
Next i Répondre à hnok
15
Ce message vous semble utile, votez !- Signaler ce message aux modérateurs
|
Par hnok, le mardi 3 avril 2007 à 16:11:42 |
 |  |  | désolé, l'indentation n'apparait sur le message sur le forum, mais ce "bout de code" marche impec pour le moment Répondre à hnok
16
Ce message vous semble utile, votez !- Signaler ce message aux modérateurs
|
Par xjl, le mercredi 4 avril 2007 à 08:43:42 |
 |  |  | Alors deux choses:
faut vraiment que tu change ta façon de boucler...
Essaye: For j = 2 to Range("B2", Range("B2").End(xlDown)).Count
en enlevant le j = j + 1
Normalement ça devrait bien se passer...
Ensuite, pour écrire nbadjacence dans toutes les cellules concernées, je te conseille de mettre une petite boucle for après avoir trouvé la dernière cellule de même valeur:
For i = j-nbadjacence to j
Cells(i,4).Value=nbadjacence
Next i
Essaye ça et tu verras ce que ça donne...
PS: l'indentation n'est pas importante mais aide à la compréhension de ton code, ce qui importe c'est bien de fermer toutes tes boucles ou conditions dans l'ordre où elles ont été ouvertes... Répondre à xjl
17
Ce message vous semble utile, votez !- Signaler ce message aux modérateurs
|
Par hnok, le vendredi 6 avril 2007 à 13:16:58 |
 |  |  | salut xjl !
merci pour les réponses :-)
j'ai changé la façon de boucler. j'ai viré le j=j+1
et ca marche bien :D
j'ai mis une petite boucle for comme tu as conseillé, ca marche impec maintenant.... enfin presque :
je n'atteint pas la dernière ligne, le comptage s'arrete a l'avant dernière ligne. j'ai fais un débogage pas à pas, mais je comprend pas la raison :-~ Répondre à hnok | | | | | | | |