OVH Cloud OVH Cloud

Macro lente via enregistreur de macro

8 réponses
Avatar
HUGOBASS
Bonjour à toutes et tous,

Questions également présentes sur d'autres FORUM

A partir d’une extraction d’une base de données (onglets : BA SE, BA FO, BA FA,
BA SA, L, V & R ; colonnes A à AC pour ces 3 derniers cités) j’ai créé par formules des agrégats (onglets : AGR & AGR 2) et ou des résultats de calcul qui se trouvent dans les colonnes AD à AP des feuilles L, V & R. Des formules dont quelques unes reposent sur des plages nommées (certains d’entre vous m’ont d’ailleurs déjà aidé dans leur conception) sont aussi présentes sur toutes le feuilles. Les calculs sont interdépendants et il faut recalculer chaque feuille lors de toutes modifications.

Les résultats sont conformes à ce que j’attend mais la volumétrie du fichier obtenu le rend difficilement exploitable (je suis sur mac et je n’ai que Excel à ma disposition)
Partant de ce constat je cherche à optimiser mon fichier et via l’enregistreur de macro (je ne maitrise pas VBA) j’ai créé des macros qui reprennent l’ensemble des formules de tous les onglets du classeur pour ensuite les coller sur les différentes lignes et colonnes correspondantes. Mais les temps de calculs sont très longs et plantent même souvent au motif mémoire insuffisante.

Mon objectif final étant que tous les calculs s’effectuent au lancement d’une macro et ensuite remplacer ces calculs uniquement par leur valeur dans tous les onglets du classeur via collage spécial par exemple. Je pense aussi qu’il ne devrait y’avoir des calculs que si des données sont présentes sur les lignes des onglets L, V & R (par exemple la macro ne s’exécuterait sur l’onglet L que sur les lignes 2 à 5 (2 à 45709 sur fichier non épuré lien dropbox) et sur l’onglet V des lignes 2 à 3 (2 à 197233 fichier non épuré). Or je colle toutes les formules dans une plage allant de 2 à 340305 (plus dans l’avenir quand la base grandira) sur les onglets L, V & R.

En parcourant les forums, je pense que les lenteurs sont le résultat de mes macro non optimisées (pleins de select par exemple, mettre les plages dans des tableaux intermédiaires de variables temporaires, peut être des boucles). Peut être que mes formules aussi peuvent et devraient être optimisées ?

J’ai atteint la limite de mes compétences c’est pourquoi je vous soumet mon fichier pour aide. Ce n’est bien entendu pas un jeu de données réelles pour la confidentialité.

Vous trouverez une version épuré et une version complète sur ces liens dropbox. Le code macro est dans le classeur.

J’espère être compréhensible, et que vous pourrez m’aider.

Merci à toutes et tous

LIEN EPURE :
https://www.dropbox.com/s/oql7cafbwhurpp7/AGREGAT%20FO.xlsb?dl=0

LIEN COMPLET :
https://www.dropbox.com/s/06r1kn5zi6a5cbw/AGREGAT%20FO%20COMPLET.xlsb.zip?dl=0

8 réponses

Avatar
Jacquouille
Bonjour
Je viens de regarder les macros.
Effectivement, il y a beaucoup de Select.
Sans grandes prétentions de ma part, si tu les supprimais ?

Au lieu de:
Range("B2").Select
Selection.Copy

Essaie de supprimer Select et Selection ---> Range("B2").Copy
-------------------
Pour mon édification personnelle, c'est quoi, ce mot : " Falseü" ?
Application.CutCopyMode = Falseü

Cela me fait penser à un Parisien qui prononce le mot "False" avec son
accent... -))
Merci
Jacques

Jacquouille

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


Bonjour à toutes et tous,

Questions également présentes sur d'autres FORUM

A partir d’une extraction d’une base de données (onglets : BA SE, BA FO, BA
FA,
BA SA, L, V & R ; colonnes A à AC pour ces 3 derniers cités) j’ai créé par
formules des agrégats (onglets : AGR & AGR 2) et ou des résultats de calcul
qui
se trouvent dans les colonnes AD à AP des feuilles L, V & R. Des formules
dont
quelques unes reposent sur des plages nommées (certains d’entre vous m’ont
d’ailleurs déjà aidé dans leur conception) sont aussi présentes sur toutes
le
feuilles. Les calculs sont interdépendants et il faut recalculer chaque
feuille
lors de toutes modifications.

Les résultats sont conformes à ce que j’attend mais la volumétrie du fichier
obtenu le rend difficilement exploitable (je suis sur mac et je n’ai que
Excel à
ma disposition)
Partant de ce constat je cherche à optimiser mon fichier et via l’enregistreur
de macro (je ne maitrise pas VBA) j’ai créé des macros qui reprennent l’ensemble
des formules de tous les onglets du classeur pour ensuite les coller sur les
différentes lignes et colonnes correspondantes. Mais les temps de calculs
sont
très longs et plantent même souvent au motif mémoire insuffisante.

