GROS pb : 2 colonnes a comparer

plumpony531

XLDnaute Nouveau
Hello tout le monde, je progresse dans mon appli mais decidemment
c'est assez fastidueux alors je vous soumet mon pb

Tout d'abord je vous soumets mon code (un extrait)

Code:
If flag = 2 Then
            With Sheets('TEMP')
                For Each c In .Range('A2:a' & .Range('A2').End(xlDown).Row)
                    If Application.WorksheetFunction.CountIf(Sheets('GGM').Range('A2:a' & Sheets('GGM').Range('A2').End(xlDown).Row), c) > 0 Then
                    Feuil1.Cells(1, y).Value = MonthName(Month(Now), True)
                    Feuil1.Cells(x, y).Value = Feuil2.Cells(xtemp, ytemp + 1)
                    Feuil1.Cells(1, y + 1).Value = 'Delta Previous Month'
                    Feuil1.Cells(x, y + 1).Value = (Feuil2.Cells(xtemp, ytemp + 1).Value - Feuil1.Cells(x, y - 3).Value)
                    Feuil1.Cells(1, y + 2).Value = 'cumulated delta'
                    Feuil1.Cells(x, y + 2).Value = (Feuil1.Cells(x, y + 1).Value + Feuil1.Cells(x, y - 1).Value)
                    Else
                    Feuil1.Range('A2').End(xlDown).Offset(1, 0).Value = c
                    Feuil1.Range('A2').End(xlDown).Offset(1, 0).Select
                    Feuil1.Range('A2').End(xlDown).Offset(0, y - 1).Value = Feuil2.Cells(xtemp, ytemp + 1)
                    End If
                Next c
            End With
            
          End If
          x = x + 1
          xtemp = xtemp + 1


En fait il s'agit de 2 colonnes que je compare. Pour chaque valeur de l'une je recherche son équivalent dans l'autre (feuille). Si je Trouve alors j'affiche dans la meme ligne que la valeur de reference les valeurs touvées dans la meme ligne que la valeur de comparaison sinon je met la valeurs de comparaison a la fin de la colonne de reference
Mon pb se situe lorsqu'une valeur de reference se trouve en mileu de colonnes et n'est pas trouvé dans la colonne de comparaison puisque je n'arrive pas a decaler cette ligne.

Une code valant mieux qu'une longue et peut etre douloureuse explication je joins mon code entier qui permettra peut etre aux bonnes ames souhaitant me repondre une meilleure comprehension.(l'integrale)

[file name=exemple2_20050519130618.zip size=22754]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/exemple2_20050519130618.zip[/file]
 

Pièces jointes

  • exemple2_20050519130618.zip
    22.2 KB · Affichages: 20

Hellboy

XLDnaute Accro
Bonjour plumpony531

J'ai de la misère a suivre. Je run ton programme mes je ne comprend pas exactement ce que tu veux accomplir. Pourrais-tu sans te référer a ton code, expliquer ce que tu dois accomplir comme tâche s.v.p

Merci !
 

plumpony531

XLDnaute Nouveau
Merci bcp pour ta réponse.....

Alors voici une petite explication.

Mon appli consiste a lister des groupes Active directory et a l'inventaire du contenu (en nombre de users)

1er lancement de l'appli : Je fais mon premier traitement. Cela consititue 4 colonnes ( 1 :nom du groupe, 2: nombre de users 3:difference/aumois précedent, 3:cumul des differences). Bien sur les colonnes 3 et 4 sont a 0 pour ce 1er lancement)


2eme lancement et les lancements qui suivent : Je fais le meme inventaire sauf que je le fais sur la feuille TEMP. Pour chaque valeurs inventoriée je cherche la meme valeur dans la 1 ere feuille(GGM). Si je la trouve alors dans la colonne 5 de la feuille GGM je calcule le nombre de users ainsi que la difference avec le lancement précédent dans la colonne 6 et le delta dans la colonne 7

3eme, 4eme ..... lancement : Je fait la meme chose sauf que je decale le y de 3 colonnes a chaque fois pour conservé les données précedente

