Find() / Do/ While

JC de Lorient

XLDnaute Impliqué
Bonjour le forum
j'ai cette procédure

Sub analyse_mensuelle()
Application.ScreenUpdating = False
Sheets("Gest Mens").Range("B6:H100").ClearContents
Dim agent, D As Range
Dim a, C, ADRES
For Each agent In Sheets("Données").Range("C2:C" & Sheets("Données").Range("C65536").End(xlUp).Row)
With Sheets("Base").Columns(6)
Set C = .Find(agent)
If Not C Is Nothing Then
ADRES = C.Address
Do
If Month(Sheets("Base").Range(C.Address).Offset(0, -1)) _
= Month(Sheets("Gest Mens").Range("G1")) Then
a = Sheets("Gest Mens").Range("B65536").End(xlUp).Row + 1
Sheets("Gest Mens").Range("B" & a) = agent
Sheets("Gest Mens").Range("C" & a).FormulaR1C1 = "=SUMPRODUCT((Nom_Agent=RC[-1])*(MONTH(Terme)=MONTH(R1C7)))"
Sheets("Gest Mens").Range("D" & a).FormulaR1C1 = "=SUMPRODUCT((Nom_Agent=RC[-2])*(MONTH(Terme)=MONTH(R1C7))*(((Rbst>0)+(Réinvest>0))>0))"
Sheets("Gest Mens").Range("E" & a).FormulaR1C1 = "=SUMPRODUCT((Nom_Agent=RC[-3])*(MONTH(Terme)=MONTH(R1C7))*(Montant))"
Sheets("Gest Mens").Range("F" & a).FormulaR1C1 = "=SUMPRODUCT((Nom_Agent=RC[-4])*(MONTH(Terme)=MONTH(R1C7))*(Réinvest))"
Sheets("Gest Mens").Range("G" & a).FormulaR1C1 = "=SUMPRODUCT((Nom_Agent=RC[-5])*(MONTH(Terme)=MONTH(R1C7))*(Rbst))"
Sheets("Gest Mens").Range("H" & a).FormulaR1C1 = "=RC[-2]/RC[-3]"
End If
Set C = .FindNext(C)
Loop While Not C Is Nothing And C.Address <> ADRES
End If
End With
Next
Application.ScreenUpdating = True
End Sub

je fais une boucle sur des "agent"
Je souhaiterais que lorsque la condition en rouge est vérifiée que la boucle passe a l'agent suivant (en bleu dans le code) puisque j'ai besoin d'une seule concordence pour mes calculs de SOMMEPROD
je me perdes un peu avec les Find Do While etc etc
Si le code peut etre simplifié je suis preneur ;)

merci a tous et toutes pour l'aide
bonne après midi
 

JC de Lorient

XLDnaute Impliqué
Re : Find() / Do/ While

Re
Bonjour a vous deux
En fait j'ai une liste d'agent (15)
pour chaque agent je peux avoir dans ma feuille 10 lignes le concernant
si l'agent existe dans ma feuille (colonne6) et si l'offset(0,-1) (date) est égal a G1 (ex: septembre) sur une ou +sieurs de mes lignes
alors compléter ma feuille avec les SOMMEPROD
si pas de concordence on passe a l'agent suivant
si 1 seule concordence on passe aussi a l'agent suivant => SOMMEPROD qui fait la synthèse de l'agent
Je m'absente une partie de l'après midi
je vous retrouve a mon retour
mille mercis
 

JC de Lorient

XLDnaute Impliqué
Re : Find() / Do/ While

re à tous
ci joint une partie de mon fichier épuré au max
feuille Gest_Mens => résultat obtenu
feuille Gest_Mens(2) => résultat souhaité

En clair obtenir une synthése par agent si le mois colonne Terme est = Juin
désolé mais ça rame a l'ouverture !! épurage oblige !

merci de votre aide
 

Pièces jointes

  • 2006.zip
    46.5 KB · Affichages: 30
  • 2006.zip
    46.5 KB · Affichages: 35
  • 2006.zip
    46.5 KB · Affichages: 31

porcinet82

XLDnaute Barbatruc
Re : Find() / Do/ While

re,

Tiens essaye ce code et dis moi si ca te convient ou s'il y a encore des truc a revoit :
PHP:
Sub analyse_mensuelle()
Dim agent, D As Range
Dim a, C, ADRES, bool As Boolean