Mon objectif final étant que tous les calculs s’effectuent au lancement d’une
macro et ensuite remplacer ces calculs uniquement par leur valeur dans tous
les
onglets du classeur via collage spécial par exemple. Je pense aussi qu’il ne
devrait y’avoir des calculs que si des données sont présentes sur les lignes
des
onglets L, V & R (par exemple la macro ne s’exécuterait sur l’onglet L que
sur
les lignes 2 à 5 (2 à 45709 sur fichier non épuré lien dropbox) et sur l’onglet
V des lignes 2 à 3 (2 à 197233 fichier non épuré). Or je colle toutes les
formules dans une plage allant de 2 à 340305 (plus dans l’avenir quand la
base
grandira) sur les onglets L, V & R.

En parcourant les forums, je pense que les lenteurs sont le résultat de mes
macro non optimisées (pleins de select par exemple, mettre les plages dans
des
tableaux intermédiaires de variables temporaires, peut être des boucles).
Peut
être que mes formules aussi peuvent et devraient être optimisées ?

J’ai atteint la limite de mes compétences c’est pourquoi je vous soumet mon
fichier pour aide. Ce n’est bien entendu pas un jeu de données réelles pour
la
confidentialité.

Vous trouverez une version épuré et une version complète sur ces liens
dropbox.
Le code macro est dans le classeur.

J’espère être compréhensible, et que vous pourrez m’aider.

Merci à toutes et tous

LIEN EPURE :
https://www.dropbox.com/s/oql7cafbwhurpp7/AGREGAT%20FO.xlsb?dl=0

LIEN COMPLET :
https://www.dropbox.com/s/06r1kn5zi6a5cbw/AGREGAT%20FO%20COMPLET.xlsb.zip?dl=0


---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
http://www.avast.com
Avatar
Patrick
Bonjour,

pourquoi ne pas sélectionner directement la zone complète
de la colonne ?
(formule coupée par mon éditeur :(

Sheets("BA FO").Select
Range("A2:A400").Select

Selection.FormulaArray = _
"=IF(ROWS(R2:R)<=COUNTA(FOURNI),INDEX(FOURNI,SMALL(IF(FOURNI<>"""",
ROW(INDIRECT(""1:""&ROWS(FOURNI)))),ROWS(R2:R)),MOD(SMALL(IF(FOURNI<>"""",
ROW(INDIRECT(""1:""&ROWS(FOURNI)))*10^5+COLUMN(FOURNI)),ROWS(R2:R)),10^5)-COLUMN(FOURNI)+1),"""")"


Le 7/08/2015 10:21, HUGOBASS a écrit :
Bonjour à toutes et tous,

Questions également présentes sur d'autres FORUM

A partir d’une extraction d’une base de données (onglets : BA SE, BA FO, BA FA,
BA SA, L, V & R ; colonnes A à AC pour ces 3 derniers cités) j’ai créé par
formules des agrégats (onglets : AGR & AGR 2) et ou des résultats de calcul qui
se trouvent dans les colonnes AD à AP des feuilles L, V & R. Des formules dont
quelques unes reposent sur des plages nommées (certains d’entre vous m’ont
d’ailleurs déjà aidé dans leur conception) sont aussi présentes sur toutes le
feuilles. Les calculs sont interdépendants et il faut recalculer chaque feuille
lors de toutes modifications.

Les résultats sont conformes à ce que j’attend mais la volumétrie du fichier
obtenu le rend difficilement exploitable (je suis sur mac et je n’ai que Excel à
ma disposition)
Partant de ce constat je cherche à optimiser mon fichier et via l’enregistreur
de macro (je ne maitrise pas VBA) j’ai créé des macros qui reprennent l’ensemble
des formules de tous les onglets du classeur pour ensuite les coller sur les
différentes lignes et colonnes correspondantes. Mais les temps de calculs sont
très longs et plantent même souvent au motif mémoire insuffisante.

Mon objectif final étant que tous les calculs s’effectuent au lancement d’une
macro et ensuite remplacer ces calculs uniquement par leur valeur dans tous les
onglets du classeur via collage spécial par exemple. Je pense aussi qu’il ne
devrait y’avoir des calculs que si des données sont présentes sur les lignes des
onglets L, V & R (par exemple la macro ne s’exécuterait sur l’onglet L que sur
les lignes 2 à 5 (2 à 45709 sur fichier non épuré lien dropbox) et sur l’onglet
V des lignes 2 à 3 (2 à 197233 fichier non épuré). Or je colle toutes les
formules dans une plage allant de 2 à 340305 (plus dans l’avenir quand la base
grandira) sur les onglets L, V & R.

En parcourant les forums, je pense que les lenteurs sont le résultat de mes
macro non optimisées (pleins de select par exemple, mettre les plages dans des
tableaux intermédiaires de variables temporaires, peut être des boucles). Peut
être que mes formules aussi peuvent et devraient être optimisées ?

J’ai atteint la limite de mes compétences c’est pourquoi je vous soumet mon
fichier pour aide. Ce n’est bien entendu pas un jeu de données réelles pour la
confidentialité.

Vous trouverez une version épuré et une version complète sur ces liens dropbox.
Le code macro est dans le classeur.

J’espère être compréhensible, et que vous pourrez m’aider.

Merci à toutes et tous

LIEN EPURE :
https://www.dropbox.com/s/oql7cafbwhurpp7/AGREGAT%20FO.xlsb?dl=0

LIEN COMPLET :
https://www.dropbox.com/s/06r1kn5zi6a5cbw/AGREGAT%20FO%20COMPLET.xlsb.zip?dl=0





---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
https://www.avast.com/antivirus
Avatar
hugobass
Le vendredi 07 Août 2015 à 10:21 par HUGOBASS :
Bonjour à toutes et tous,

Questions également présentes sur d'autres FORUM

A partir d’une extraction d’une base de données (onglets :
BA SE, BA FO, BA FA,
BA SA, L, V & R ; colonnes A à AC pour ces 3 derniers cités)
j’ai créé par formules des agrégats (onglets : AGR
& AGR 2) et ou des résultats de calcul qui se trouvent dans les
colonnes AD à AP des feuilles L, V & R. Des formules dont quelques
unes reposent sur des plages nommées (certains d’entre vous
m’ont d’ailleurs déjà aidé dans leur
conception) sont aussi présentes sur toutes le feuilles. Les calculs
sont interdépendants et il faut recalculer chaque feuille lors de toutes
modifications.

Les résultats sont conformes à ce que j’attend mais la
volumétrie du fichier obtenu le rend difficilement exploitable (je suis
sur mac et je n’ai que Excel à ma disposition)
Partant de ce constat je cherche à optimiser mon fichier et via
l’enregistreur de macro (je ne maitrise pas VBA) j’ai
créé des macros qui reprennent l’ensemble des formules de
tous les onglets du classeur pour ensuite les coller sur les différentes
lignes et colonnes correspondantes. Mais les temps de calculs sont très
longs et plantent même souvent au motif mémoire insuffisante.

Mon objectif final étant que tous les calculs s’effectuent au
lancement d’une macro et ensuite remplacer ces calculs uniquement par
leur valeur dans tous les onglets du classeur via collage spécial par
exemple. Je pense aussi qu’il ne devrait y’avoir des calculs que si
des données sont présentes sur les lignes des onglets L, V &
R (par exemple la macro ne s’exécuterait sur l’onglet L que
sur les lignes 2 à 5 (2 à 45709 sur fichier non
épuré lien dropbox) et sur l’onglet V des lignes 2 à
3 (2 à 197233 fichier non épuré). Or je colle toutes les
formules dans une plage allant de 2 à 340305 (plus dans l’avenir
quand la base grandira) sur les onglets L, V & R.

En parcourant les forums, je pense que les lenteurs sont le résultat de
mes macro non optimisées (pleins de select par exemple, mettre les
plages dans des tableaux intermédiaires de variables temporaires, peut
être des boucles). Peut être que mes formules aussi peuvent et
devraient être optimisées ?

J’ai atteint la limite de mes compétences c’est pourquoi je
vous soumet mon fichier pour aide. Ce n’est bien entendu pas un jeu de
données réelles pour la confidentialité.

Vous trouverez une version épuré et une version complète
sur ces liens dropbox. Le code macro est dans le classeur.

J’espère être compréhensible, et que vous pourrez
m’aider.

Merci à toutes et tous

LIEN EPURE :
https://www.dropbox.com/s/oql7cafbwhurpp7/AGREGAT%20FO.xlsb?dl=0

LIEN COMPLET :
https://www.dropbox.com/s/06r1kn5zi6a5cbw/AGREGAT%20FO%20COMPLET.xlsb.zip?dl=0


Bonjour Jacqouille et Patrick,


Merci à vous 2 d'avoir pris le temps de me répondre.

Jacqouille :
"Concernant le : Pour mon édification personnelle, c'est quoi, ce mot : " Falseü" ?
Application.CutCopyMode = Falseü; Cela me fait penser à un Parisien qui prononce le mot "False" avec son accent... -))"
C'est une carabistouille qui est apparue après avoir manipulé mon fichier sous ma machine virtuel xl 2010 puis retour à office Mac 2011 que je ne m'explique pas, j'ai modifié du coup merci

Jacqouille, Patrick, j'essaye de mettre en place vos propositions et vous tiens au courant

Encore merci

Hugues
Avatar
Jacquouille
Re
Avant de vouloir modifier toute ta macro, je te suggère de refaire une
petite dans laquelle tu reprendrais un des tes "select", puis que tu
supprimerais comme expliqué;
De cette manière , c'est plus facile à comprendre la syntaxe.
N'hésite pas à revenir. "Ils" se feront un plaisir de t'aider ... et moi de
lire les réponses.
Bonne soirée
Jacques.


Jacquouille

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


Le vendredi 07 Août 2015 à 10:21 par HUGOBASS :
Bonjour à toutes et tous,

Questions également présentes sur d'autres FORUM

A partir d’une extraction d’une base de données (onglets :
BA SE, BA FO, BA FA,
BA SA, L, V & R ; colonnes A à AC pour ces 3 derniers cités)
j’ai créé par formules des agrégats (onglets : AGR
& AGR 2) et ou des résultats de calcul qui se trouvent dans les
colonnes AD à AP des feuilles L, V & R. Des formules dont quelques
unes reposent sur des plages nommées (certains d’entre vous
m’ont d’ailleurs déjà aidé dans leur
conception) sont aussi présentes sur toutes le feuilles. Les calculs
sont interdépendants et il faut recalculer chaque feuille lors de toutes
modifications.

Les résultats sont conformes à ce que j’attend mais la
volumétrie du fichier obtenu le rend difficilement exploitable (je suis
sur mac et je n’ai que Excel à ma disposition)
Partant de ce constat je cherche à optimiser mon fichier et via
l’enregistreur de macro (je ne maitrise pas VBA) j’ai
créé des macros qui reprennent l’ensemble des formules de
tous les onglets du classeur pour ensuite les coller sur les différentes
lignes et colonnes correspondantes. Mais les temps de calculs sont très
longs et plantent même souvent au motif mémoire insuffisante.

Mon objectif final étant que tous les calculs s’effectuent au
lancement d’une macro et ensuite remplacer ces calculs uniquement par
leur valeur dans tous les onglets du classeur via collage spécial par
exemple. Je pense aussi qu’il ne devrait y’avoir des calculs que si
des données sont présentes sur les lignes des onglets L, V &
R (par exemple la macro ne s’exécuterait sur l’onglet L que
sur les lignes 2 à 5 (2 à 45709 sur fichier non
épuré lien dropbox) et sur l’onglet V des lignes 2 à
3 (2 à 197233 fichier non épuré). Or je colle toutes les
formules dans une plage allant de 2 à 340305 (plus dans l’avenir
quand la base grandira) sur les onglets L, V & R.

En parcourant les forums, je pense que les lenteurs sont le résultat de
mes macro non optimisées (pleins de select par exemple, mettre les
plages dans des tableaux intermédiaires de variables temporaires, peut
être des boucles). Peut être que mes formules aussi peuvent et
devraient être optimisées ?

J’ai atteint la limite de mes compétences c’est pourquoi je
vous soumet mon fichier pour aide. Ce n’est bien entendu pas un jeu de
données réelles pour la confidentialité.

Vous trouverez une version épuré et une version complète
sur ces liens dropbox. Le code macro est dans le classeur.

J’espère être compréhensible, et que vous pourrez
m’aider.

Merci à toutes et tous

LIEN EPURE :
https://www.dropbox.com/s/oql7cafbwhurpp7/AGREGAT%20FO.xlsb?dl=0

LIEN COMPLET :



https://www.dropbox.com/s/06r1kn5zi6a5cbw/AGREGAT%20FO%20COMPLET.xlsb.zip?dl=0
Bonjour Jacqouille et Patrick,


Merci à vous 2 d'avoir pris le temps de me répondre.

Jacqouille :
"Concernant le : Pour mon édification personnelle, c'est quoi, ce mot : "
Falseü" ?
Application.CutCopyMode = Falseü; Cela me fait penser à un Parisien qui
prononce
le mot "False" avec son accent... -))"
C'est une carabistouille qui est apparue après avoir manipulé mon fichier
sous
ma machine virtuel xl 2010 puis retour à office Mac 2011 que je ne
m'explique
pas, j'ai modifié du coup merci

Jacqouille, Patrick, j'essaye de mettre en place vos propositions et vous
tiens
au courant

Encore merci

Hugues


---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
http://www.avast.com
Avatar
hugobass
Le vendredi 07 Août 2015 à 10:21 par HUGOBASS :
Bonjour à toutes et tous,

Questions également présentes sur d'autres FORUM

A partir d’une extraction d’une base de données (onglets :
BA SE, BA FO, BA FA,
BA SA, L, V & R ; colonnes A à AC pour ces 3 derniers cités)
j’ai créé par formules des agrégats (onglets : AGR
& AGR 2) et ou des résultats de calcul qui se trouvent dans les
colonnes AD à AP des feuilles L, V & R. Des formules dont quelques
unes reposent sur des plages nommées (certains d’entre vous
m’ont d’ailleurs déjà aidé dans leur
conception) sont aussi présentes sur toutes le feuilles. Les calculs
sont interdépendants et il faut recalculer chaque feuille lors de toutes
modifications.

Les résultats sont conformes à ce que j’attend mais la
volumétrie du fichier obtenu le rend difficilement exploitable (je suis
sur mac et je n’ai que Excel à ma disposition)
Partant de ce constat je cherche à optimiser mon fichier et via
l’enregistreur de macro (je ne maitrise pas VBA) j’ai
créé des macros qui reprennent l’ensemble des formules de
tous les onglets du classeur pour ensuite les coller sur les différentes
lignes et colonnes correspondantes. Mais les temps de calculs sont très
longs et plantent même souvent au motif mémoire insuffisante.

Mon objectif final étant que tous les calculs s’effectuent au
lancement d’une macro et ensuite remplacer ces calculs uniquement par
leur valeur dans tous les onglets du classeur via collage spécial par
exemple. Je pense aussi qu’il ne devrait y’avoir des calculs que si
des données sont présentes sur les lignes des onglets L, V &
R (par exemple la macro ne s’exécuterait sur l’onglet L que
sur les lignes 2 à 5 (2 à 45709 sur fichier non
épuré lien dropbox) et sur l’onglet V des lignes 2 à
3 (2 à 197233 fichier non épuré). Or je colle toutes les
formules dans une plage allant de 2 à 340305 (plus dans l’avenir
quand la base grandira) sur les onglets L, V & R.

En parcourant les forums, je pense que les lenteurs sont le résultat de
mes macro non optimisées (pleins de select par exemple, mettre les
plages dans des tableaux intermédiaires de variables temporaires, peut
être des boucles). Peut être que mes formules aussi peuvent et
devraient être optimisées ?

J’ai atteint la limite de mes compétences c’est pourquoi je
vous soumet mon fichier pour aide. Ce n’est bien entendu pas un jeu de
données réelles pour la confidentialité.

Vous trouverez une version épuré et une version complète
sur ces liens dropbox. Le code macro est dans le classeur.

J’espère être compréhensible, et que vous pourrez
m’aider.

Merci à toutes et tous

LIEN EPURE :
https://www.dropbox.com/s/oql7cafbwhurpp7/AGREGAT%20FO.xlsb?dl=0

LIEN COMPLET :
https://www.dropbox.com/s/06r1kn5zi6a5cbw/AGREGAT%20FO%20COMPLET.xlsb.zip?dl=0


Bonjour à toutes et tous, Bonjour Jacqouille, Bonjour Patrick,

Ci après mon code épuré d'un maximum de select, la macro est un peu plus rapide (merci) mais encore trop longue à mon goût.
D'autres pistes à votre avis ?

Merci
Cordialement
Hugues

Sub FOR_AGR()

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual



' BA FO A2

Sheets("BA FO").Range("A2").FormulaArray = _
"=IF(ROWS(R2:R)<=COUNTA(FOURNI),INDEX(FOURNI,SMALL(IF(FOURNI<>"""",ROW(INDIRECT(""1:""&ROWS(FOURNI)))),ROWS(R2:R)),MOD(SMALL(IF(FOURNI<>"""",ROW(INDIRECT(""1:""&ROWS(FOURNI)))*10^5+COLUMN(FOURNI)),ROWS(R2:R)),10^5)-COLUMN(FOURNI)+1),"""")"