A partir du 2eme lancement je supprime le contenu de TEMP a la fin du traitement.

Globalement cela se passe bien lorsqu'il n'y a que des nouvelles valeurs a rajouter ( puisque je les mets a la fin de la colonnes 1 de la feuille GGM)

Mon probleme est le suivant :

dans ma recherche de correspondance entre les valeurs de la feuille GGM et la feuille TEMP j'obtiens ce que je veux quand des nouvelles valeurs sont présentes dans la feuille GGM : je les mets a la fin de la colonnes 1 de la feuille GGM. Par contre comme je le montre dans le fichier exemple il y a un décalage dans la saisie du nombre de users ainsi que les deux calculs suivants ( lorsque des valeurs sont a soustraire )

En fait je ne sais pas comment lorsque je trouve une valeur équivalente entre les deux feuilles faire en sorte que le compte des users ainsi que les 2 calculs suivants soient sur la meme ligne que la valeurs de la col1 de la feuille GGM pour lesquels je trouvent des corrspondance dans la feuille TEMP

Voila Philippe j'espere avoir reussi a etre clair et je te remercie par avance de l'attention que tu portes a mon pb


Plum'
 

Hellboy

XLDnaute Accro
Bonjour plumpony531

Pour les explicatios, alors la je dis Bravo ! C'est pas toujours facile de reprendre le code d'un autre.

Enfin, je ne suis pas sur de tout saisir encore, mais, si je comprend cette partie:
Code:
Else
                    Feuil1.Range('A2').End(xlDown).Offset(1, 0).Value = c
                    Feuil1.Range('A2').End(xlDown).Offset(1, 0).Select
                    Feuil1.Range('A2').End(xlDown).Offset(0, y - 1).Value = Feuil2.Cells(xtemp, ytemp + 1)
C'est cette partie qui est la source de ton décalage :pinch:
Est-ce que si tu enleve cette ligne:
Code:
Feuil1.Range('A2').End(xlDown).Offset(1, 0).Select

Je suis sur qu'il n'y as pas que ça, mais ne lache pas, et moi non plus tant que tu n'aura pas obtenu satisfaction. ;)
 

plumpony531

XLDnaute Nouveau
Bonjour et merci pour cette prompte réponse.

En fait, la ligne

Code:
Feuil1.Range('A2').End(xlDown).Offset(1, 0).Select

Me sert a décaler à la derniere cellule de la feuille GGM une nouvelle valeur (non présente dans la feuille GGM ) de la feuille TEMP

Je vais tenter de faire une petite explication avec les fameuses bases syntaxique de Dev c'est à dire TOTO,TITI,TUTU

Nous avons donc les elements suivants ( cette explication concerne la partie de mon code ou je compare les deux colonnes)
On se situe dans le cas ou l'appli a été lancée au moins une fois.

COL1 feuille GGM COL2/COL3/COL4 Feuille GGM
TOTO 10 / 0 / 0
TITI 10 / 0 / 0
TUTU 25 / 0 / 0
TOUTOU 5 / 0 / 0

COL1 feuille TEMP COL2 feuille TEMP
TITI 10
TUTU 15
TOUTOU 54
TATA 33


A la fin de mon traitement, alors que la feuille TEMP est supprimée je devrais avoir l'affichage suivant

Nous sommes sur la feuille GGM

COL1 COL2 COL3 COL4 COL5 COL6
TOTO 10 0 0 - -
TITI 10 0 0 10 0
TUTU 25 0 0 15 -10
TOUTOU 5 0 0 54 49
TATA - - - 33 0


Voila le resultat qu'il me faudrait atteindre ( j'ia volontairement omis de remplir la 7eme colonne qui ne represente qu'un calcul supplementaire)

TOTO n'est plus présent dans l'inventaire fait dans la feuillle TEMP
donc les colonnes COL5 et COL6 sont vide
TATA est un nouvel element alors il apparait a la fin avec ses valeurs en COL5&6 : :33 = nb de users et 0 = Rien puisque c'est une nouvelle valeur)

