Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Explication d'une Macro - Boucle - Compteur - Concaténer

2 réponses
Avatar
Alex
Bonjour =E0 tous,

J'ai trouv=E9 la macro ci-dessous jointe, dont je comprends le r=E9sultat,
=E0 savoir, de donner sur une feuille "resultat" et afficher, pour des
m=EAme N=B0 de Compte referenc=E9s, celui ci qu'ne seule fois et de
concat=E9ner les libelles dans la seconde colonnes, comme suit :

Une feuille "Donn=E9es" :
- Deux colonnes
- Colonne N=B01 : des N=B0 Cpte, (parfois identique, en doublons,
triplons voir plus),
- Colonne N=B02 : un libell=E9. Apres lancement de la macro

Sur une seconde feuille "r=E9sultat" :

Cela donne qu'une seul fois les N=B0 Cpte de la colonne 1 et en colonne
2 la concat=E9nation des diff=E9rents libell=E9.

Malheureusement, je n'en comprends le fonctionnement de la macro. Est
ce que quelqu'un pour m'aider =E0 la comprendre dans le fonctionnement,
m'expliquer par un commentaire pour les lignes de commande "cl=E9" de la
macro.

Je vous remercie par avance de votre aide.

La Macro et exemple des deux feuilles "Donn=E9es" et "R=E9sultat" :

Sub ConcatContraintes()

Dim CompteEnCours As String
Dim ComptePr=E9c=E9dent As String
Dim NbLignesATraiter As Long

Dim NoLigne As Long

Dim ContraintesConcat=E9n=E9es As String

ComptePr=E9c=E9dent =3D Cells(2, 1)
CompteEnCours =3D ComptePr=E9c=E9dent

NoLigne =3D 1

Worksheets("Concatenation").Cells(NoLigne, 1) =3D CompteEnCours
ContraintesConcat=E9n=E9es =3D Cells(2, 2)

NbLignesATraiter =3D Range("A1").CurrentRegion.Rows.Count + 1

For i =3D 3 To NbLignesATraiter
'If i =3D NbLignesATraiter Then Stop
CompteEnCours =3D Cells(i, 1)

If ComptePr=E9c=E9dent =3D CompteEnCours Then
ContraintesConcat=E9n=E9es =3D ContraintesConcat=E9n=E9es & " -=
" _
& Cells(i, 2)
ComptePr=E9c=E9dent =3D CompteEnCours
Else
Worksheets("Concatenation").Cells(NoLigne, 2) =3D
ContraintesConcat=E9n=E9es
NoLigne =3D NoLigne + 1
Worksheets("Concatenation").Cells(NoLigne, 1) =3D
CompteEnCours
ContraintesConcat=E9n=E9es =3D Cells(i, 2)
ComptePr=E9c=E9dent =3D CompteEnCours
End If
Next

End Sub

Exemple des Tableaux lies =E0 la macro :
Feuille "Donn=E9es" :

N=B0 Compte | Lib=E9ll=E9 |
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D
123 | Test Auto |
123 | Revision auto |
124 | Marche foret |
123 | Essence |
128 |M=E9nage |
124 |Gym |



Feuille "R=E9sultat" :

N=B0 Compte | Lib=E9ll=E9 |
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
123 | Test Auto - R=E9vision auto - Essence |
124 | Marche foret - Gym |
128 | M=E9nage |

Voila, c'est la fin... Merci encore de votre aide.
Alex

2 réponses

Avatar
josephb
Bonsoir Alex,

Alex wrote:

Exemple des Tableaux lies à la macro :
Feuille "Données" :

N° Compte | Libéllé |
=================== > 123 | Test Auto |
123 | Revision auto |
124 | Marche foret |
123 | Essence |
128 |Ménage |
124 |Gym |



Feuille "Résultat" :

N° Compte | Libéllé |
=================== ================== > 123 | Test Auto - Révision auto - Essence |
124 | Marche foret - Gym |
128 | Ménage |




La macro que tu as publié est probablement amputée d'une partie de son
code parce que en l'état :
1) elle ne reprend pas les lignes d'en-tête de la feuille d'origine dans
la feuille de résultat

2) elle ne pourra donner le "Résultat" que tu affiches, que si tableau
d'origine est d'abord trié pour regrouper les lignes par N° de compte,
pour ça il faut inclure, juste après les déclarations de variables
cette commande de tri :

ActiveSheet.Range("A1").CurrentRegion.Sort _
Key1:¬tiveSheet.Columns("A"), Header:=xlGuess

puis, l'algorithme est le suivant

En préalable,
* Le premier N° de compte (123) (ligne 2/colonne 1) va être attribué aux
2 variables CompteEnCours et ComptePrécédent
* Le premier N° de compte (123) va aller remplir la première cellule de
la ligne définie "NoLigne" (ligne 1) de la feuille "Concaténation"
(feuille de résultat)
* La variable "ContraintesConcaténées" va être chargée du libellé
attaché à la ligne du premier N° de compte, (ligne 2/colonne 2 = Test
Auto)

A partir de là, la boucle "scanne" les lignes suivantes (3 et suite) une
par une (dans la limite du nombre de "lignes à traiter") ;