'COLLAGE SPECIAL FORMULE BA FO A2 A3:A400

Sheets("BA FO").Range("A2").Copy
Range("A3:A400").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


' BA FO B2

Sheets("BA FO").Range("B2").FormulaArray = _
"=IF(INDEX(C1,MIN(IF(COMPILFOUR<>"""",IF(COUNTIF(R1C:R[-1]C,COMPILFOUR)=0,ROW(COMPILFOUR),ROWS(COMPILFOUR)+ROW(COMPILFOUR)))))=0,"""",INDEX(C1,MIN(IF(COMPILFOUR<>"""",IF(COUNTIF(R1C:R[-1]C,COMPILFOUR)=0,ROW(COMPILFOUR),ROWS(COMPILFOUR)+ROW(COMPILFOUR))))))"

'COLLAGE SPECIAL FORMULE BA FO B2 B3:B400

Sheets("BA FO").Range("B2").Copy
Range("B3:B400").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False



'BA FA A2

Sheets("BA FA").Range("A2").FormulaArray = _
"=IF(ROWS(R2:R)<=COUNTA(FAMILLES),INDEX(FAMILLES,SMALL(IF(FAMILLES<>"""",ROW(INDIRECT(""1:""&ROWS(FAMILLES)))),ROWS(R2:R)),MOD(SMALL(IF(FAMILLES<>"""",ROW(INDIRECT(""1:""&ROWS(FAMILLES)))*10^5+COLUMN(FAMILLES)),ROWS(R2:R)),10^5)-COLUMN(FAMILLES)+1),"""")"

