OVH Cloud OVH Cloud

optimiser une macro

26 réponses
Avatar
ptck
bonsoir

Dans le fichier joint j'ai une macro qui fait le total par nom et rubrique
qui marche
mais elle est un peu longue. Débutant en macro, je pense qu'elle n'est pas
efficace
peut elle être améliorée?
Merci de votre aide
ptck


http://www.cijoint.fr/cjlink.php?file=cj200906/cijJ3Zrdf9.xls

10 réponses

1 2 3
Avatar
ptck
oui le fichier que j'ai envoyé est bon
mais c'est mon fichier original avec les vrais noms qui est faux
il doir avoir qq chose dans les noms un espace par ex ??
ptck

"MichDenis" a écrit dans le message de news:
u$
Je viens de vérifier un à un les 21 totaux du fichier original que tu as
publié avec les
21 totaux résultant de la procédure, et ces derniers sont les mêmes !

http://cjoint.com/?gnmRsL2tIu



"MichDenis" a écrit dans le message de groupe de
discussion :

Si cela peut t'aider, tu peux inhiber les deux lignes de code de ce type
dans la procédure
:
.Value = .Value
en plaçant une apostrophe en début de la ligne.
Le tableau des données contiendra toutes les formules
avant de les faires disparaître pour n'afficher le résultat.



"ptck" a écrit dans le message de groupe de
discussion :
u5QdX$
Merci encore
mais la macro de MichDenis me fait des totaux erronés sur certain nom
dans l'exemple que j'ai envoyé çà marche mais avec mon tableau initial
certain noms sont erronés
je cherche!!

ptck

"garnote" a écrit dans le message de news:

Et si tu me permets :

Sub Recap2()
Dim LastCol, LastRow, SourceAdresse
Dim F1 As Worksheet, F2 As Worksheet
Set F1 = Sheets("récap global")
Set F2 = Sheets("récap")
With F1
.Activate
.Range("A1").CurrentRegion.ClearContents
SourceAdresse = F2.Name & "!" & _
F2.Range("A1").CurrentRegion. _
Address(ReferenceStyle:=xlR1C1)
.Range("A1").Consolidate Sources:= _
SourceAdresse, Function:=xlSum, _
TopRow:=True, LeftColumn:=True, CreateLinks:úlse
LastCol = .Range("A1"). _
CurrentRegion.Columns.Count
LastRow = .Range("A1"). _
CurrentRegion.Rows.Count
.Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).FormulaR1C1 = _
"=SUM(RC[-" & (LastCol - 1) & "]:RC[-1])"
.Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).Copy
.Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).PasteSpecial Paste:=xlPasteValues
.Cells(1, LastCol).Value = "Total"
End With
Application.CutCopyMode = False
End Sub

Serge



"Charabeuh" a écrit dans le message de news:
%
Bonjour,

Une autre piste:

Sub Recap2()
Dim LastCol, LastRow, SourceAdresse

Sheets("récap global").Range("A1").CurrentRegion.ClearContents

SourceAdresse = Sheets("récap").Name & "!" & _
Sheets("récap").Range("A1").CurrentRegion. _
Address(ReferenceStyle:=xlR1C1)

Sheets("récap global").Range("A1").Consolidate Sources:= _
SourceAdresse, Function:=xlSum, _
TopRow:=True, LeftColumn:=True, CreateLinks:úlse

LastCol = Sheets("récap global").Range("A1"). _
CurrentRegion.Columns.Count
LastRow = Sheets("récap global").Range("A1"). _
CurrentRegion.Rows.Count

Sheets("récap global").Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).FormulaR1C1 = _
"=SUM(RC[-" & (LastCol - 1) & "]:RC[-1])"
Sheets("récap global").Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).Copy
Sheets("récap global").Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).PasteSpecial Paste:=xlPasteValues

Sheets("récap global").Cells(1, LastCol).Value = "Total"

Application.CutCopyMode = False
End Sub






"ptck" a écrit dans le message de
news:




bonsoir

Dans le fichier joint j'ai une macro qui fait le total par nom et
rubrique qui marche
mais elle est un peu longue. Débutant en macro, je pense qu'elle n'est
pas efficace
peut elle être améliorée?
Merci de votre aide
ptck


http://www.cijoint.fr/cjlink.php?file=cj200906/cijJ3Zrdf9.xls














Avatar
ptck
Rebonjour MichDenis

j'ai regardé en annulant ".value" la formule fait reférence au nom de la
plage récap et pas
au nom de la feuille récap global
"SOMMEPROD((récap!$A$2:$A$215=récap!$A10)*(récap!B$2:B$215))
alors que çà devait être çà

SOMMEPROD((récap!$A$2:$A$215=!$A10)*(récap!B$2:B$215))

si tu classes l'onglet envoyé par noms tu verras l'erreur
on pourra dire que ce jour j'ai appris des choses ::)
ptck

"ptck" a écrit dans le message de news:

oui le fichier que j'ai envoyé est bon
mais c'est mon fichier original avec les vrais noms qui est faux
il doir avoir qq chose dans les noms un espace par ex ??
ptck