* si la ligne examinée (CompteEnCours) a le même N° de compte (123) que
la ligne précédente (ComptePrécédent),
* alors son libellé est concaténé au libellé précédemment chargé
dans la variable "ContraintesConcaténées"
(NB : la ligne qui suit, <ComptePrécédent = CompteEnCours> est ici
redondante et inutile puisque c'est précisément le résultat du test.)
* et on passe à la l'examen de la ligne suivante...
* Si ce n'est pas le cas, (Else...)
ça veut dire que CompteEnCours est passé à la valeur suivante (124)
*alors (sous-entendu)
*le contenu de la variable "ContraintesConcaténées" est "collé" dans
la feuille de résultat, sur la même ligne (NoLigne) dans la cellule à
côté du N° de compte préalablement positionné.
* La variable NoLigne est incrémentée de 1 pour le prochain N° de
compte et ses libellés concaténés
* Le NoCompte en cours (124) est collé en première cellule de la
ligne suivante dans la feuille de résultat
* La variable "ContraintesConcaténées" va être chargée du libellé de
la ligne du premier N° de compte de la série en cours (124)
*On attribue à ComptePrécédent la nouvelle valeur de CompteEnCours
pour que la condition soit évaluable
* et on passe à l'examen de la ligne suivante...

En espérant que ça aide

Cordialement,




--
J. B.
Avatar
Alex
On 9 sep, 02:54, (Joseph B.) wrote:
Bonsoir Alex,





Alex wrote:
> Exemple des Tableaux lies à la macro :
> Feuille "Données" :

> N° Compte  |  Libéllé          |
> =================== =
> 123             | Test Auto      |
> 123             | Revision auto |
> 124             | Marche foret  |
> 123             | Essence       |
> 128             |Ménage         |
> 124             |Gym             |

> Feuille "Résultat" :

> N° Compte  |                           Li béllé                     |
> =================== ==== ===============
> 123             | Test Auto  - Révision auto - Essence   |
> 124             | Marche foret - Gym                            |
> 128             | Ménage                                            |

La macro que tu as publié est probablement amputée d'une partie de so n
code parce que en l'état :
1) elle ne reprend pas les lignes d'en-tête de la feuille d'origine dan s
la feuille de résultat        

2) elle ne pourra donner le "Résultat" que tu affiches, que si tableau
d'origine est d'abord trié pour regrouper les lignes par N° de compte ,
pour ça il faut inclure, juste après les déclarations de variables
cette commande de tri :

    ActiveSheet.Range("A1").CurrentRegion.Sort _
    Key1:tiveSheet.Columns("A"), Header:=xlGuess

puis, l'algorithme est le suivant

En préalable,
* Le premier N° de compte (123) (ligne 2/colonne 1) va être attribu é aux
2 variables  CompteEnCours et ComptePrécédent  
* Le premier N° de compte (123) va aller remplir la première cellule de
la ligne définie "NoLigne" (ligne 1) de la feuille "Concaténation"
(feuille de résultat)
* La variable "ContraintesConcaténées" va être chargée du libell é
attaché à la ligne du premier N° de compte, (ligne 2/colonne 2 = Test
Auto)

A partir de là, la boucle "scanne" les lignes suivantes (3 et suite) un e
par une (dans la limite du nombre de "lignes à traiter") ;

* si la ligne examinée (CompteEnCours) a le même N° de compte (123) que
la ligne précédente (ComptePrécédent),
    * alors son libellé est concaténé au libellé précédem ment chargé
dans la variable "ContraintesConcaténées"
 (NB : la ligne qui suit, <ComptePrécédent = CompteEnCours> est i ci
redondante et inutile puisque c'est précisément le résultat du test .)
    * et on passe à la l'examen de la ligne suivante...
* Si ce n'est pas le cas, (Else...)
ça veut dire que CompteEnCours est passé à la valeur suivante (124)
    *alors (sous-entendu)
    *le contenu de la variable "ContraintesConcaténées" est "coll é" dans
la feuille de résultat, sur la même ligne (NoLigne) dans la cellule à
côté du N° de compte préalablement positionné.
    * La variable NoLigne est incrémentée de 1 pour le prochain N ° de
compte et ses libellés concaténés
    * Le NoCompte en cours (124) est collé en première cellule de la
ligne suivante dans la feuille de résultat
    * La variable "ContraintesConcaténées" va être chargée du libellé de
la ligne du premier N° de compte de la série en cours (124)
    *On attribue à ComptePrécédent la nouvelle valeur de Compte EnCours
pour que la condition soit évaluable
* et on passe à l'examen de la ligne suivante...

En espérant que ça aide

Cordialement,

--
J. B.- Masquer le texte des messages précédents -

- Afficher le texte des messages précédents -



Bonjour Josph,

Merci pour ta réponse et pour les précisions de départ comme le tri d e
la base de données, ainsi que de la non prise en compte de la ligne
titre.
Tes explications sont claires, et cela m'a permis de bien comprendre.
Maintenant, il vrai que je n'arriverrais pas à faire cela de par moi
même, sans doute dû, à un manque de connaissance en mathématique ou en
macro. Je n'arriverais sans doute pas non plus, à ajouter la gestion
d'autres colonnes.
En tout cas, encore un grand merci pour ta réponse et le temps que tu
as du y passé.
Cordialment.
Alex