'COLLAGE SPECIAL FORMULE BA FA A2 A3:A400

Sheets("BA FA").Range("A2").Copy
Range("A3:A400").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'BA FA B2

Sheets("BA FA").Range("B2").FormulaArray = _
"=IF(INDEX(C1,MIN(IF(COMPILFAM<>"""",IF(COUNTIF(R1C:R[-1]C,COMPILFAM)=0,ROW(COMPILFAM),ROWS(COMPILFAM)+ROW(COMPILFAM)))))=0,"""",INDEX(C1,MIN(IF(COMPILFAM<>"""",IF(COUNTIF(R1C:R[-1]C,COMPILFAM)=0,ROW(COMPILFAM),ROWS(COMPILFAM)+ROW(COMPILFAM))))))"

'COLLAGE SPECIAL FORMULE BA FO B2 B3:B400

Sheets("BA FA").Range("B2").Copy
Range("B3:B400").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False



' BA SA A2

Sheets("BA SA").Range("A2").FormulaArray = _
"=IF(ROWS(R2:R)<=COUNTA(SAISONS),INDEX(SAISONS,SMALL(IF(SAISONS<>"""",ROW(INDIRECT(""1:""&ROWS(SAISONS)))),ROWS(R2:R)),MOD(SMALL(IF(SAISONS<>"""",ROW(INDIRECT(""1:""&ROWS(SAISONS)))*10^5+COLUMN(SAISONS)),ROWS(R2:R)),10^5)-COLUMN(SAISONS)+1),"""")"

