MACRO REGROUPEMENT/COMPARATIF COLONNE

12 réponses
Avatar
newoceane2000
Bonjour,

J=92ai dans un fichier :=20

en colonne A des noms=20
en colonne B des nombres
en colonne C des noms pouvant =EAtre identiques ou non =E0 ceux de la colon=
nes A
en colonne D des nombres pouvant diff=E9rer de ceux de la colonne B

Ex :

PAIN 3 EAU 3
HUILE 2 HUILE 2
EAU 1 VIANDE 4
PAIN 1



Serait-il possible =E0 l'aide d'un macro d'obtenir un tableau comparatif qu=
i aligne pour un m=EAme nom les nombres correspondants et indique en gras q=
uand les nombres sont diff=E9rents soit dans notre exemple :

PAIN 3 1
HUILE 2 2
EAU 1 3
VIANDE 4

avec en gras tous les chiffres =E0 part les 2 de l'huile qui sont identique=
s ?

Vous remerciant par avance pour votre aide.

Cordialement

10 réponses

1 2
Avatar
isabelle
bonjour newoceane2000,

en colonne C peut-il y avoir plus d'une fois "PAIN" ou "HUILE" etc ?
si oui doit-on les additionner en colonne C
en colonne A, est ce qu'il n'y a que des valeurs unique ?

isabelle


Le 2013-06-05 10:02, a écrit :
Bonjour,

J’ai dans un fichier :

en colonne A des noms
en colonne B des nombres
en colonne C des noms pouvant être identiques ou non à ceux de la colonnes A
en colonne D des nombres pouvant différer de ceux de la colonne B

Ex :

PAIN 3 EAU 3
HUILE 2 HUILE 2
EAU 1 VIANDE 4
PAIN 1



Serait-il possible à l'aide d'un macro d'obtenir un tableau comparatif qui aligne pour un même nom les nombres



correspondants et indique en gras quand les nombres sont différents soit
dans notre exemple :

PAIN 3 1
HUILE 2 2
EAU 1 3
VIANDE 4

avec en gras tous les chiffres à part les 2 de l'huile qui sont identiques ?

Vous remerciant par avance pour votre aide.

Cordialement

Avatar
newoceane2000
Bonjour Isabelle