"MichDenis" a écrit dans le message de news:
u$
Je viens de vérifier un à un les 21 totaux du fichier original que tu as
publié avec les
21 totaux résultant de la procédure, et ces derniers sont les mêmes !

http://cjoint.com/?gnmRsL2tIu



"MichDenis" a écrit dans le message de groupe de
discussion :

Si cela peut t'aider, tu peux inhiber les deux lignes de code de ce type
dans la procédure
:
.Value = .Value
en plaçant une apostrophe en début de la ligne.
Le tableau des données contiendra toutes les formules
avant de les faires disparaître pour n'afficher le résultat.



"ptck" a écrit dans le message de groupe de
discussion :
u5QdX$
Merci encore
mais la macro de MichDenis me fait des totaux erronés sur certain nom
dans l'exemple que j'ai envoyé çà marche mais avec mon tableau initial
certain noms sont erronés
je cherche!!

ptck

"garnote" a écrit dans le message de news:

Et si tu me permets :

Sub Recap2()
Dim LastCol, LastRow, SourceAdresse
Dim F1 As Worksheet, F2 As Worksheet
Set F1 = Sheets("récap global")
Set F2 = Sheets("récap")
With F1
.Activate
.Range("A1").CurrentRegion.ClearContents
SourceAdresse = F2.Name & "!" & _
F2.Range("A1").CurrentRegion. _
Address(ReferenceStyle:=xlR1C1)
.Range("A1").Consolidate Sources:= _
SourceAdresse, Function:=xlSum, _
TopRow:=True, LeftColumn:=True, CreateLinks:úlse
LastCol = .Range("A1"). _
CurrentRegion.Columns.Count
LastRow = .Range("A1"). _
CurrentRegion.Rows.Count
.Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).FormulaR1C1 = _
"=SUM(RC[-" & (LastCol - 1) & "]:RC[-1])"
.Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).Copy
.Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).PasteSpecial Paste:=xlPasteValues
.Cells(1, LastCol).Value = "Total"
End With
Application.CutCopyMode = False
End Sub

Serge



"Charabeuh" a écrit dans le message de news:
%
Bonjour,

Une autre piste:

Sub Recap2()
Dim LastCol, LastRow, SourceAdresse

Sheets("récap global").Range("A1").CurrentRegion.ClearContents

SourceAdresse = Sheets("récap").Name & "!" & _
Sheets("récap").Range("A1").CurrentRegion. _
Address(ReferenceStyle:=xlR1C1)

Sheets("récap global").Range("A1").Consolidate Sources:= _
SourceAdresse, Function:=xlSum, _
TopRow:=True, LeftColumn:=True, CreateLinks:úlse

LastCol = Sheets("récap global").Range("A1"). _
CurrentRegion.Columns.Count
LastRow = Sheets("récap global").Range("A1"). _
CurrentRegion.Rows.Count

Sheets("récap global").Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).FormulaR1C1 = _
"=SUM(RC[-" & (LastCol - 1) & "]:RC[-1])"
Sheets("récap global").Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).Copy
Sheets("récap global").Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).PasteSpecial Paste:=xlPasteValues

Sheets("récap global").Cells(1, LastCol).Value = "Total"

Application.CutCopyMode = False
End Sub






"ptck" a écrit dans le message de
news:




bonsoir

Dans le fichier joint j'ai une macro qui fait le total par nom et
rubrique qui marche
mais elle est un peu longue. Débutant en macro, je pense qu'elle n'est
pas efficace
peut elle être améliorée?
Merci de votre aide
ptck


http://www.cijoint.fr/cjlink.php?file=cj200906/cijJ3Zrdf9.xls



















Avatar
MichDenis
Je ne vois pas en quoi le fait de modifier l'ordre des feuilles
cela modifierais la formule ! Je l'ai fait sur le fichier publié et
je n'observe aucune différence.

M'enfin, si tu as trouvé où le bât blesse dans ton fichier original
c'est l'essentiel.




"ptck" a écrit dans le message de groupe de discussion :
#
Rebonjour MichDenis

j'ai regardé en annulant ".value" la formule fait reférence au nom de la
plage récap et pas
au nom de la feuille récap global
"SOMMEPROD((récap!$A$2:$A$215=récap!$A10)*(récap!B$2:B$215))
alors que çà devait être çà

SOMMEPROD((récap!$A$2:$A$215=!$A10)*(récap!B$2:B$215))

si tu classes l'onglet envoyé par noms tu verras l'erreur
on pourra dire que ce jour j'ai appris des choses ::)
ptck

"ptck" a écrit dans le message de news:

oui le fichier que j'ai envoyé est bon
mais c'est mon fichier original avec les vrais noms qui est faux
il doir avoir qq chose dans les noms un espace par ex ??
ptck

"MichDenis" a écrit dans le message de news:
u$
Je viens de vérifier un à un les 21 totaux du fichier original que tu as
publié avec les
21 totaux résultant de la procédure, et ces derniers sont les mêmes !

http://cjoint.com/?gnmRsL2tIu



"MichDenis" a écrit dans le message de groupe de
discussion :

Si cela peut t'aider, tu peux inhiber les deux lignes de code de ce type
dans la procédure
:
.Value = .Value
en plaçant une apostrophe en début de la ligne.
Le tableau des données contiendra toutes les formules
avant de les faires disparaître pour n'afficher le résultat.