'COLLAGE SPECIAL FORMULE BA SA A2 A3:A699

Sheets("BA SA").Range("A2").Copy
Range("A3:A699").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


' BA SA B2

Sheets("BA SA").Range("B2").FormulaArray = _
"=IF(INDEX(C1,MIN(IF(COMPILSAI<>"""",IF(COUNTIF(R1C:R[-1]C,COMPILSAI)=0,ROW(COMPILSAI),ROWS(COMPILSAI)+ROW(COMPILSAI)))))=0,"""",INDEX(C1,MIN(IF(COMPILSAI<>"""",IF(COUNTIF(R1C:R[-1]C,COMPILSAI)=0,ROW(COMPILSAI),ROWS(COMPILSAI)+ROW(COMPILSAI))))))"

'COLLAGE SPECIAL FORMULE BA SA B2 B3:B699

Sheets("BA SA").Range("B2").Copy
Range("B3:B699").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False



' AGR A2

Sheets("AGR").Range("A2").FormulaArray = _
"=IF(OR('BA FO'!RC[1]=0,'BA FO'!RC[1]=""""),"""",'BA FO'!RC[1])"

' COLLAGE SPECIAL FORMULE AGR A2 A3:A400

Sheets("AGR").Range("A2").Copy
Range("A3:A400").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


' AGR B2

Sheets("AGR").Range("B2").FormulaArray = _
"=IF(RC[-1]="""","""",INDEX(result,MAX(IF(RC[-1]=champRech,COLUMN(champRech)))-COLUMN(champRech)+1))"

'COLLAGE SPECIAL FORMULE AGR B2 B3:B400

Sheets("AGR").Range("B2").Copy
Range("B3:B400").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


' AGR C24

Sheets("AGR").Range("C24").FormulaArray = _
"=COUNTA(R[-22]C[-2]:R[376]C[-2])-COUNTBLANK(R[-22]C[-2]:R[376]C[-2])"


' AGR C25

Sheets("AGR").Range("C25").FormulaR1C1 = "=R[-1]C[15]"


' AGR C26

Sheets("AGR").Range("C26").FormulaR1C1 = "=R[-2]C=R[-1]C"

' COLLAGE SPECIAL FORMULE AGR C26 D26:R26

Sheets("AGR").Range("C26").Copy
Range("D26:R26").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


' AGR D24

Sheets("AGR").Range("D24").FormulaR1C1 = "=COUNTA(R[-22]C:R[-1]C)"

' COLLAGE SPECIAL FORMULE AGR D24 E24:Q24

Sheets("AGR").Range("D24").Copy
Range("E24:Q24").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR D25

Sheets("AGR").Range("D25").FormulaR1C1 = "=COUNTIF(R2C2:R400C2,R[-24]C)"

' COLLAGE SPECIAL FORMULE AGR D25 E25:Q25

Sheets("AGR").Range("D25").Copy
Range("E25:Q25").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR R24

Sheets("AGR").Range("R24").FormulaR1C1 = "=SUM(RC[-14]:RC[-1])"


'AGR R25

Sheets("AGR").Range("R25").FormulaR1C1 = "=SUM(RC[-14]:RC[-1])"


'AGR A404

Sheets("AGR").Range("A404").FormulaR1C1 = _
"=IF(OR('BA FA'!R[-402]C[1]=0,'BA FA'!R[-402]C[1]=""""),"""",'BA FA'!R[-402]C[1])"

' COLLAGE SPECIAL FORMULE AGR A405:A600

Sheets("AGR").Range("A404").Copy
Range("A405:A600").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR B404

Sheets("AGR").Range("B404").FormulaArray = _
"=IF(RC[-1]="""","""",INDEX(result2,MAX(IF(RC[-1]=champRech2,COLUMN(champRech2)))-COLUMN(champRech2)+1))"

' COLLAGE SPECIAL FORMULE AGR A405:A600

Sheets("AGR").Range("B404").Copy
Range("B405:B600").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR C452

Sheets("AGR").Range("C452").FormulaR1C1 = _
"=COUNTA(R[-48]C[-2]:R[148]C[-2])-COUNTBLANK(R[-48]C[-2]:R[148]C[-2])"


'AGR C453

Sheets("AGR").Range("C453").FormulaR1C1 = "=R[-1]C[24]"


'AGR C454

Sheets("AGR").Range("C454").FormulaR1C1 = "=R[-2]C=R[-1]C"

'COLLAGE SPECIAL FORMULE AGR C454 D454:AA454

Sheets("AGR").Range("C454").Copy
Range("D454:AA454").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR D452

Sheets("AGR").Range("D452").FormulaR1C1 = "=COUNTA(R[-48]C:R[-2]C)"

'COLLAGE SPECIAL FORMULE AGR D452 E452:Z452

Sheets("AGR").Range("D452").Copy
Range("E452:Z452").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR D453

Sheets("AGR").Range("D453").FormulaR1C1 = "=COUNTIF(R404C2:R600C2,R[-50]C)"

'COLLAGE SPECIAL FORMULE AGR D453 E453:Z453

Sheets("AGR").Range("D453").Copy
Range("E453:Z453").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR AA452

Sheets("AGR").Range("AA452").FormulaR1C1 = "=SUM(RC[-23]:RC[-1])"


'AGR AA453

Sheets("AGR").Range("AA453").FormulaR1C1 = "=SUM(RC[-23]:RC[-1])"


'AGR A604

Sheets("AGR").Range("A604").FormulaR1C1 = _
"=IF(OR('BA SA'!R[-602]C[1]=0,'BA SA'!R[-602]C[1]=""""),"""",'BA SA'!R[-602]C[1])"

'COLLAGE SPECIAL FORMULE AGR A604 A605:A1301

Sheets("AGR").Range("A604").Copy
Range("A605:A1301").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR B604

Sheets("AGR").Range("B604").FormulaR1C1 = _
"=IF(ISERROR(VLOOKUP(RC[5]&"" ""&RC[3],R604C10:R711C11,2,FALSE)),RC[5]&"" ""&RC[3],VLOOKUP(RC[5]&"" ""&RC[3],R604C10:R711C11,2,FALSE))"

'COLLAGE SPECIAL FORMULE AGR B604 B605:B1301

Sheets("AGR").Range("B604").Copy
Range("B605:B1301").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR D604

Sheets("AGR").Range("D604").FormulaR1C1 = _
"=IF(RC[-3]="""","""",IF(OR(LEN(RC[-3])<4,RC[-3]=""N0000""),""AUTRE"",RIGHT((SUBSTITUTE(RC[-3],""-SP"","""")),4)))"