mon pb c'est qu'il y a un decalage : Les colonnes 5&6 de TOTO on prennent les resultats de TITI ceux de TITI sont pris par TUTU. Au final il y a autant de decalage qu'il y a de TOTO

Voila, j'espere que cette synthese est comprehensible. J'espere vraiment que cet pb trouvera une solution


Plum'
 

Hellboy

XLDnaute Accro
Bonjour plumpony531

Tes explications sont super clair. Mais j'ai beau faire runner ton code, le regarder de tout les angles, mais il ne marche pas. Il ne fait pas du tout ce que tu dis que ça doit faire. Essaie ceci, pour voir ce que ça donne et dis moi si tu vois la différence.

De plus je vois que tu suppose que le premier élément de la liste de la feuille temps correspond au premier élément de la feuille GGM et ainsi de suite pour chaque élément. Assure toi que ça va etre le cas, sinon tu vas être dans de beau drap.

En passant, en gros, ce que j'ai changé, c'est l'endroit ou se termine ta boucle Next c. Essaie le changement, donne moi des nouvelles s.v.p

Code:
If flag = 2 Then
            With Sheets('TEMP')
                For Each c In .Range('A2:a' & .Range('A2').End(xlDown).Row)
                    If Application.WorksheetFunction.CountIf(Sheets('GGM').Range('A2:a' & Sheets('GGM').Range('A2').End(xlDown).Row), c) > 0 Then
                    Feuil1.Cells(1, y).Value = MonthName(Month(Now), True)
                    Feuil1.Cells(x, y).Value = Feuil2.Cells(xtemp, ytemp + 1)
                    Feuil1.Cells(1, y + 1).Value = 'Delta Previous Month'
                    Feuil1.Cells(x, y + 1).Value = (Feuil2.Cells(xtemp, ytemp + 1).Value - Feuil1.Cells(x, y - 3).Value)
                    Feuil1.Cells(1, y + 2).Value = 'cumulated delta'
                    Feuil1.Cells(x, y + 2).Value = (Feuil1.Cells(x, y + 1).Value + Feuil1.Cells(x, y - 1).Value)
                    Else
                    Feuil1.Range('A2').End(xlDown).Offset(1, 0).Value = c
                    'Feuil1.Range('A2').End(xlDown).Offset(1, 0).Select
                    Feuil1.Range('A2').End(xlDown).Offset(0, y - 1).Value = Feuil2.Cells(xtemp, ytemp + 1)
                    End If
               
           x = x + 1
          Next c
          End With
          End If

Désolé de ne pas être plus utilie ! :eek:
 

plumpony531

XLDnaute Nouveau
Merci encore pour ton aide plus que précieuse.

C'est justement l'un des tes remarques qui a mon avis est une partie de mon pb

De plus je vois que tu suppose que le premier élément de la liste de la feuille temps correspond au
premier élément de la feuille GGM et ainsi de suite pour chaque élément


Comment puis je faire pour me passer de cette contrainte ?
en effet les elements de GGM ne sont peux etre plus sur TEMP et des nouveaux elements de TEMP sont peu etre nouveaux pour GGM.


en fait je me repose le pb autrement.

Je génère mes deux listes. ensuite je fait mon traitement.

Malheuresement je n'arrive pas à me depatouiller de cette methode de recherche

Code:
With Sheets('GGM')
              For Each c In .Range('A2:a' & .Range('A2').End(xlDown).Row)
                  If Application.WorksheetFunction.CountIf(Sheets('TEMP').Range('A2:a' & Sheets('GGM').Range('A2').End(xlDown).Row), c) > 0 Then


Ce pb je l'aurais et je lui ferais la peau .....;
 

Hellboy

XLDnaute Accro
Bonjour plumpony531

Jje suis heureux de voir que je n'étais pas complètement en dehors de mes pompes.(Pas sur d'avoir la bonne expression je suis du Québec).

