CODE MACRO A MODIFIER ( suite d'un post du 9 mars )

urbanito1

XLDnaute Occasionnel
bonsoir à la communauté

petite macro de Softmama qui permet d'addionner des montants mensuels par rapport à un mois et un paramètre...

petit problème : lorsqu'il y a plusieurs paramètres sur le même mois le calcul est erroné


Sub gogogo()
Range("Z2:Z" & Range("A2").End(xlDown).Row).FormulaR1C1 = "=RC1&RC2"
Range("AA2:AA" & Range("A2").End(xlDown).Row).FormulaR1C1 = "=SUMPRODUCT((R2C[-1]:R" & Range("A2").End(xlDown).Row & "C[-1]=RC[-1])*R2C10:R" & Range("A2").End(xlDown).Row & "C10)"
Set c = Range("Z2"): Set d = Feuil2.Range("E2")
Do While c <> ""
If IsError(Application.Match(c, Feuil2.Range("E2:E" & Range("A2").End(xlDown).Row), 0)) Then
c.Copy d
Cells(c.Row, 1).Resize(, 2).Copy Feuil2.Cells(d.Row, 1)
d.Offset(, -2) = c.Offset(, 1)
Cells(c.Row, "W").Copy Feuil2.Cells(d.Row, 4)
Set d = d.Offset(1)
End If
Set c = c.Offset(1)
Loop
Feuil1.Range("Z:AA").Clear
Feuil2.Range("E:E").Clear
End Sub

que faut-il modifier?
merci
urbanito1
 

Pièces jointes

  • urbanito1 softmama 12 3 2012.xlsm
    31.4 KB · Affichages: 39
  • urbanito1 softmama 12 3 2012.xlsm
    31.4 KB · Affichages: 39
  • urbanito1 softmama 12 3 2012.xlsm
    31.4 KB · Affichages: 40

Softmama

XLDnaute Accro
Re : CODE MACRO A MODIFIER ( suite d'un post du 9 mars )

Bonjour urbanito1,

En rajoutant un paramètre, cela devrait donner ceci:

VB:
Sub gogogo()
Dim c As Range, d As Range, derL As Long
derL = Range("A2").End(xlDown).Row
Range("Z2:Z" & derL).FormulaR1C1 = "=RC1&RC2&RC23"
With Range("AA2:AA" & derL)
  .FormulaR1C1 = "=IF(COUNTIF(RC[-1]:R" & derL & "C[-1],RC[-1])=1,SUMPRODUCT((R2C[-1]:R" & derL & "C[-1]=RC[-1])*R2C10:R" & derL & "C10),"""")"
  .Value = .Value
End With
Set d = Feuil2.Range("E2")
For Each c In Range("AA2:AA" & derL).SpecialCells(xlCellTypeConstants, 1)
  If IsError(Application.Match(c, Feuil2.Range("E2:E" & derL), 0)) Then
    d = c.Offset(, -1)
    Feuil2.Cells(d.Row, 1) = Cells(c.Row, 1)
    Feuil2.Cells(d.Row, 2) = Cells(c.Row, 2)
    d.Offset(, -2) = c
    Feuil2.Cells(d.Row, 4) = Cells(c.Row, "W")
    Set d = d.Offset(1)
  End If
Next c
Feuil1.Range("Z:AA").Clear
Feuil2.Range("E:E").Clear
End Sub

A noter que cette macro est nettement mieux optimisée que la précédente même si la formule est nettement plus complexe. Sur 100.000 lignes, le gain de temps doit être assez significatif, voire bluffant (à tester).

EDIT : je viens de tester à moins de 0.02s sur ton exemple de 94 lignes contre plus de 0.06s avec la première macro.
 

Pièces jointes

  • urbanito.xls
    69.5 KB · Affichages: 44
  • urbanito.xls
    69.5 KB · Affichages: 40
  • urbanito.xls
    69.5 KB · Affichages: 44
Dernière édition:

urbanito1

XLDnaute Occasionnel
Re : CODE MACRO A MODIFIER ( suite d'un post du 9 mars )

Helo Softmama
j'ai l'impression qu'il se plante sur la fin du processus

je relancé ce soir tranquillement

étapes : recopie cellules +- 1/4 d'heure
21h11 calcul
21h17 33% processeur
21h19 44% processeur
21h22 64% processeur
21h24 96 % processeur
21h26 100% processeur
puis recopie des cellules

21h28 pas de réponse
21h29 recopie des cellules
21h30 pas de réponse
21h31 recopie des cellules
on dirait qu'il tourne en boucle sur la fin...j'ai 74511 lignes

n'est ce pas de trop?

merci à toit en tout cas
urbanito

je vais faire un essai avec 20000 lignes
 

urbanito1

XLDnaute Occasionnel
Re : CODE MACRO A MODIFIER ( suite d'un post du 9 mars )

Softmama

avec 20 000 lignes, à première vue, c'est super

je découperai le tableau en plusieurs parties

un super cordial merci

à bientôt pour d'autres questions

urbanito1
 

Softmama

XLDnaute Accro
Re : CODE MACRO A MODIFIER ( suite d'un post du 9 mars )

Re,

Qu'est-ce que tu entends par recopie des cellules ?
Cette macro devrait pourtant être moins gourmande en ressources que la précédente...
Je me demande ce qui le fait planter ainsi... essaie peut-être de remplacer :
VB:
For Each c In Range("AA2:AA" & derL).SpecialCells(xlCellTypeConstants, 1)
'... suite du code ...
Next c

par
VB:
set c=Range("AA1")
do
  set c= iif (c.offset(1) <> "", c.offset(1), c.End(xldown))
  '... suite du code ...
Loop while c.end(xldown).row < activesheet.rows.count

Il est possible que le specialcells sur 72.000 lignes soit très vorace.
 

urbanito1

XLDnaute Occasionnel
Re : CODE MACRO A MODIFIER ( suite d'un post du 9 mars )

je t'ai fait un print écran

en bas à droite : recopie des cellules

il met des info dans la colonne AA et Z avant de les transférer vers la feuille 1 je suppose

je ferai un test demain

encore merci
c'est très instructif
urbanito
 

Pièces jointes

  • softmama1gif.jpg
    softmama1gif.jpg
    78 KB · Affichages: 63

Softmama

XLDnaute Accro
Re : CODE MACRO A MODIFIER ( suite d'un post du 9 mars )

Re,

Un dernier truc,

Si y a quelques formules dans la feuille ou des évènements, un
Code:
Application.Calculation = xlCalculationManual
Application.Enableevents = False
en début de macro et un
Code:
Application.Calculation = xlCalculationAutomatic
Application.Enableevents = True
en fin peuvent beaucoup aider aussi.
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 493
Messages
2 088 956
Membres
103 990
dernier inscrit
lamiadebz