'COLLAGE SPECIAL FORMULE AGR D604 D605:D1301

Sheets("AGR").Range("D604").Copy
Range("D605:D1301").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR E604

Sheets("AGR").Range("E604").FormulaR1C1 = _
"=IF(RC[-4]="""","""",IF(RC[-1]=""AUTRE"",""AUTRE"",""20""&RIGHT(RC[-1],2)))"

'COLLAGE SPECIAL FORMULE AGR E604 E605:E1301

Sheets("AGR").Range("E604").Copy
Range("E605:E1301").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR F604

Sheets("AGR").Range("F604").FormulaR1C1 = _
"=IF(RC[-1]=""autre"",""autre"",IF(LEN(RC[-5])=5,LEFT(RC[-5],1),LEFT(RC[-5],2)))"

'COLLAGE SPECIAL FORMULE AGR F604 F605:F1301

Sheets("AGR").Range("F604").Copy
Range("F605:F1301").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR G604

Sheets("AGR").Range("G604").FormulaR1C1 = _
"=IF(OR(LEN(RC[-6])>7,RC[-1]=""PR"",RC[-1]=""AU"",RC[-1]=""99"",RC[-1]=""L0""),""autre"",RC[-1])"


'COLLAGE SPECIAL FORMULE AGR G604 G605:G1301