Maintenant, pour ton pb, il faut que a chaque éléments que tu veux comparer de GGM avec Temp, tu repasse toute la liste de temp a chaque fois. Je manque de temps aujourd'hui pour te donner un exemple, mais essaie d'appliquer ce que je viens de te dire et je te reviens si tu as des problèmes.
 

plumpony531

XLDnaute Nouveau
Merci Hellboy pour ta perceverance.....

Je te rassure, ton expression est tou a fait comprehensible pour un Francais ..


Je pense avoir trouvé la solution à une partie de mon pb en mettant un indice i comme montré dans le code ci dessous. Par ailleurs je fais ce traitement de recerche dans un 2eme temps c'est a dire que je constitue entierement ma liste puis je lance la recherche. Maintenant il n'y a plus de decalage.

Code:
If flag = 2 Then
           i = 2
           xtemp = 2
           ytemp = 1
            With Sheets('GGM')
                For Each c In .Range('A' & i & ':a' & .Range('A2').End(xlDown).Row)
                    If Application.WorksheetFunction.CountIf(Sheets('TEMP').Range('A2:a' & Sheets('TEMP').Range('A2').End(xlDown).Row), c) > 0 Then
                    MsgBox ActiveCell.Value
                    Feuil1.Cells(1, y).Value = MonthName(Month(Now), True)
                    Feuil1.Cells(i, y).Value = Feuil2.Cells(xtemp, ytemp + 1)
                    Feuil1.Cells(1, y + 1).Value = 'Delta Previous Month'
                    Feuil1.Cells(i, y + 1).Value = (Feuil2.Cells(xtemp, ytemp + 1).Value - Feuil1.Cells(x, y - 3).Value)
                    Feuil1.Cells(1, y + 2).Value = 'cumulated delta'
                    Feuil1.Cells(i, y + 2).Value = (Feuil1.Cells(i, y + 1).Value + Feuil1.Cells(x, y - 1).Value)
                    'Else
                    'Feuil1.Range('A2').End(xlDown).Offset(1, 0).Value = c
                    'Feuil1.Range('A2').End(xlDown).Offset(1, 0).Select
                    'Feuil1.Range('A2').End(xlDown).Offset(0, y - 1).Value = Feuil2.Cells(xtemp, ytemp + 1)
                    End If
                    i = i + 1
                    xtemp = xtemp + 1
                    
                Next c
            End With
           End If

Maintenant, il me reste a trouver le moyen de recuperer les valeurs liées a la valeurs de TEMP que je retrouve dans GGM

Code:
If Application.WorksheetFunction.CountIf(Sheets('TEMP').Range('A2:a' & Sheets('TEMP').Range('A2').End(xlDown).Row), c) > 0

A ce niveau, si c'est superieur à 0 cela veut dire qu'une valeur de GGM a été retrouvée dans TEMP

Comment est ce que je peux recuperer la valeur (COL2) ( nombre de users) de chaque valeur de la COL1 de GGM que je retrouve dans GGM ?


Merci

Plum'
 

Hellboy

XLDnaute Accro
Bonsoir plum