"ptck" a écrit dans le message de groupe de
discussion :
u5QdX$
Merci encore
mais la macro de MichDenis me fait des totaux erronés sur certain nom
dans l'exemple que j'ai envoyé çà marche mais avec mon tableau initial
certain noms sont erronés
je cherche!!

ptck

"garnote" a écrit dans le message de news:

Et si tu me permets :

Sub Recap2()
Dim LastCol, LastRow, SourceAdresse
Dim F1 As Worksheet, F2 As Worksheet
Set F1 = Sheets("récap global")
Set F2 = Sheets("récap")
With F1
.Activate
.Range("A1").CurrentRegion.ClearContents
SourceAdresse = F2.Name & "!" & _
F2.Range("A1").CurrentRegion. _
Address(ReferenceStyle:=xlR1C1)
.Range("A1").Consolidate Sources:= _
SourceAdresse, Function:=xlSum, _
TopRow:=True, LeftColumn:=True, CreateLinks:úlse
LastCol = .Range("A1"). _
CurrentRegion.Columns.Count
LastRow = .Range("A1"). _
CurrentRegion.Rows.Count
.Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).FormulaR1C1 = _
"=SUM(RC[-" & (LastCol - 1) & "]:RC[-1])"
.Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).Copy
.Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).PasteSpecial Paste:=xlPasteValues
.Cells(1, LastCol).Value = "Total"
End With
Application.CutCopyMode = False
End Sub

Serge



"Charabeuh" a écrit dans le message de news:
%
Bonjour,

Une autre piste:

Sub Recap2()
Dim LastCol, LastRow, SourceAdresse

Sheets("récap global").Range("A1").CurrentRegion.ClearContents

SourceAdresse = Sheets("récap").Name & "!" & _
Sheets("récap").Range("A1").CurrentRegion. _
Address(ReferenceStyle:=xlR1C1)

Sheets("récap global").Range("A1").Consolidate Sources:= _
SourceAdresse, Function:=xlSum, _
TopRow:=True, LeftColumn:=True, CreateLinks:úlse

LastCol = Sheets("récap global").Range("A1"). _
CurrentRegion.Columns.Count
LastRow = Sheets("récap global").Range("A1"). _
CurrentRegion.Rows.Count

Sheets("récap global").Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).FormulaR1C1 = _
"=SUM(RC[-" & (LastCol - 1) & "]:RC[-1])"
Sheets("récap global").Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).Copy
Sheets("récap global").Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).PasteSpecial Paste:=xlPasteValues

Sheets("récap global").Cells(1, LastCol).Value = "Total"

Application.CutCopyMode = False
End Sub






"ptck" a écrit dans le message de
news:




bonsoir

Dans le fichier joint j'ai une macro qui fait le total par nom et
rubrique qui marche
mais elle est un peu longue. Débutant en macro, je pense qu'elle n'est
pas efficace
peut elle être améliorée?
Merci de votre aide
ptck


http://www.cijoint.fr/cjlink.php?file=cj200906/cijJ3Zrdf9.xls



















Avatar
ptck
MichDenis
si tu classes les noms de la feuille "récap", les donnée dans la feuille
"récap global" pour les noms: nom1 à nom19
sont identiques
car la macro va chercher les noms de la "récap" et non pas les noms de la "
récap global"
dans les formule que génère la macro il y a : =récap!$A2 alors que devrait
être =récap global$A2

SOMMEPROD((récap!$A$2:$A$215=récap!$A2)*(récap!B$2:B$215))
j'essaie de modifier la macro !!
ptck


"MichDenis" a écrit dans le message de news:

Je ne vois pas en quoi le fait de modifier l'ordre des feuilles
cela modifierais la formule ! Je l'ai fait sur le fichier publié et
je n'observe aucune différence.

M'enfin, si tu as trouvé où le bât blesse dans ton fichier original
c'est l'essentiel.




"ptck" a écrit dans le message de groupe de
discussion :
#
Rebonjour MichDenis

j'ai regardé en annulant ".value" la formule fait reférence au nom de la
plage récap et pas
au nom de la feuille récap global
"SOMMEPROD((récap!$A$2:$A$215=récap!$A10)*(récap!B$2:B$215))
alors que çà devait être çà

SOMMEPROD((récap!$A$2:$A$215=!$A10)*(récap!B$2:B$215))

si tu classes l'onglet envoyé par noms tu verras l'erreur
on pourra dire que ce jour j'ai appris des choses ::)
ptck

"ptck" a écrit dans le message de news:

oui le fichier que j'ai envoyé est bon
mais c'est mon fichier original avec les vrais noms qui est faux
il doir avoir qq chose dans les noms un espace par ex ??
ptck

"MichDenis" a écrit dans le message de news:
u$
Je viens de vérifier un à un les 21 totaux du fichier original que tu as
publié avec les
21 totaux résultant de la procédure, et ces derniers sont les mêmes !

http://cjoint.com/?gnmRsL2tIu



"MichDenis" a écrit dans le message de groupe de
discussion :