Sheets("AGR").Range("G604").Copy
Range("G605:G1301").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR H604

Sheets("AGR").Range("H604").FormulaR1C1 = _
"=IF(LEFT(RC[-6],5)=""AUTRE"",""AUTRE"",LEFT(RC[-6],2))"


'COLLAGE SPECIAL FORMULE AGR H604 H605:H1301

Sheets("AGR").Range("H604").Copy
Range("H605:H1301").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR I604
Sheets("AGR").Range("I604").FormulaR1C1 = _
"=IF(RIGHT(RC[-7],5)=""AUTRE"",""AUTRE"",RIGHT(RC[-7],4))"

'COLLAGE SPECIAL FORMULE AGR I604 I605:I1301

Sheets("AGR").Range("I604").Copy
Range("I605:I1301").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR A1305
Sheets("AGR").Range("A1305").FormulaR1C1 = _
"=IF(OR('BA SE'!R[-1303]C=0,'BA SE'!R[-1303]C=""""),"""",'BA SE'!R[-1303]C)"

'COLLAGE SPECIAL FORMULE AGR A1305 A1306:A1329

Sheets("AGR").Range("A1305").Copy
Range("A1306:A1329").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR A1305
Sheets("AGR").Range("B1305").FormulaArray = _
"=IF(RC[-1]="""","""",INDEX(result3,MAX(IF(RC[-1]=champRech3,COLUMN(champRech3)))-COLUMN(champRech3)+1))"

'COLLAGE SPECIAL FORMULE AGR A1305 B1305:B1329

Sheets("AGR").Range("B1305").Copy
Range("B1306:B1329").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR C1327
Sheets("AGR").Range("C1327").FormulaR1C1 = _
"=COUNTA(R[-22]C[-2]:R[2]C[-2])-COUNTBLANK(R[-22]C[-2]:R[2]C[-2])"

'AGR C1329
Sheets("AGR").Range("C1329").FormulaR1C1 = "=R[-2]C=R[-2]C[5]"

'COLLAGE SPECIAL FORMULE AGR C1329 D1329:H1329

Sheets("AGR").Range("C1329").Copy
Range("D1329:H1329").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR D1327
Sheets("AGR").Range("D1327").FormulaR1C1 = "=COUNTA(R[-22]C:R[-1]C)"

'COLLAGE SPECIAL FORMULE AGR D1327 E1327:G1327

Sheets("AGR").Range("D1327").Copy
Range("E1327:G1327").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR D1328
Sheets("AGR").Range("D1328").FormulaR1C1 = "=COUNTIF(R1305C2:R1329C2,R[-24]C)"

'COLLAGE SPECIAL FORMULE AGR D1328 E1328:G1328

Sheets("AGR").Range("D1328").Copy
Range("E1328:G1328").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR D1329
Sheets("AGR").Range("D1329").FormulaR1C1 = "=R[-2]C=R[-1]C"

'COLLAGE SPECIAL FORMULE AGR D1329 E1329:H1329

Sheets("AGR").Range("D1329").Copy
Range("E1329:H1329").PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:úlse
Application.CutCopyMode = False


'AGR H1327
Sheets("AGR").Range("H1327").FormulaR1C1 = "=SUM(RC[-4]:RC[-1])"