Je crois que ceci va répondre a ta demande(j'espère!)
Code:
'Positionnement des y en fonction du remplissage
                
        If flag = 2 Then
           With Sheets('GGM')
                Sheets('TEMP').Select
                Tableau_ColA_B_Feuille_Temps = Sheets('TEMP').Range(Cells(1, 1), Cells(Cells(65536, 1).End(xlUp).Row, 2))
                .Select
                Tableau_All_Colonne_Feuille_GGM = Sheets('GGM').Range(Cells(1, 1), Cells(Cells(65536, 1).End(xlUp).Row, Cells(1, 1).End(xlToRight).Column))
                DerniereColonneGGM = .Cells(1, 1).End(xlToRight).Column
                .Cells(1, DerniereColonneGGM + 1).Value = MonthName(Month(Now), True)
                .Cells(1, DerniereColonneGGM + 2).Value = 'Delta Previous Month'
                .Cells(1, DerniereColonneGGM + 3).Value = 'cumulated delta'
                For ElementDans_Temp = 2 To UBound(Tableau_ColA_B_Feuille_Temps) 'Ici on va passer en revu tout les éléments de la feuille Temps
                    Trouvé = False 'assume que l'élément ds Temps n'est pas ds GGM
                    
                    For ElementDans_GGM = 2 To UBound(Tableau_All_Colonne_Feuille_GGM) 'Ici on passe en revue pour chaque élément de Temps tout les éléments de GGM
                             If Tableau_ColA_B_Feuille_Temps(ElementDans_Temp, 1) = Tableau_All_Colonne_Feuille_GGM(ElementDans_GGM, 1) Then ' Ici on vérifie si les deux élémentsl,un de temps et l'autre de GGM sont pareil.
                                .Cells(ElementDans_GGM, DerniereColonneGGM + 1).Value = Tableau_ColA_B_Feuille_Temps(ElementDans_Temp, 2)
                                .Cells(ElementDans_GGM, DerniereColonneGGM + 2).Value = (Tableau_ColA_B_Feuille_Temps(ElementDans_Temp, 2)) - Tableau_All_Colonne_Feuille_GGM(ElementDans_GGM, DerniereColonneGGM - 2)
                                .Cells(ElementDans_GGM, DerniereColonneGGM + 3).Value = .Cells(ElementDans_GGM, DerniereColonneGGM + 2).Value + Tableau_All_Colonne_Feuille_GGM(ElementDans_GGM, DerniereColonneGGM - 1)
                                Trouvé = True
                                Exit For
                              End If
                    Next ElementDans_GGM
                    
                    If Trouvé = False Then
                      .Cells(.Cells(1, 1).End(xlUp).Offset(1, 0).Row, DerniereColonneGGM + 1) = Tableau_ColA_B_Feuille_Temps(ElementDans_Temp, 1)
                      .Cells(.Cells(1, 1).End(xlUp).Offset(1, 0).Row, DerniereColonneGGM + 2) = 0
                      .Cells(.Cells(1, 1).End(xlUp).Offset(1, 0).Row, DerniereColonneGGM + 3) = 0
                    End If
                Next ElementDans_Temp
            
              .Range('A1:Z1').Font.Size = 11
              .Range('A1:Z1').Font.Bold = True
            End With
        End If
        End If
      Next
Call CreationEntete
'Feuil2.Range('A:B').Delete




' TEST SORTIE.

Le seul probleme que je vois avec ça, c'est que si tu applique cette macro plusieures fois, je ne sais pas si tu dois calculer tes delta cumulatif avec la fois précedente ou toute les fois précédentes ?

a+
 

plumpony531

XLDnaute Nouveau
Bonjour a tous et bonjour à Hellboy en particulier

Le code que tu m'a donné est super puisque cela fait bien se que je veux faire avec en plus une rapidité accrue dans la partie comparaison des colonnes ( ? grace à Ubound ?)

Seul petit hic, et c'est justement l'objet de la question que tu me pose a la fin de ton code c'est que le calcul du delta cumulatif ne doit se faire qu'avec la fois précedente et nom pas.


Je vais tenter de decortiquer ton code et de trouver la correction a ce petit hic.


thanks a lot et bonne fin de nuit puisque pour toi il doit etre au environ de 3h du matin alors qu'ici à TOULOUSE il est 10h20 du matin.


Plum'
 

plumpony531

XLDnaute Nouveau
Hello Tout le monde


Ca y est TOUT Fonctionne !!!!!! Je lance les premiers tests fonctionnels (EN VRAI)..... C mon chef qui va etre content...... Moi aussi vous me direz parceque du fait je suis un peu moins bete.

Je ne manquerais pas de revenir sur ce fabuleux forum et je remercie encore une fois ce cher Hellboy pour son aide efficace.


Plum'
 

Statistiques des forums

Discussions
312 391
Messages
2 087 980
Membres
103 690
dernier inscrit
LeDuc