Application.ScreenUpdating = False
For Each agent In Sheets("Données").Range("C2:C" & Sheets("Données").Range("C65536").End(xlUp).Row)
    With Sheets("Base").Columns(6)
        Set C = .Find(agent)
        If Not C Is Nothing Then
            If Mid(C.Offset(0, -1).Value, 4, 2) = "06" Then
                ADRES = C.Address
                If Month(Sheets("Base").Range(C.Address).Offset(0, -1)) = Month(Sheets("Gest Mens").Range("G1")) Then
                    a = Sheets("Gest Mens").Range("B65536").End(xlUp).Row + 1
                    With Sheets("Gest Mens")
                        .Range("B" & a) = agent
                        .Range("C" & a).FormulaR1C1 = "=SUMPRODUCT((Nom_Agent=RC[-1])*(MONTH(Terme)=MONTH(R1C7)))"
                        .Range("D" & a).FormulaR1C1 = "=SUMPRODUCT((Nom_Agent=RC[-2])*(MONTH(Terme)=MONTH(R1C7))*(((Rbst>0)+(Réinvest>0))>0))"
                        .Range("E" & a).FormulaR1C1 = "=SUMPRODUCT((Nom_Agent=RC[-3])*(MONTH(Terme)=MONTH(R1C7))*(Montant))"
                        .Range("F" & a).FormulaR1C1 = "=SUMPRODUCT((Nom_Agent=RC[-4])*(MONTH(Terme)=MONTH(R1C7))*(Réinvest))"
                        .Range("G" & a).FormulaR1C1 = "=SUMPRODUCT((Nom_Agent=RC[-5])*(MONTH(Terme)=MONTH(R1C7))*(Rbst))"
                        .Range("H" & a).FormulaR1C1 = "=RC[-2]/RC[-3]"
                    End With
                End If
            End If
        End If
    End With
Next agent
Application.ScreenUpdating = True
End Sub

@+
 

JC de Lorient

XLDnaute Impliqué
Re : Find() / Do/ While

re Porcinet
merci de ton aide mais j'ai pas le résultat souhaité et comment expliquer ça !! lol
je vé essayer : 5 agents untel1 untel2 untel3 untel4 untel5

ligne 5 01/06/2006 untel1
ligne 10 01/07/2006 untel2
ligne 12 01/08/2006 untel3
ligne 18 01/09/2006 untel1
ligne 25 01/09/2006 untel5
recherche sur septembre sur untel1
Analyse 1ère ligne untel1 oui septembre faux
pas de procédure
prochain untel1 ligne(18) mois = septembre condition des SOMMEPROD
Ensuite même chose mais avec untel2
içi aucune concordance idem untel3
pour finir untel5 là on a la procédure puisque untel5 a des données en septembre

j'espère avoir été assez clair
merci encore
 

JC de Lorient

XLDnaute Impliqué
Re : Find() / Do/ While

Re
j'ai réussi a concocter ce code !!!!!!!

Sub analyse_mensuelle()
Application.ScreenUpdating = False
Sheets("Gest Mens").Range("B6:H" & Sheets("Gest Mens").Range("b65536").End(xlUp).Row + 1).ClearContents
Dim agent, D As Range
Dim a, ADRES
For Each agent In Sheets("Données").Range("C2:C" & Sheets("Données").Range("C65536").End(xlUp).Row)
With Sheets("Base").Columns(6)
Set D = .Find(agent)
If Not D Is Nothing Then
ADRES = D.Address
Do
If Month(Sheets("Base").Range(D.Address).Offset(0, -1)) _
= Month(Sheets("Gest Mens").Range("G1")) Then
a = Sheets("Gest Mens").Range("B65536").End(xlUp).Row + 1
With Sheets("Gest Mens")
.Range("B" & a) = agent
.Range("C" & a).FormulaR1C1 = "=SUMPRODUCT((Nom_Agent=RC[-1])*(MONTH(Terme)=MONTH(R1C7)))"
.Range("D" & a).FormulaR1C1 = "=SUMPRODUCT((Nom_Agent=RC[-2])*(MONTH(Terme)=MONTH(R1C7))*(((Rbst>0)+(Réinvest>0))>0))"
.Range("E" & a).FormulaR1C1 = "=SUMPRODUCT((Nom_Agent=RC[-3])*(MONTH(Terme)=MONTH(R1C7))*(Montant))"
.Range("F" & a).FormulaR1C1 = "=SUMPRODUCT((Nom_Agent=RC[-4])*(MONTH(Terme)=MONTH(R1C7))*(Réinvest))"
.Range("G" & a).FormulaR1C1 = "=SUMPRODUCT((Nom_Agent=RC[-5])*(MONTH(Terme)=MONTH(R1C7))*(Rbst))"
.Range("H" & a).FormulaR1C1 = "=RC[-2]/RC[-3]"
If a > 7 Then
Range("B" & a - 1 & ":H" & a - 1).Select
Selection.Copy
Range("B" & a & ":H" & a).Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Range("B" & a).Select
End If
End With
GoTo prochain
End If
Set D = .FindNext(D)
Loop While Not D Is Nothing And D.Address <> ADRES
End If
End With
prochain:
Next
Application.ScreenUpdating = True
End Sub

N'y aurait il pas moyen de faire plus simple et plus rapide
je trouve que ça "rame" un peu sinon je m'en contenterai
merci encore
 

porcinet82

XLDnaute Barbatruc
Re : Find() / Do/ While

re,

Je viens de tester ton code et le résultat est identique a celui trouvé avec celui que je t'ai proposé, du moins pour le fichier que tu as mis en pièces jointes.
Il me manque peut etre certaines info si tu dis qu'il ne va pas.

@+
 

Discussions similaires

Réponses
14
Affichages
693

Statistiques des forums

Discussions
312 416
Messages
2 088 244
Membres
103 783
dernier inscrit
manax