'AGR H1328
Sheets("AGR").Range("H1328").FormulaR1C1 = "=SUM(RC[-4]:RC[-1])"




Calculate

Sheets("AGR").Range("A1").Select

ActiveWorkbook.SAVE

Application.ScreenUpdating = True


End Sub
Avatar
HD
Perso, en début et fin de macro (en plus de gérer le
Application.ScreenUpdating et le calculate), je met toujours :

Application.EnableEvents = False
mon script
Application.EnableEvents = True

ça permet de désactiver les événements. Dans ton cas il y'a des chances
pour que cela ai une incidence.

@+
HD
Avatar
DanielCo
Bonjour,
J'ai commencé à modifier la macro :
http://www.cjoint.com/c/EHAsa47zHfv
jusqu'au commentaire "COLLAGE SPECIAL FORMULE AGR E604 E605:E1301". Si
ça te va, continue.
Daniel
Avatar
MichD
Bonjour,

Évidemment, je ne sais pas si ce qui suit est applicable à ton application
et à la manière dont tu dois travailler dans ce classeur...

Une proposition, d'abord pour la syntaxe de to code,
Cet exemple est fait à partir de la première feuille seulement "BA FO"
Dans cet exemple, au lieu de conserver les formules dans les cellules, je les
remplace par leur valeur respective.

A ) Au lieu d'exécuter le code pour toutes les formules de toutes les feuilles dans
la même procédure, pourquoi ne pas faire une macro pour chacune des feuilles
afin d'exécuter les formules seulement de cette feuille.

B ) Chacune de ces macros pourrait être exécutée au moment de sélectionner ladite
feuille afin d'avoir une mise à jour récente des données de cette feuille.
À cet effet, dans le ThisWorkbook, tu as une procédure événementielle qui peut te servir...
Cela donnerait quelque chose comme :

à mettre dans le ThisWorkbook
'------------------------------------------------------------
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
'Cet événement se déclenche à chaque fois que tu sélectionnes
'une autre feuille que la feuille active. La variable Sh représent
'un objet Worksheet

'La propriété CodeName retourne la valeur de la propriété "Name"
'de la feuille et non le nom de l'onglet de la feuille.

'Tu utilises un Select Case, un "CASE" pour chacune des feuilles à traiter

Select Case Sh.code
Case Is = "Feuil4"
'LesFormules_Feuil4 est le nom de la procédure pour la Feuil4 ou BA FO
Call LesFormules_Feuil4

Case Is = "Feuil5"
Call LesFormules_Feuil5

'Case ...
'Autant de cases que nécessaire

End Select
End Sub
'------------------------------------------------------------


'Attention, il faut utiliser les bonnes formules... J'ai dû faire une erreur puisque les
'2 formules sont identiques en faisant un copier coller
'=============================================================== Sub LesFormules_Feuil4()
Dim DerLig As Long, T As Variant

Application.ScreenUpdating = False
Application.Calculation = xlCalculationAutomatic
'SELECTIONNER FEUILLE BA FO

'Regarde à gauche dans ton projet VBA, tu as le nom des objets "Worksheets"
'Il est préférable d'utiliser le nom de l'objet "Feuil4" au lieu du nom
'de l'onglet de la feuille.
'- C'est plus facile à coder, car tu as accès à la liste déroulante des propriétés
'et méthodes dès que tu tapes le "point"...
'- Tu gagnes quelques nanosecondes à l'exécution du code
'- Tu peux modifier le nom de l'onglet de la feuille sans devoir modifier le code...

Quand c'est possible, il faut éviter d'utiliser l'expression "SELECT" pour sélectionner les objets

With Feuil4 ' Sheets("BA FO")
DerLig = .Range("A" & .Rows.Count).End(xlUp).Row
With .Range("A2")
.FormulaArray = _
"=IF(ROWS(R2:R)<=COUNTA(FOURNI),INDEX(FOURNI,SMALL(IF(FOURNI<>""""," & _
"ROW(INDIRECT(""1:""&ROWS(FOURNI)))),ROWS(R2:R)),MOD(SMALL(IF(FOURNI<>""""," & _
"ROW(INDIRECT(""1:""&ROWS(FOURNI)))*10^5+COLUMN(FOURNI)),ROWS(R2:R)),10^5)-COLUMN(FOURNI)+1),"""")"
End With
With .Range("A2:A" & DerLig)
.FillDown
End With

With .Range("B2")
.FormulaArray = _
"=IF(ROWS(R2:R)<=COUNTA(FOURNI),INDEX(FOURNI,SMALL(IF(FOURNI<>""""," & _
"ROW(INDIRECT(""1:""&ROWS(FOURNI)))),ROWS(R2:R)),MOD(SMALL(IF(FOURNI<>""""," & _
"ROW(INDIRECT(""1:""&ROWS(FOURNI)))*10^5+COLUMN(FOURNI)),ROWS(R2:R)),10^5)-COLUMN(FOURNI)+1),"""")"
End With
With .Range("B2:A" & DerLig)
.FillDown
End With
'Ceci sert à faire disparaitre les formules
'et n'afficher que les valeurs dans les cellules.
With .Range("A2:B" & DerLig)
T = .Value
.Value = T
End With
End With
Application.ScreenUpdating = True
End Sub
'================================================================