Compter les cellules boucle
Bonjour,
Je cherche de l'aide pour faire une formule (ou une macro) afin de compter le nombre de cellules comportant un "1" dans la première colonne jusqu'à rencontrer un "2", puis ça recommence (jamais deux "2" de suite). Les résultats doivent s'afficher en face de chaque "2".
Colonne A Colonne B
2 X (compte le seul "1" qui suit)
1
0
2 Y (compte le seul "1" qui suit)
1
2 Z (compte les deux "1" qui suivent)
1
0
1
J'espère que vous pourrez m'aider !
Cordialement.
Bonjour Loraine, bonjour le forum,
Peut-être comme ça :
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim PL As Range 'déclare la variable PL (PLage)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim LB As Integer 'déclare la variable LB (Ligne de Base)
Dim T As Integer 'déclare la variable T (Total)
Set O = Worksheets("Feuil1") 'définit l'onglet O (à adapter à ton cas)
O.Columns(2).ClearContents 'supprime d'éventuelles données dans la colonne B
Set PL = O.Range("A1").CurrentRegion 'définit la plage PL
Set PL = PL.Resize(PL.Rows.Count, 2) 'redédinit la plage PL (la colonne B en plus)
TV = PL 'définit le tableau des valeurs TV
For I = 1 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV
Select Case TV(I, 1) 'agit en fonction de la valeur de la donnée ligne I colonne 1 de TV
Case Is = 2 'cas 2
LB = I: T = 0 'définit la ligne de base CB et réinitialise le total T
Case Is = 1 'cas 1
T = T + 1: TV(LB, 2) = T 'incrémente le total T et renvoie ce total dans le donnée en ligne CB colonne 2
Case Is = 0 'cas 0
T = T + 0: TV(LB, 2) = T 'incrémente le total T et renvoie ce total dans le donnée en ligne CB colonne 2
End Select 'fin de l'action en fonction de la valeur de la donnée ligne I colonne 1 de TV
Next I 'prochaine ligne de la boucle
O.Range("A1").Resize(UBound(TV, 1), 2).Value = TV 'renvoie le tableau TV dans la cellule A1 redimentionnée
End Subbonjour
salut ThauThème au passage
par formules avec des SI assez basiques, à la portée d'un débutant
voir la colonne4
on peut masquer les colonnes intermédiaires (ou les rejeter plus loin vers la droite)
amitiés à tous
Ca marche !
Deux jours que je suis dessus...
Je préfère utiliser la macro car normalement j'ai plusieurs milliers de lignes à traiter comme ça
Merci beaucoup !
Bonne journée à vous
Bon au final ça ne marche pas tout à fait...
Le problème de la macro c'est qu'elle me colle les résultats sur mon tableau de base du coup je perds les formules qui m'ont servis à le construire. Je n'ai pas réussi à faire apparaître les données plus loin dans les colonnes ils me disent "erreur de sélection".
Du coup j'ai essayé la deuxième technique avec les lignes de formules mais le problème c'est qu'elle ne prend pas en compte les 0 dans ma première colonne. Du coup, les résultats sont bons mais pas forcément sur la bonne ligne.
Je vous ai joins mon tableau excel (le "DATE" correspond au "2" précédent). J'ai tout mis dans la feuille 2.
Bonjour le fil, bonjour le forum,
C'est quand même bien plus facile avec une fichier !...
Le code modifié. Le tableau est renvoyé à partir de J5. Tu adapteras (2 lignes à modifier)...
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Long 'déclare la variable I (Incrément)
Dim LB As Long 'déclare la variable LB (Ligne de Base)
Dim T As Integer 'déclare la variable T (Total)
Dim K As Long 'déclare la variable K (incrément)
Dim TR() As Variant 'déclare la variable TR (Tableau des Résultats)
Set O = Worksheets("Feuil2") 'définit l'onglet O (à adapter à ton cas)
O.Range("J5").CurrentRegion.ClearContents 'supprime d'éventuelles données à partir de J5
TV = O.Range("A4").CurrentRegion 'définit le tableau des valeurs TV
K = 1 'initialise la variable K
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV
ReDim Preserve TR(1 To 3, 1 To K) 'redimensionne le tableau des résultats (3 lignes, K colonnes)
TR(1, K) = TV(I, 1) 'récupère dans la ligne 1 de TR la donnée en colonne 1 de TV (=> Transposition)
TR(2, K) = TV(I, 2) 'récupère dans la ligne 2 de TR la donnée en colonne 2 de TV (=> Transposition)
Select Case TV(I, 2) 'agit en fonction de la valeur de la donnée ligne I colonne 2 de TV
Case "DATE" 'cas "Date"
LB = K: T = 0 'définit la ligne de base LB et réinitialise le total T
Case Is = 1 'cas 1
T = T + 1: TR(3, LB) = T 'incrémente le total T et renvoie ce total dans la donnée en ligne 3 colonne LB de TR
Case Is = 0 'cas 0
T = T + 0: TR(3, LB) = T 'incrémente le total T et renvoie ce total dans la donnée en ligne 3 colonne LB de TR
End Select 'fin de l'action en fonction de la valeur de la donnée ligne I colonne 1 de TV
K = K + 1 'incrémente K (rajoute une colonne au tableau des résultats TR)
Next I 'prochaine ligne de la boucle
O.Range("J5").Resize(UBound(TR, 2), 3).Value = Application.Transpose(TR) 'renvoie dans J5 redimensionnée(à adapter) le tableau TR transposé
End Sub