Si cela peut t'aider, tu peux inhiber les deux lignes de code de ce type
dans la procédure
:
.Value = .Value
en plaçant une apostrophe en début de la ligne.
Le tableau des données contiendra toutes les formules
avant de les faires disparaître pour n'afficher le résultat.



"ptck" a écrit dans le message de groupe de
discussion :
u5QdX$
Merci encore
mais la macro de MichDenis me fait des totaux erronés sur certain nom
dans l'exemple que j'ai envoyé çà marche mais avec mon tableau initial
certain noms sont erronés
je cherche!!

ptck

"garnote" a écrit dans le message de news:

Et si tu me permets :

Sub Recap2()
Dim LastCol, LastRow, SourceAdresse
Dim F1 As Worksheet, F2 As Worksheet
Set F1 = Sheets("récap global")
Set F2 = Sheets("récap")
With F1
.Activate
.Range("A1").CurrentRegion.ClearContents
SourceAdresse = F2.Name & "!" & _
F2.Range("A1").CurrentRegion. _
Address(ReferenceStyle:=xlR1C1)
.Range("A1").Consolidate Sources:= _
SourceAdresse, Function:=xlSum, _
TopRow:=True, LeftColumn:=True, CreateLinks:úlse
LastCol = .Range("A1"). _
CurrentRegion.Columns.Count
LastRow = .Range("A1"). _
CurrentRegion.Rows.Count
.Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).FormulaR1C1 = _
"=SUM(RC[-" & (LastCol - 1) & "]:RC[-1])"
.Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).Copy
.Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).PasteSpecial Paste:=xlPasteValues
.Cells(1, LastCol).Value = "Total"
End With
Application.CutCopyMode = False
End Sub

Serge



"Charabeuh" a écrit dans le message de news:
%
Bonjour,

Une autre piste:

Sub Recap2()
Dim LastCol, LastRow, SourceAdresse

Sheets("récap global").Range("A1").CurrentRegion.ClearContents

SourceAdresse = Sheets("récap").Name & "!" & _
Sheets("récap").Range("A1").CurrentRegion. _
Address(ReferenceStyle:=xlR1C1)

Sheets("récap global").Range("A1").Consolidate Sources:= _
SourceAdresse, Function:=xlSum, _
TopRow:=True, LeftColumn:=True, CreateLinks:úlse

LastCol = Sheets("récap global").Range("A1"). _
CurrentRegion.Columns.Count
LastRow = Sheets("récap global").Range("A1"). _
CurrentRegion.Rows.Count

Sheets("récap global").Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).FormulaR1C1 = _
"=SUM(RC[-" & (LastCol - 1) & "]:RC[-1])"
Sheets("récap global").Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).Copy
Sheets("récap global").Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).PasteSpecial Paste:=xlPasteValues

Sheets("récap global").Cells(1, LastCol).Value = "Total"

Application.CutCopyMode = False
End Sub






"ptck" a écrit dans le message de
news:




bonsoir

Dans le fichier joint j'ai une macro qui fait le total par nom et
rubrique qui marche
mais elle est un peu longue. Débutant en macro, je pense qu'elle
n'est
pas efficace
peut elle être améliorée?
Merci de votre aide
ptck


http://www.cijoint.fr/cjlink.php?file=cj200906/cijJ3Zrdf9.xls






















Avatar
MichDenis
Je n'ai rien compris... mais pour obtenir ce que tu veux,

M = "=sumproduct((" & Rg1(1).Parent.Name & "!" & _
Rg1.Columns(Range("A1").Column).Address(1, 1) & _
"=" & Rg1(1).Parent.Name & _
"!" & Rg(1).Address(0, 1) & ")*(" & Rg1(1).Parent.Name & _
"!" & Rg1.Columns(Range("B1").Column).Address(1, 0) & "))"

Tu n'as qu'à modifier la 3 ième ligne comme ceci :

M = "=sumproduct((" & Rg1(1).Parent.Name & "!" & _
Rg1.Columns(Range("A1").Column).Address(1, 1) & _
"=" & Rg(1).Parent.Name & _
"!" & Rg(1).Address(0, 1) & ")*(" & Rg1(1).Parent.Name & _
"!" & Rg1.Columns(Range("B1").Column).Address(1, 0) & "))"

C'était mon dernier message pour ce fil.



"ptck" a écrit dans le message de groupe de discussion :

MichDenis
si tu classes les noms de la feuille "récap", les donnée dans la feuille
"récap global" pour les noms: nom1 à nom19
sont identiques
car la macro va chercher les noms de la "récap" et non pas les noms de la "
récap global"
dans les formule que génère la macro il y a : =récap!$A2 alors que devrait
être =récap global$A2

SOMMEPROD((récap!$A$2:$A$215=récap!$A2)*(récap!B$2:B$215))
j'essaie de modifier la macro !!
ptck


"MichDenis" a écrit dans le message de news:

Je ne vois pas en quoi le fait de modifier l'ordre des feuilles
cela modifierais la formule ! Je l'ai fait sur le fichier publié et
je n'observe aucune différence.

M'enfin, si tu as trouvé où le bât blesse dans ton fichier original
c'est l'essentiel.




"ptck" a écrit dans le message de groupe de
discussion :
#
Rebonjour MichDenis