Dans la colonne A comme dans la colonne C il ne peut pas y avoir 2 fois le même noms (au sein d'une même colonne) par contre la plupart des noms i ndiqués en colonne A sont également en colonne C.

Merci d'avance pour votre aide


Le mercredi 5 juin 2013 16:02:56 UTC+2, a écrit :
Bonjour,



J’ai dans un fichier :



en colonne A des noms

en colonne B des nombres

en colonne C des noms pouvant être identiques ou non à ceux de la col onnes A

en colonne D des nombres pouvant différer de ceux de la colonne B



Ex :



PAIN 3 EAU 3

HUILE 2 HUILE 2

EAU 1 VIANDE 4

PAIN 1







Serait-il possible à l'aide d'un macro d'obtenir un tableau comparatif qui aligne pour un même nom les nombres correspondants et indique en gras quand les nombres sont différents soit dans notre exemple :



PAIN 3 1

HUILE 2 2

EAU 1 3

VIANDE 4



avec en gras tous les chiffres à part les 2 de l'huile qui sont identiq ues ?



Vous remerciant par avance pour votre aide.



Cordialement
Avatar
GL
Le 05/06/2013 16:02, a écrit :
Bonjour,

J’ai dans un fichier :

en colonne A des noms
en colonne B des nombres
en colonne C des noms pouvant être identiques ou non à ceux de la colonnes A
en colonne D des nombres pouvant différer de ceux de la colonne B

Ex :

PAIN 3 EAU 3
HUILE 2 HUILE 2
EAU 1 VIANDE 4
PAIN 1



Serait-il possible à l'aide d'un macro d'obtenir un tableau comparatif qui aligne pour un même nom les nombres correspondants et indique en gras quand les nombres sont différents soit dans notre exemple :

PAIN 3 1
HUILE 2 2
EAU 1 3
VIANDE 4

avec en gras tous les chiffres à part les 2 de l'huile qui sont identiques ?



C'est très facile et vous n'aurez pas besoin de macro (Excel est fait
pour faire des calculs quand même !)
Le seul point (un peu) compliqué est d'extraire la liste des noms sans
doublons.

Si on suppose que c'est fait : vous irez chercher les valeurs
correspondantes dans les colonnes B et D avec RECHERCHEV
(ou SOMME.SI si vous sommez sur les doublons) et vous mettrez
une mise en forme conditionnelle pour afficher en gras les lignes où
les nombres sont différents.

Donc pour extraire la liste des noms sans doublons il faut d'abord avoir
la liste de tous les noms (à ma connaissance, il n'y a pas de fonction
EXCEL qui réunisse deux plages : donc il faut le faire à la main).

Supposons qu'on a donc en colonne F la liste de tous les noms :
F G
PAIN =SI(EQUIV(F1;$F$1:$F$7;0)=LIGNE();LIGNE())
HUILE ...
EAU
EAU
HUILE
VIANDE
PAIN =SI(EQUIV(F1;$F$1:$F$7;0)=LIGNE();LIGNE())

La colonne G contient FAUX pour les doublons (sauf la première
occurrence) et le numéro de la ligne sinon.

Ensuite on trie ces valeurs en éliminant les FAUX :

H
{=PETITE.VALEUR(G1:G7;FORLIST())}
...
{=PETITE.VALEUR(G1:G7;FORLIST())}

(en utilisant la fonction FORLIST que j'ai décrite dans le /thread/
"Comparaison sur 3 colonnes" ou bien sinon :

{=PETITE.VALEUR(G1:G7;{1;2;3;4;5;6;7;8}}

(validation matricielle ici : il s'agit d'un tri)

Et c'est réglé : avec INDEX on récupère les noms et avec RECHERCHEV
(ou SOMME.SI) les valeurs et une mise en forme conditionnelle termine
le travail.

Cordialement.
Avatar
Jacquouille
Bonjour
Un tri par ordre alphabétique de chaque colonne amènerait déjà beaucoup plus
de clarté, voire les doublons qui seraient peut-être côte à côte....

Jacquouille

" Le vin est au repas ce que le parfum est à la femme."
a écrit dans le message de groupe de discussion :


Bonjour,

J’ai dans un fichier :

en colonne A des noms
en colonne B des nombres
en colonne C des noms pouvant être identiques ou non à ceux de la colonnes A
en colonne D des nombres pouvant différer de ceux de la colonne B

Ex :

PAIN 3 EAU 3
HUILE 2 HUILE 2
EAU 1 VIANDE 4
PAIN 1



Serait-il possible à l'aide d'un macro d'obtenir un tableau comparatif qui
aligne pour un même nom les nombres correspondants et indique en gras quand
les nombres sont différents soit dans notre exemple :

PAIN 3 1
HUILE 2 2
EAU 1 3
VIANDE 4

avec en gras tous les chiffres à part les 2 de l'huile qui sont identiques ?

Vous remerciant par avance pour votre aide.

Cordialement
Avatar
isabelle
bonjour newoceane2000 ,

j'ai présumé que les données sont sur l'onglet Feuil1 et le résultat est
mit sur l'onglet Feuil2
attention au retour à la ligne intempestifs

Sub Macro1()
Dim m As Long, c
Sheets("Feuil2").Cells.Delete
Sheets("Feuil1").Range("A:B").Copy Sheets("Feuil2").Range("A1")
For Each c In Sheets(1).Range("C1:C" &
Sheets(1).Range("C65536").End(xlUp).Row)
m = Application.CountIf(Sheets("Feuil2").Range("A:A"), c)
If m = 0 Then
Sheets("Feuil2").Range("A" &
Sheets("Feuil2").Range("A65536").End(xlUp).Row + 1) = c
Sheets("Feuil2").Range("C" &
Sheets("Feuil2").Range("A65536").End(xlUp).Row) = c.Offset(0, 1)
Else
Sheets("Feuil2").Range("C" & Application.Match(c,
Sheets("Feuil2").Range("A:A"), 0)) = c.Offset(0, 1)
End If
Next
End Sub

isabelle

Le 2013-06-07 06:43, a écrit :
Bonjour Isabelle

Dans la colonne A comme dans la colonne C il ne peut pas y avoir 2 fois le même noms (au sein d'une même colonne)



par contre la plupart des noms indiqués en colonne A sont également en
colonne C.

Merci d'avance pour votre aide
Avatar
newoceane2000
Bonjour GL,

Merci beaucoup pour votre aide.

Cependant il faut pour que ça marche que tout les noms soient en F ce qui nécessite du temps et des comparaisons de ma part (je peux avoir des lis tes de noms beaucoup plus longue)

L'intérêt pour moi était que le regroupement en F se fasse automatiqu ement et que la colonne G et H reprennent les valeurs de B et D corresponda nts au noms associés.


Le vendredi 7 juin 2013 15:06:19 UTC+2, GL a écrit :
Le 05/06/2013 16:02, a écrit :

> Bonjour,

>

> J’ai dans un fichier :

>

> en colonne A des noms

> en colonne B des nombres

> en colonne C des noms pouvant être identiques ou non à ceux de la c olonnes A

> en colonne D des nombres pouvant différer de ceux de la colonne B

>

> Ex :

>

> PAIN 3 EAU 3

> HUILE 2 HUILE 2

> EAU 1 VIANDE 4

> PAIN 1

>

>

>

> Serait-il possible à l'aide d'un macro d'obtenir un tableau comparati f qui aligne pour un même nom les nombres correspondants et indique en gr as quand les nombres sont différents soit dans notre exemple :

>

> PAIN 3 1

> HUILE 2 2

> EAU 1 3

> VIANDE 4

>

> avec en gras tous les chiffres à part les 2 de l'huile qui sont ident iques ?



C'est très facile et vous n'aurez pas besoin de macro (Excel est fait

pour faire des calculs quand même !)

Le seul point (un peu) compliqué est d'extraire la liste des noms sans

doublons.



Si on suppose que c'est fait : vous irez chercher les valeurs

correspondantes dans les colonnes B et D avec RECHERCHEV

(ou SOMME.SI si vous sommez sur les doublons) et vous mettrez

une mise en forme conditionnelle pour afficher en gras les lignes où

les nombres sont différents.



Donc pour extraire la liste des noms sans doublons il faut d'abord avoir

la liste de tous les noms (à ma connaissance, il n'y a pas de fonction

EXCEL qui réunisse deux plages : donc il faut le faire à la main).



Supposons qu'on a donc en colonne F la liste de tous les noms :

F G

PAIN =SI(EQUIV(F1;$F$1:$F$7;0)=LIGNE();LIGNE())

HUILE ...

EAU

EAU

HUILE

VIANDE

PAIN =SI(EQUIV(F1;$F$1:$F$7;0)=LIGNE();LIGNE())



La colonne G contient FAUX pour les doublons (sauf la première

occurrence) et le numéro de la ligne sinon.



Ensuite on trie ces valeurs en éliminant les FAUX :



H

{=PETITE.VALEUR(G1:G7;FORLIST())}

...

{=PETITE.VALEUR(G1:G7;FORLIST())}



(en utilisant la fonction FORLIST que j'ai décrite dans le /thread/

"Comparaison sur 3 colonnes" ou bien sinon :



{=PETITE.VALEUR(G1:G7;{1;2;3;4;5;6;7;8}}



(validation matricielle ici : il s'agit d'un tri)



Et c'est réglé : avec INDEX on récupère les noms et avec RECHERCH EV

(ou SOMME.SI) les valeurs et une mise en forme conditionnelle termine

le travail.



Cordialement.
Avatar
newoceane2000
Bonjour Isabelle,

Merci beaucoup pour votre aide.

J'ai fait un copier-coller de la macro et supprimé des lignes quand elles apparaissaient en rouge mais lors de l'exécution de la macro, Excel indi que : erreur de compilation : Else sans If.

Que dois-je faire pour que cela fonctionne ?

Merci d'avance pour votre réponse


Le samedi 8 juin 2013 00:28:26 UTC+2, isabelle a écrit :
bonjour newoceane2000 ,



j'ai présumé que les données sont sur l'onglet Feuil1 et le résul tat est

mit sur l'onglet Feuil2

attention au retour à la ligne intempestifs



Sub Macro1()

Dim m As Long, c

Sheets("Feuil2").Cells.Delete

Sheets("Feuil1").Range("A:B").Copy Sheets("Feuil2").Range("A1")

For Each c In Sheets(1).Range("C1:C" &

Sheets(1).Range("C65536").End(xlUp).Row)

m = Application.CountIf(Sheets("Feuil2").Range("A:A"), c)

If m = 0 Then

Sheets("Feuil2").Range("A" &

Sheets("Feuil2").Range("A65536").End(xlUp).Row + 1) = c

Sheets("Feuil2").Range("C" &

Sheets("Feuil2").Range("A65536").End(xlUp).Row) = c.Offset(0, 1)

Else

Sheets("Feuil2").Range("C" & Application.Match(c,

Sheets("Feuil2").Range("A:A"), 0)) = c.Offset(0, 1)

End If

Next

End Sub



isabelle



Le 2013-06-07 06:43, a écrit :

> Bonjour Isabelle

>

> Dans la colonne A comme dans la colonne C il ne peut pas y avoir 2 fois le même noms (au sein d'une même colonne)



par contre la plupart des noms indiqués en colonne A sont également e n

colonne C.

>

> Merci d'avance pour votre aide
Avatar
GL
Le 09/06/2013 14:23, a écrit :
Bonjour GL,

Merci beaucoup pour votre aide.

Cependant il faut pour que ça marche que tout les noms soient en F ce qui nécessite du temps et des comparaisons de ma part (je peux avoir des listes de noms beaucoup plus longue)

L'intérêt pour moi était que le regroupement en F se fasse automatiquement et que la colonne G et H reprennent les valeurs de B et D correspondants au noms associés.




Comme indiqué dans ma réponse, il n'existe pas à ma connaissance de
fonction EXCEL qui réunisse deux ou plusieurs plages en un seul
tableau (ou vecteur).

Il faut donc le faire à la main (copier-coller) : cela nécessite un
peu de temps, mais pas de comparaison (l'élimination des doublons
est l'objet de la fonction matricielle :
{=PETITE.VALEUR( Plage ; FORLIST())}
qui élimine les FAUX (puisque PETITE.VALEUR ne fonctionne que sur
les valeur numériques et que FAUX n'est pas numérique pour Excel
-- et trie la liste (qui est déjà triée...) par la même occasion).

Dans l'extension Morefunc.xll de Laurent Longres vous avez la fonction
matricielle TAB.JOINDRE qui réunit des plages de cellules.

Sinon vous pouvez le faire en VBA assez simplement en définissant une
fonction :
REUNION ( VRAI | FAUX ; Plage1 ; Plage2 ; Plage3 ; ... )
Le premier argument dit :
VRAI : on inclut les cellules vides
FAUX : on exclut les cellules vides

Le résultat sera un vecteur colonne ou un vecteur ligne contenant
toutes les valeurs non vides (ou avec les vides remplacées par 0
si le premier argument est VRAI) des plages données :

' ------------------------------------------------------------
Public Function REUNION(InclureVide As Boolean, ParamArray R())
Dim c As Range, A, res, i&

For Each A In R
i = i + A.Count
If Not InclureVide Then i = i - WorksheetFunction.CountBlank(A)
Next A
If i = 0 Then Set REUNION = Nothing: Exit Function

ReDim res(1 To i)
i = 0
For Each A In R
If InclureVide Then
For Each c In A.Cells: i = i + 1: res(i) = c.Value: Next c
Else
For Each c In A.Cells
If Not IsEmpty(c) Then i = i + 1: res(i) = c.Value
Next c
End If
Next A

If Application.Caller.Columns.Count = 1 Then
REUNION = WorksheetFunction.Transpose(res)' résultat en colonne
Else: REUNION = res ' résultat en ligne
End If

End Function
' ----------------------------------------------------------------

Alors en colonne F vous pouvez valider la fonction matricielle :

{=REUNION(FAUX;A1:A1000;D1:D1000)}

sur une plage suffisamment grande (vous verrez que si la plage est
trop grande, les cellules afficheront "#N/A" comme c'est le cas
quand une formule matricielle est validée sur une plage plus grande
que son résultat).

Cordialement.
Avatar
GL
Le 09/06/2013 16:13, GL a écrit :
Le 09/06/2013 14:23, a écrit :
Bonjour GL,

Merci beaucoup pour votre aide.

Cependant il faut pour que ça marche que tout les noms soient en F ce
qui nécessite du temps et des comparaisons de ma part (je peux avoir
des listes de noms beaucoup plus longue)

L'intérêt pour moi était que le regroupement en F se fasse
automatiquement et que la colonne G et H reprennent les valeurs de B
et D correspondants au noms associés.



Alors en colonne F vous pouvez valider la fonction matricielle :

{=REUNION(FAUX;A1:A1000;D1:D1000)}

sur une plage suffisamment grande (vous verrez que si la plage est
trop grande, les cellules afficheront "#N/A" comme c'est le cas
quand une formule matricielle est validée sur une plage plus grande
que son résultat).



Du coup, PETITE.VALEUR va renvoyer #N/A partout, il faudra donc écrire
en colonne G :
{=PETITE.VALEUR(SIERREUR(F1:F1000;FAUX);FORLIST())}

de sorte que les #N/A sont ignorés comme les FAUX...

Cdt.
Avatar
isabelle
j'ai mis la macro dans ce fichier : http://cjoint.com/?CFjrkR2r3zM

isabelle

Le 2013-06-09 08:27, a écrit :
Bonjour Isabelle,

Merci beaucoup pour votre aide.

J'ai fait un copier-coller de la macro et supprimé des lignes quand elles apparaissaient



en rouge mais lors de l'exécution de la macro, Excel indique : erreur
de compilation : Else sans If.

Que dois-je faire pour que cela fonctionne ?

Merci d'avance pour votre réponse
1 2