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

Le
Alex
Bonjour tous,

J'ai trouv la macro ci-dessous jointe, dont je comprends le rsultat,
savoir, de donner sur une feuille "resultat" et afficher, pour des
mme N de Compte referencs, celui ci qu'ne seule fois et de
concatner les libelles dans la seconde colonnes, comme suit :

Une feuille "Donnes" :
- Deux colonnes
- Colonne N1 : des N Cpte, (parfois identique, en doublons,
triplons voir plus),
- Colonne N2 : un libell. Apres lancement de la macro

Sur une seconde feuille "rsultat" :

Cela donne qu'une seul fois les N Cpte de la colonne 1 et en colonne
2 la concatnation des diffrents 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 "Donnes" et "Rsultat" :

Sub ConcatContraintes()

Dim CompteEnCours As String
Dim ComptePrcdent As String
Dim NbLignesATraiter As Long

Dim NoLigne As Long

Dim ContraintesConcatnes As String

ComptePrcdent = Cells(2, 1)
CompteEnCours = ComptePrcdent

NoLigne = 1

Worksheets("Concatenation").Cells(NoLigne, 1) = CompteEnCours
ContraintesConcatnes = 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 ComptePrcdent = CompteEnCours Then
ContraintesConcatnes = ContraintesConcatnes & " -=
" _
& Cells(i, 2)
ComptePrcdent = CompteEnCours
Else
Worksheets("Concatenation").Cells(NoLigne, 2) =
ContraintesConcatnes
NoLigne = NoLigne + 1
Worksheets("Concatenation").Cells(NoLigne, 1) =
CompteEnCours
ContraintesConcatnes = Cells(i, 2)
ComptePrcdent = CompteEnCours
End If
Next

End Sub

Exemple des Tableaux lies la macro :
Feuille "Donnes" :

N Compte | Libll |
= =
123 | Test Auto |
123 | Revision auto |
124 | Marche foret |
123 | Essence |
128 |Mnage |
124 |Gym |



Feuille "Rsultat" :

N Compte | Libll |
=
==
123 | Test Auto - Rvision auto - Essence |
124 | Marche foret - Gym |
128 | Mnage |

Voila, c'est la fin Merci encore de votre aide.
Alex
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