j'ai regardé en annulant ".value" la formule fait reférence au nom de la
plage récap et pas
au nom de la feuille récap global
"SOMMEPROD((récap!$A$2:$A$215=récap!$A10)*(récap!B$2:B$215))
alors que çà devait être çà

SOMMEPROD((récap!$A$2:$A$215=!$A10)*(récap!B$2:B$215))

si tu classes l'onglet envoyé par noms tu verras l'erreur
on pourra dire que ce jour j'ai appris des choses ::)
ptck

"ptck" a écrit dans le message de news:

oui le fichier que j'ai envoyé est bon
mais c'est mon fichier original avec les vrais noms qui est faux
il doir avoir qq chose dans les noms un espace par ex ??
ptck

"MichDenis" a écrit dans le message de news:
u$
Je viens de vérifier un à un les 21 totaux du fichier original que tu as
publié avec les
21 totaux résultant de la procédure, et ces derniers sont les mêmes !

http://cjoint.com/?gnmRsL2tIu



"MichDenis" a écrit dans le message de groupe de
discussion :

Si cela peut t'aider, tu peux inhiber les deux lignes de code de ce type
dans la procédure
:
.Value = .Value
en plaçant une apostrophe en début de la ligne.
Le tableau des données contiendra toutes les formules
avant de les faires disparaître pour n'afficher le résultat.



"ptck" a écrit dans le message de groupe de
discussion :
u5QdX$
Merci encore
mais la macro de MichDenis me fait des totaux erronés sur certain nom
dans l'exemple que j'ai envoyé çà marche mais avec mon tableau initial
certain noms sont erronés
je cherche!!

ptck

"garnote" a écrit dans le message de news:

Et si tu me permets :

Sub Recap2()
Dim LastCol, LastRow, SourceAdresse
Dim F1 As Worksheet, F2 As Worksheet
Set F1 = Sheets("récap global")
Set F2 = Sheets("récap")
With F1
.Activate
.Range("A1").CurrentRegion.ClearContents
SourceAdresse = F2.Name & "!" & _
F2.Range("A1").CurrentRegion. _
Address(ReferenceStyle:=xlR1C1)
.Range("A1").Consolidate Sources:= _
SourceAdresse, Function:=xlSum, _
TopRow:=True, LeftColumn:=True, CreateLinks:úlse
LastCol = .Range("A1"). _
CurrentRegion.Columns.Count
LastRow = .Range("A1"). _
CurrentRegion.Rows.Count
.Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).FormulaR1C1 = _
"=SUM(RC[-" & (LastCol - 1) & "]:RC[-1])"
.Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).Copy
.Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).PasteSpecial Paste:=xlPasteValues
.Cells(1, LastCol).Value = "Total"
End With
Application.CutCopyMode = False
End Sub

Serge



"Charabeuh" a écrit dans le message de news:
%
Bonjour,

Une autre piste:

Sub Recap2()
Dim LastCol, LastRow, SourceAdresse

Sheets("récap global").Range("A1").CurrentRegion.ClearContents

SourceAdresse = Sheets("récap").Name & "!" & _
Sheets("récap").Range("A1").CurrentRegion. _
Address(ReferenceStyle:=xlR1C1)

Sheets("récap global").Range("A1").Consolidate Sources:= _
SourceAdresse, Function:=xlSum, _
TopRow:=True, LeftColumn:=True, CreateLinks:úlse

LastCol = Sheets("récap global").Range("A1"). _
CurrentRegion.Columns.Count
LastRow = Sheets("récap global").Range("A1"). _
CurrentRegion.Rows.Count

Sheets("récap global").Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).FormulaR1C1 = _
"=SUM(RC[-" & (LastCol - 1) & "]:RC[-1])"
Sheets("récap global").Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).Copy
Sheets("récap global").Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).PasteSpecial Paste:=xlPasteValues

Sheets("récap global").Cells(1, LastCol).Value = "Total"

Application.CutCopyMode = False
End Sub






"ptck" a écrit dans le message de
news:




bonsoir

Dans le fichier joint j'ai une macro qui fait le total par nom et
rubrique qui marche
mais elle est un peu longue. Débutant en macro, je pense qu'elle
n'est
pas efficace
peut elle être améliorée?
Merci de votre aide
ptck


http://www.cijoint.fr/cjlink.php?file=cj200906/cijJ3Zrdf9.xls






















Avatar
garnote
J'ai voulu en avoir le coeur avec ma formule erronnée :
Si on sélectionne B2:P21 et qu'on entre cette formule
=SOMMEPROD((récap!$A$2:$A$500=$A2)*récap!B$2:B$500)
en la validant par Ctrl+Entrée, on obtient les mêmes résultats qu'avec
les macros. J'ai mis 500 en supposant qu'on ajoute éventuellement
des données. Ne reste plus qu'à ajouter cette formule en Q2 :
SOMME(B2:P2) et la recopier jusqu'à Qx.


Serge

"garnote" a écrit dans le message de news:

Ave,

Oublie ça. Ma formule ne donne même pas le bon résultat.
J'ai simplifié ta macro mais la rapidité de la macro de Denis
est tellement foudroyante que je ne publie pas mon timide essai :-)

Serge


"ptck" a écrit dans le message de news:

