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

Le
Alex
Bonjour à tous,

J'ai trouvé la macro ci-dessous jointe, dont je comprends le résultat,
à savoir, de donner sur une feuille "resultat" et afficher, pour des
même N° de Compte referencés, celui ci qu'ne seule fois et de
concaténer les libelles dans la seconde colonnes, comme suit :

Une feuille "Données" :
- Deux colonnes
- Colonne N°1 : des N° Cpte, (parfois identique, en doublons,
triplons voir plus),
- Colonne N°2 : un libellé. Apres lancement de la macro

Sur une seconde feuille "résultat" :

Cela donne qu'une seul fois les N° Cpte de la colonne 1 et en colonne
2 la concaténation des différents libellé.

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

Je vous remercie par avance de votre aide.

La Macro et exemple des deux feuilles "Données" et "Résultat" :

Sub ConcatContraintes()

Dim CompteEnCours As String
Dim ComptePrécédent As String
Dim NbLignesATraiter As Long

Dim NoLigne As Long

Dim ContraintesConcaténées As String

ComptePrécédent = Cells(2, 1)
CompteEnCours = ComptePrécédent

NoLigne = 1

Worksheets("Concatenation").Cells(NoLigne, 1) = CompteEnCours
ContraintesConcaténées = Cells(2, 2)

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

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

If ComptePrécédent = CompteEnCours Then
ContraintesConcaténées = ContraintesConcaténées & " -=
" _
& Cells(i, 2)
ComptePrécédent = CompteEnCours
Else
Worksheets("Concatenation").Cells(NoLigne, 2) =
ContraintesConcaténées
NoLigne = NoLigne + 1
Worksheets("Concatenation").Cells(NoLigne, 1) =
CompteEnCours
ContraintesConcaténées = Cells(i, 2)
ComptePrécédent = CompteEnCours
End If
Next

End Sub

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 |

Voila, c'est la fin Merci encore de votre aide.
Alex
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
josephb
Le #20099461
Bonsoir Alex,

Alex
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.
Alex
Le #20105011
On 9 sep, 02:54, (Joseph B.) wrote:
Bonsoir Alex,





Alex > 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
Publicité
Poster une réponse
Anonyme