bonsoir
je voulais savoir si on pouvait optimiser le code
merci


"garnote" a écrit dans le message de news:

Bonsoir,

Essaie ces formules et dis-moi si tu obtiens le résultat attendu.

Sur la feuille récap global :
1) Sélectionne B2:P21, entre cette formule
=SOMMEPROD((récap!$A$2:$A$215=$A2)*(récap!B2:B215))
et valide par Ctrl+Entrée.

2) Entre cette formule =SOMME(B2:P2) en Q2 et recopie jusqu'en Q21.

Serge


"ptck" a écrit dans le message de news:





bonsoir

Dans le fichier joint j'ai une macro qui fait le total par nom et
rubrique qui marche
mais elle est un peu longue. Débutant en macro, je pense qu'elle n'est
pas efficace
peut elle être améliorée?
Merci de votre aide
ptck


http://www.cijoint.fr/cjlink.php?file=cj200906/cijJ3Zrdf9.xls
















Avatar
garnote
Ave,

Que pensez-vous de cette approche ?

Sub Test()
Application.ScreenUpdating = False
Dim F1 As Worksheet, F2 As Worksheet
Set F1 = Sheets("récap global")
Set F2 = Sheets("récap")
n1 = F1.Range("A2").End(xlDown).Row
n2 = F2.Range("A2").End(xlDown).Row
Set r = F1.Range("B2:P" & n1)
r.Formula = "=SUMPRODUCT((récap!$A$2:$A$500=$A2)*récap!B$2:B$500)"
r.Value = r.Value
Set t = F1.Range("Q2:Q" & n1)
t.FormulaR1C1 = "=SUM(RC[-15]:RC[-2])"
t.Value = t.Value
Application.ScreenUpdating = True
End Sub

ET

Comment faire pour remplacer le 500 de la ligne :
r.Formula = "=SUMPRODUCT((récap!$A$2:$A$500=$A2)*récap!B$2:B$500)"
par le n2 calculé sur cette ligne :
n2 = F2.Range("A2").End(xlDown).Row

Serge
Avatar
ptck
Pour cloturerce fil
j'ai modifié comme ceci


M = "=sumproduct((" & Rg1(1).Parent.Name & "!" & _
Rg1.Columns(Range("A1").Column).Address(1, 1) & _
"=" & Rg(1).Address(0, 1) & ")*(" & Rg1(1).Parent.Name & _
"!" & Rg1.Columns(Range("B1").Column).Address(1, 0) & "))"

ptck


"MichDenis" a écrit dans le message de news:

Je n'ai rien compris... mais pour obtenir ce que tu veux,

M = "=sumproduct((" & Rg1(1).Parent.Name & "!" & _
Rg1.Columns(Range("A1").Column).Address(1, 1) & _
"=" & Rg1(1).Parent.Name & _
"!" & Rg(1).Address(0, 1) & ")*(" & Rg1(1).Parent.Name & _
"!" & Rg1.Columns(Range("B1").Column).Address(1, 0) & "))"

Tu n'as qu'à modifier la 3 ième ligne comme ceci :

M = "=sumproduct((" & Rg1(1).Parent.Name & "!" & _
Rg1.Columns(Range("A1").Column).Address(1, 1) & _
"=" & Rg(1).Parent.Name & _
"!" & Rg(1).Address(0, 1) & ")*(" & Rg1(1).Parent.Name & _
"!" & Rg1.Columns(Range("B1").Column).Address(1, 0) & "))"

C'était mon dernier message pour ce fil.



"ptck" a écrit dans le message de groupe de
discussion :

MichDenis
si tu classes les noms de la feuille "récap", les donnée dans la feuille
"récap global" pour les noms: nom1 à nom19
sont identiques
car la macro va chercher les noms de la "récap" et non pas les noms de la
"
récap global"
dans les formule que génère la macro il y a : =récap!$A2 alors que devrait
être =récap global$A2

SOMMEPROD((récap!$A$2:$A$215=récap!$A2)*(récap!B$2:B$215))
j'essaie de modifier la macro !!
ptck


"MichDenis" a écrit dans le message de news:

Je ne vois pas en quoi le fait de modifier l'ordre des feuilles
cela modifierais la formule ! Je l'ai fait sur le fichier publié et
je n'observe aucune différence.

M'enfin, si tu as trouvé où le bât blesse dans ton fichier original
c'est l'essentiel.




"ptck" a écrit dans le message de groupe de
discussion :
#
Rebonjour MichDenis

j'ai regardé en annulant ".value" la formule fait reférence au nom de la
plage récap et pas
au nom de la feuille récap global
"SOMMEPROD((récap!$A$2:$A$215=récap!$A10)*(récap!B$2:B$215))
alors que çà devait être çà

SOMMEPROD((récap!$A$2:$A$215=!$A10)*(récap!B$2:B$215))

si tu classes l'onglet envoyé par noms tu verras l'erreur
on pourra dire que ce jour j'ai appris des choses ::)
ptck

"ptck" a écrit dans le message de news:

oui le fichier que j'ai envoyé est bon
mais c'est mon fichier original avec les vrais noms qui est faux
il doir avoir qq chose dans les noms un espace par ex ??
ptck

"MichDenis" a écrit dans le message de news:
u$
Je viens de vérifier un à un les 21 totaux du fichier original que tu
as
publié avec les
21 totaux résultant de la procédure, et ces derniers sont les mêmes !

http://cjoint.com/?gnmRsL2tIu



"MichDenis" a écrit dans le message de groupe
de
discussion :

Si cela peut t'aider, tu peux inhiber les deux lignes de code de ce
type
dans la procédure
:
.Value = .Value
en plaçant une apostrophe en début de la ligne.
Le tableau des données contiendra toutes les formules
avant de les faires disparaître pour n'afficher le résultat.



"ptck" a écrit dans le message de groupe de
discussion :
u5QdX$
Merci encore
mais la macro de MichDenis me fait des totaux erronés sur certain nom
dans l'exemple que j'ai envoyé çà marche mais avec mon tableau initial
certain noms sont erronés
je cherche!!

ptck

"garnote" a écrit dans le message de news:

Et si tu me permets :

Sub Recap2()
Dim LastCol, LastRow, SourceAdresse
Dim F1 As Worksheet, F2 As Worksheet
Set F1 = Sheets("récap global")
Set F2 = Sheets("récap")
With F1
.Activate
.Range("A1").CurrentRegion.ClearContents
SourceAdresse = F2.Name & "!" & _
F2.Range("A1").CurrentRegion. _
Address(ReferenceStyle:=xlR1C1)
.Range("A1").Consolidate Sources:= _
SourceAdresse, Function:=xlSum, _
TopRow:=True, LeftColumn:=True, CreateLinks:úlse
LastCol = .Range("A1"). _
CurrentRegion.Columns.Count
LastRow = .Range("A1"). _
CurrentRegion.Rows.Count
.Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).FormulaR1C1 = _
"=SUM(RC[-" & (LastCol - 1) & "]:RC[-1])"
.Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).Copy
.Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).PasteSpecial Paste:=xlPasteValues
.Cells(1, LastCol).Value = "Total"
End With
Application.CutCopyMode = False
End Sub

Serge



"Charabeuh" a écrit dans le message de news:
%
Bonjour,

Une autre piste:

Sub Recap2()
Dim LastCol, LastRow, SourceAdresse

Sheets("récap global").Range("A1").CurrentRegion.ClearContents

SourceAdresse = Sheets("récap").Name & "!" & _
Sheets("récap").Range("A1").CurrentRegion. _
Address(ReferenceStyle:=xlR1C1)

Sheets("récap global").Range("A1").Consolidate Sources:= _
SourceAdresse, Function:=xlSum, _
TopRow:=True, LeftColumn:=True, CreateLinks:úlse

LastCol = Sheets("récap global").Range("A1"). _
CurrentRegion.Columns.Count
LastRow = Sheets("récap global").Range("A1"). _
CurrentRegion.Rows.Count

Sheets("récap global").Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).FormulaR1C1 = _
"=SUM(RC[-" & (LastCol - 1) & "]:RC[-1])"
Sheets("récap global").Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).Copy
Sheets("récap global").Range(Cells(2, LastCol), _
Cells(LastRow, LastCol)).PasteSpecial Paste:=xlPasteValues

Sheets("récap global").Cells(1, LastCol).Value = "Total"

Application.CutCopyMode = False
End Sub






"ptck" a écrit dans le message de
news:




bonsoir

Dans le fichier joint j'ai une macro qui fait le total par nom et
rubrique qui marche
mais elle est un peu longue. Débutant en macro, je pense qu'elle
n'est
pas efficace
peut elle être améliorée?
Merci de votre aide
ptck


http://www.cijoint.fr/cjlink.php?file=cj200906/cijJ3Zrdf9.xls

























Avatar
Charabeuh
Ave à toi aussi,

si on fait,
r.Formula = "=SUMPRODUCT((récap!$A$2:$A$" & n2 & "=$A2)*récap!B$2:B$" &
n2 & ")"

c'est ti qu'ça marcherait ti point ? (je n'ai pas testé)

Pour l'approche:
Je ne vois pas comment cela s'adapte aux données sources (récap) notamment
aux changements de nombres de noms différents;

Mais j'avoue que je n'ai pas creusé 'plus que cela'.

==
En vitesse, les SUMPRODUCT sont plus pénalisants si on augmentent le nombre
d'enregistrement et le nombre de noms différents.

J'ai testé avec 10000 enregistrements et 5000 noms max différents. cela
donne environ :
Nbr Noms # 5000 Nbr Iter. # 1 Nbr Enrgt. # 10000
avec sumproduct ==> 208 s
sans sumproduct ==> 26 s

J'ai testé avec 10000 enregistrements et 500 noms max différents. cela donne
environ :
Nbr Noms # 500 Nbr Iter. # 1 Nbr Enrgt. # 10000
avec sumproduct ==> 22 s
sans sumproduct ==> 3 s

J'ai testé avec 10000 enregistrements et 20 noms max différents. cela donne
environ :
Nbr Noms # 20 Nbr Iter. # 1 Nbr Enrgt. # 10000
avec sumproduct ==> 1 s
sans sumproduct ==> 1 s


Bon! Je vais aller en ville un p'tit peu magasiner comme on dit "outre
atlantique.
(outre atlantique vu du côté Européen bien sûr !)
Char Abeuh





"garnote" a écrit dans le message de
news:
Ave,

Que pensez-vous de cette approche ?

Sub Test()
Application.ScreenUpdating = False
Dim F1 As Worksheet, F2 As Worksheet
Set F1 = Sheets("récap global")
Set F2 = Sheets("récap")
n1 = F1.Range("A2").End(xlDown).Row
n2 = F2.Range("A2").End(xlDown).Row
Set r = F1.Range("B2:P" & n1)
r.Formula = "=SUMPRODUCT((récap!$A$2:$A$500=$A2)*récap!B$2:B$500)"
r.Value = r.Value
Set t = F1.Range("Q2:Q" & n1)
t.FormulaR1C1 = "=SUM(RC[-15]:RC[-2])"
t.Value = t.Value
Application.ScreenUpdating = True
End Sub

ET

Comment faire pour remplacer le 500 de la ligne :
r.Formula = "=SUMPRODUCT((récap!$A$2:$A$500=$A2)*récap!B$2:B$500)"
par le n2 calculé sur cette ligne :
n2 = F2.Range("A2").End(xlDown).Row

Serge



Avatar
garnote
Ave,

Ton n2 convient parfaitement.
Si le coeur t'en dit, pourrais-tu essayer cette macro :

Sub Test()
Application.ScreenUpdating = False
Dim F1 As Worksheet, F2 As Worksheet
Set F1 = Sheets("récap global")
Set F2 = Sheets("récap")
F1.Columns(1).Clear
n = F2.Range("A1").Resize(Cells(1,
1).SpecialCells(xlCellTypeLastCell).Row, 1).Count
F2.Range("a1:a" & n).AdvancedFilter Action:=xlFilterCopy,
CopyToRange:ñ.[a1], Unique:=True
n1 = F1.Range("A2").End(xlDown).Row
n2 = F2.Range("A2").End(xlDown).Row
Set r = F1.Range("B2:P" & n1)
r.Formula = "=SUMPRODUCT((récap!$A$2:$A$" & n2 & "=$A2)*récap!B$2:B$" &
n2 & ")"
r.Value = r.Value
Set t = F1.Range("Q2:Q" & n1)
t.FormulaR1C1 = "=SUM(RC[-15]:RC[-2])"
t.Value = t.Value
Application.ScreenUpdating = True
End Sub

Serge






"Charabeuh" a écrit dans le message de news:

Ave à toi aussi,

si on fait,
r.Formula = "=SUMPRODUCT((récap!$A$2:$A$" & n2 & "=$A2)*récap!B$2:B$" &
n2 & ")"

c'est ti qu'ça marcherait ti point ? (je n'ai pas testé)

Pour l'approche:
Je ne vois pas comment cela s'adapte aux données sources (récap) notamment
aux changements de nombres de noms différents;

Mais j'avoue que je n'ai pas creusé 'plus que cela'.

== >
En vitesse, les SUMPRODUCT sont plus pénalisants si on augmentent le
nombre d'enregistrement et le nombre de noms différents.

J'ai testé avec 10000 enregistrements et 5000 noms max différents. cela
donne environ :
Nbr Noms # 5000 Nbr Iter. # 1 Nbr Enrgt. # 10000
avec sumproduct ==> 208 s
sans sumproduct ==> 26 s

J'ai testé avec 10000 enregistrements et 500 noms max différents. cela
donne environ :
Nbr Noms # 500 Nbr Iter. # 1 Nbr Enrgt. # 10000
avec sumproduct ==> 22 s
sans sumproduct ==> 3 s

J'ai testé avec 10000 enregistrements et 20 noms max différents. cela
donne environ :
Nbr Noms # 20 Nbr Iter. # 1 Nbr Enrgt. # 10000
avec sumproduct ==> 1 s
sans sumproduct ==> 1 s


Bon! Je vais aller en ville un p'tit peu magasiner comme on dit "outre
atlantique.
(outre atlantique vu du côté Européen bien sûr !)
Char Abeuh





"garnote" a écrit dans le message de
news:
Ave,

Que pensez-vous de cette approche ?

Sub Test()
Application.ScreenUpdating = False
Dim F1 As Worksheet, F2 As Worksheet
Set F1 = Sheets("récap global")
Set F2 = Sheets("récap")
n1 = F1.Range("A2").End(xlDown).Row
n2 = F2.Range("A2").End(xlDown).Row
Set r = F1.Range("B2:P" & n1)
r.Formula = "=SUMPRODUCT((récap!$A$2:$A$500=$A2)*récap!B$2:B$500)"
r.Value = r.Value
Set t = F1.Range("Q2:Q" & n1)
t.FormulaR1C1 = "=SUM(RC[-15]:RC[-2])"
t.Value = t.Value
Application.ScreenUpdating = True
End Sub

ET

Comment faire pour remplacer le 500 de la ligne :
r.Formula = "=SUMPRODUCT((récap!$A$2:$A$500=$A2)*récap!B$2:B$500)"
par le n2 calculé sur cette ligne :
n2 = F2.Range("A2").End(xlDown).Row

Serge






1 2 3