Accélérer fichier Excel

Bonjour,

J'ai un gros fichier excel avec des formules dans tous les sens (plusieurs millions de formules).

Il nécessite quelques secondes à chaque recalcul et je souhaite l'accélérer.

J'ai lu qu'en théorie, certaines formules sont + rapides à calculées selon leur rédaction.

Exemple :

RECHERCHEV(1;'Feuille'!A1:N1000;14;FAUX) sera + rapide que RECHERCHEV(1;'Feuille'!A:N;14;FAUX)

Je suppose qu'il en va de même pour toutes les formules faisant appel à des plages de cellules : RECHERCHEH(), SOMME(), MOYENNE(), etc...

Dans mon fichier, des centaines de milliers de formules sont concernées.

Dans la pratique, quelqu'un sait-il combien de temps de calcul on gagne entre une formulation et l'autre?

Si ça vaut le coût, je peux essayer de reformuler les formules les plus utilisées.

Au cas où : il n'y a pas d'utilitaire ou de solution automatique permettant de modifier automatiquement la rédaction de ces formules?

Nicole

Bonjour,

Il y a rechercher et remplacer:

A:N par A1:N1000 mais l'inconvénient c'est qu'il faut reprendre chaque colonne au cas par cas puis d'enregistrer le fichier sous format d'excel binaire et de mettre le calcul en mode manuel.

Sinon encore mieux, une macro qui applique les formules colonne par colonne et les colle en valeurs, cette solution étant la meilleure car elle prend infiniment moins de temps et elle permet d'actualiser losqu'on le décide.

Bonjour Nono, et merci pour ta réponse

nono78 a écrit :

Il y a rechercher et remplacer:

A:N par A1:N1000 mais l'inconvénient c'est qu'il faut reprendre chaque colonne au cas par cas puis d'enregistrer le fichier sous format d'excel binaire et de mettre le calcul en mode manuel.

C'est la solution manuelle à laquelle je pensais. Ca va me faire des jours de boulot je pense...

C'est pour cela que je souhaiterais savoir combien de temps de calcul je pourrais gagner avant de me lancer là-dedans. Tu as une idée ?

nono78 a écrit :

Sinon encore mieux, une macro qui applique les formules colonne par colonne et les colle en valeurs, cette solution étant la meilleure car elle prend infiniment moins de temps et elle permet d'actualiser losqu'on le décide.

Alors là je ne sais pas de quoi tu parles.

Je ne comprends pas comment fonctionnerait une telle macro? Tu aurais un exemple?

Dans l'idéal, pour moi, le mieux serait une macro qui cherche les formules concernées par ce problème, soit capable d'analyser la fonction concernée, de détecter la ligne non vide la plus profonde dans les colonnes concernées et de remplacer automatiquement la formulation initiale par la formulation corrigée. Mais je ne sais pas s'il est possible de faire cela avec une macro? Ce serait le rêve...

Ok. Files moi ton fichier je ne te promets rien mais je verrai ce que je peux faire

Je ne peux pas transmettre le fichier complet, mais voici un exemple (simpliste) qui présente ma problèmatique.

Dans cet exemple, j'ai fait figurer des Recherchev(), des somme.si(), des moyenne.si().

Dons mon fichier réel, cette formules peuvent être imbriquées dans des algorithmes + complexes.

Soit dit en passant, je travaille avec excel 2007, donc il faudrait une solution compatible avec cette version.

L'idéal serait de rédiger une macro qui nettoie les formules faisant appel à des plages mal délimitées (par plages mal délimitées, j'entends des plages seulement définies par 2 colonnes ou 2 lignes) pour les remplacées par les plages bien délimitées (définies précisément par les 2 cellules qui sont les coins de la plage).

Sauf erreur de ma part, cela nécessite que la macro :

1. cherche dans le classeur une formule faisant appel à des plages mal délimitées

2. analyse les cellules de la plage mal délimitée pour trouver ce que serait la plage bien délimitée (les coordonnées des 2 cellules extrêmes non vide)

3. remplace la formulation de la plage mal délimitée par la formulation de la plage bien délimitée

4. cherche dans le classeur la formule suivante, etc...

5. s'arrête quand il n'y a plus de formules mal rédigées.

Si tu sais faire ça, je te tire mon chapeau ! ça me ferait gagner des jours de travail...

21exemple.xlsx (103.50 Ko)

je vois que le fichier a été téléchargé plusieurs fois : n'hésitez pas à me dire ce que vous pensez de cette problématique.

Est-ce faisable via macro?

Merci d'avance!

Nicole

Salut,

Bon je n'ai pas trouvé de solution pour remplacer directement la matrice mais je ne reviens pas les mains vides.

voici une macro qui copie les premières lignes de formules de tes 2 onglets dans un onglet temporaire caché

puis elle va chercher ces formules, les déploie et recopie les cellules en valeurs.

avantage: ton fichier sera infiniment plus rapide et pour les formules que tu m'as données la macro mets 1s pour réactualiser, puis tu peux changer les formules au besoin dans l'onglet temporaire.

inconvénient: la macro ne supporte que tes 2 feuilles nommées "recherchev" et "calculs" mais ça tu peux le modifier

Public Sub ViderPressePapier()
Dim Cible As DataObject

    Set Cible = New DataObject
    Cible.SetText ""
    Cible.PutInClipboard

    Set Cible = Nothing
End Sub
Sub incorp_formules()
' --------------------------------------------------------------------------INITIATION CALCUL TEMPS-----------------------------------------------------------------------------------------------------------
Dim debut As Date, temps As Date, fin As Date
debut = Time
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'Application.ScreenUpdating = False
ViderPressePapier

Dim DerLigneRech As Double
Dim DerColRech As Integer
Dim DerLigneCalc As Double
Dim DerColCalc As Integer

Sheets("Recherchev").Activate
DerLigneRech = ActiveSheet.UsedRange.Rows.Count
DerColRech = Application.WorksheetFunction.CountA(Rows(1))

Sheets("Calculs").Activate
DerLigneCalc = ActiveSheet.UsedRange.Rows.Count
DerColCalc = Application.WorksheetFunction.CountA(Rows(1))

Application.DisplayAlerts = False

On Error Resume Next
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = "temporaire"

If ActiveSheet.Name <> "temporaire" Then
ActiveSheet.Delete
End If

'copie ligne de formule onglet recherche v
Sheets("Recherchev").Activate
Rows("2:2").Copy
Sheets("temporaire").Activate
Range("A1").Select

If Range("A1").value = "" Then
ActiveSheet.Paste
End If

'copie ligne de formules onglet calculs
Sheets("Calculs").Activate
Rows("2:2").Copy
Sheets("temporaire").Activate
Range("A2").Select

If Range("A2").value = "" Then
ActiveSheet.Paste
End If

Rows("1:1").Copy

Sheets("Recherchev").Activate
Range("A2").Select
ActiveSheet.Paste

For i = 2 To DerColRech
Cells(2, i).Select
Selection.AutoFill Destination:=Range(Cells(1, i), Cells(DerLigneRech, i))
'copie valeurs
Range(Cells(1, i), Cells(DerLigneRech, i)).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
ViderPressePapier
Next i

Sheets("temporaire").Activate
Rows("2:2").Select

Sheets("Calculs").Activate
Range("A2").Select
ActiveSheet.Paste

For i = 2 To DerColCalc
Cells(2, i).Select
Selection.AutoFill Destination:=Range(Cells(1, i), Cells(DerLigneCalc, i))

'copie valeurs
Range(Cells(1, i), Cells(DerLigneCalc, i)).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

ViderPressePapier
Next i

Sheets("temporaire").Visible = xlSheetHidden
'Application.ScreenUpdating = True
' --------------------------------------------------------------------------CLOTURE CALCUL TEMPS-----------------------------------------------------------------------------------------------------------
fin = Time
temps = fin - debut
MsgBox (Chr(10) & "temps de traitement " & temps)
' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
End Sub

Eh ben pour commencer, merci beaucoup nono!

Alors pour l'instant je n'ai pas tout compris, donc j'ai quelques questions :

nono78 a écrit :

voici une macro qui copie les premières lignes de formules de tes 2 onglets dans un onglet temporaire caché

Quand tu dis "les premières lignes", qu'entends-tu par là?

Est-ce que la macro va chercher toutes les formules d'un feuillet? ou seulement la ligne 1? ou les X premières lignes? Est-ce que dans le code de la macro, je peux modifier cela pour que la macro aille chercher dans tout le feuillet ou dans les N premières lignes?

nono78 a écrit :

inconvénient: la macro ne supporte que tes 2 feuilles nommées "recherchev" et "calculs" mais ça tu peux le modifier

Pour cela, il me suffit de remplacer le nom des feuillets dans :

Sheets("Recherchev").Activate

et

Sheets("temporaire").Activate

?

Puis-je ajouter N feuillets?


Je viens de le tester dans le fichier test :

J'ai créé un module dans lequel j'ai collé ton code.

Puis j'ai essayé de lancer la macro incorp_formules.

J'ai un message d'erreur disant : "Erreur de compilation : type défini par l'utilisateur non défini".

Et la partie de code sélectionnée en jaune est : "Cible As DataObject" dans la macro "Public Sub ViderPressePapier()"

Que dois-je faire?

Re,

Mince, j'ai fait le code sous Excel 2010.

C'est pas trop grave cette procédure sert seulement à libérer la mémoire. Vu le temps d'exécution faible, elle n'est pas indispensable. Tu peux la supprimer ou la mettre en commentaire.


Je t'apportes une réponse sur les autres points demain matin.

Bonjour,

Voici le code expliqué en détail:

Sub incorp_formulesV2()
' --------------------------------------------------------------------------INITIATION CALCUL TEMPS-----------------------------------------------------------------------------------------------------------
Dim debut As Date, temps As Date, fin As Date
debut = Time
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'Désactivation de l'affichage écran pour accélérer le traitement
Application.ScreenUpdating = False

Dim DerLigneRech As Double  'Déclaration d'une variable pour stocker le numéro de la dernière ligne de l'onglet recherche
Dim DerColRech As Integer   'Déclaration d'une variable pour stocker le numéro de la dernière colonne de l'onglet recherche
Dim DerLigneCalc As Double  'Déclaration d'une variable pour stocker le numéro de la dernière ligne de l'onglet Calculs
Dim DerColCalc As Integer   'Déclaration d'une variable pour stocker le numéro de la dernière colonne de l'onglet Calculs

'Qualification des onglets
Sheets("Recherchev").Activate   'Activation de la feuille concernée
DerLigneRech = ActiveSheet.UsedRange.Rows.Count 'Comptage des lignes contenues dans la feuille active et affectation à la variable déclarée
DerColRech = Application.WorksheetFunction.CountA(Rows(1))  'Comptage des colonnes contenues dans la feuille active et affectation à la variable déclarée

Sheets("Calculs").Activate  'Activation de la feuille concernée
DerLigneCalc = ActiveSheet.UsedRange.Rows.Count 'Comptage des lignes contenues dans la feuille active et affectation à la variable déclarée
DerColCalc = Application.WorksheetFunction.CountA(Rows(1))  'Comptage des colonnes contenues dans la feuille active et affectation à la variable déclarée

'Désactivation des alertes Excel
Application.DisplayAlerts = False

On Error Resume Next 'Demande à Excel d'ignorer l'étape suivante si une erreur existe (en l'occurence si un onglet "temporaire" existe déjà)
Sheets.Add After:=Sheets(Sheets.Count)  'Création d'un onglet après en dernier
ActiveSheet.Name = "temporaire" 'Renommage de cet onglet

'Demande de suppression de l'onglet créé si la transformation du nom n'a pas marché en raison de l'existance d'un onglet "temporaire"
If ActiveSheet.Name <> "temporaire" Then
ActiveSheet.Delete
End If

'copie ligne de formule onglet recherche v
Sheets("Recherchev").Activate   'Activation de la feuille concernée
Rows("2:2").Copy    'Copie de la ligne 2 afin de récupérer les formules
Sheets("temporaire").Activate
Range("A1").Select

'Demande de ne rien faire s'il existe déjà des formules dans l'onglet temporaire sinon demande de coller les formules
If Range("A1").value = "" Then
ActiveSheet.Paste
End If

'La même opération pour l'onglet Calculs
'copie ligne de formules onglet calculs
Sheets("Calculs").Activate
Rows("2:2").Copy
Sheets("temporaire").Activate
Range("A2").Select

If Range("A2").value = "" Then
ActiveSheet.Paste
End If

'copie les formules de recherchev contenues dans l'onglet temporaire
Rows("1:1").Copy

'collage des formules sur la ligne 2 de l'onglet recherchev
Sheets("Recherchev").Activate
Range("A2").Select
ActiveSheet.Paste

'Ce bloc demande sur chaque colonne le déploiement des formules jusqu'à la dernière ligne
For i = 2 To DerColRech
Cells(2, i).Select
Selection.AutoFill Destination:=Range(Cells(1, i), Cells(DerLigneRech, i))
'Ce bloc copie et colle en valeurs toute les cellules contenant des formules pour rendre le fichier plus léger
Range(Cells(1, i), Cells(DerLigneRech, i)).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Next i

'Les mêmes opérations sont reproduites pour la feuille calcul
Sheets("temporaire").Activate
Rows("2:2").Select

Sheets("Calculs").Activate
Range("A2").Select
ActiveSheet.Paste

For i = 2 To DerColCalc
Cells(2, i).Select
Selection.AutoFill Destination:=Range(Cells(1, i), Cells(DerLigneCalc, i))

'copie valeurs
Range(Cells(1, i), Cells(DerLigneCalc, i)).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Next i

Sheets("temporaire").Visible = xlSheetHidden 'Demande à Excel de cacher l'onglet temporaire

'Remise aux valeurs initiales de l'affichage et des alertes
Application.ScreenUpdating = True
Application.DisplayAlerts = True
' --------------------------------------------------------------------------CLOTURE CALCUL TEMPS-----------------------------------------------------------------------------------------------------------
fin = Time
temps = fin - debut
MsgBox (Chr(10) & "temps de traitement " & temps)
' ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
End Sub

La conclusion:

1)La macro qualifie les onglets recherchev et calculs (nombre de lignes et nombre de colonnes de chacune) puis stocke ces infos dans les 4 variables déclarées au départ

2) Elle copie les premières lignes des onglets recherchev et calculs puis les colle dans l'onglet temporaire, cette opération sert seulement à récupérer les formules c'est pour cette raison que je ne récupère que la première ligne. J'ai évidemment supposé que la formule de la première ligne était celle des autres d'après ce que j'ai vu sur l'exemple, si ce n'est pas le cas il est possible d'aller chercher les X premières lignes ou toutes les lignes mais dans ce cas il n'y aura aucun gain en légèreté.

3) Elle va par la suite pour chacun des 2 onglets récupérer la formule précédemment stockée dans l'onglet temporaire puis la colle sur l'onglet recherche v et temporaire, la déploie jusqu'à la dernière ligne puis copie et colle en valeurs pour alléger.

Voilà j'espère que c'est assez clair afin que tu puisses changer le code si besoin, si tu veux ajouter des feuilles, il faudra créer des variables de stockage propres à cette feuille copier la première ligne dans temporaire à la suite des formules déjà copiées, puis les recoller et les déployer en faisant un coller valeurs.

Bonjour,

J'ai testé le code dans le fichier exemple.xlsx après avoir vidé ViderPressePapier() de son contenu pour éviter le message d'erreur.

L'opération réalisée semble faire un copier/collage spécial (valeurs) en remplaçant les formules initiales par leurs résultats.

Malheureusement, cela ne solutionne pas mon problème.

Mon besoin, c'est de modifier la rédaction des formules faisant appel à des plages mal bornées.

Par exemple :

-dans le feuillet "Recherchev", dans la cellule B2, je souhaite que soit remplacé =RECHERCHEV($A2;Data!$A:$L;2;FAUX) par =RECHERCHEV($A2;Data!$A1:$L818;2;FAUX)

-dans le feuillet "Calculs", dans la cellule B2, je souhaite que soit remplacé =MOYENNE(Data!2:2) par =MOYENNE(Data!A2:L2)

-dans le feuillet "Calculs", dans la cellule D2, je souhaite que soit remplacé =MOYENNE.SI(Data!B:B;">0") par =MOYENNE.SI(Data!B1:B741;">0")

-dans le feuillet "Calculs", dans la cellule K2, je souhaite que soit remplacé =SOMME.SI(Data!I:I;">0") par =SOMME.SI(Data!I1:I301;">0")


Bonjour nono

nono78 a écrit :

2) Elle copie les premières lignes des onglets recherchev et calculs puis les colle dans l'onglet temporaire, cette opération sert seulement à récupérer les formules c'est pour cette raison que je ne récupère que la première ligne. J'ai évidemment supposé que la formule de la première ligne était celle des autres d'après ce que j'ai vu sur l'exemple, si ce n'est pas le cas il est possible d'aller chercher les X premières lignes ou toutes les lignes mais dans ce cas il n'y aura aucun gain en légèreté.

Dans mon fichier, les formules à corriger peuvent être dans n'importe quel feuillet, dans n'importe quelle cellule (pas seulement la première ligne ou la première colonne).

nono78 a écrit :

3) Elle va par la suite pour chacun des 2 onglets récupérer la formule précédemment stockée dans l'onglet temporaire puis la colle sur l'onglet recherche v et temporaire, la déploie jusqu'à la dernière ligne puis copie et colle en valeurs pour alléger.

on s'est peut-être mal compris

comme indiqué dans mon post précédent, un collage de valeurs ne solutionne pas mon problème.

Penses-tu qu'il est possible de corriger automatiquement la rédaction des formules?

Et par ailleurs, sais-tu si je gagnerai beaucoup en vitesse de calcul avec ces modifs?

Merci de ton aide,

Nicole

Désolé Nicole mais je n'arrive pas à isoler le matrice type $A:$L dans la formule pour pouvoir la changer c'est pour cette raison que j'ai procédé autrement.

Peut être qu'une âme charitable aura la solution

Mais il y a un point que je ne saisis pas:

la formule de la colonne C100 peut être différente de celle de C1?

nono78 a écrit :

Désolé Nicole mais je n'arrive pas à isoler le matrice type $A:$L dans la formule pour pouvoir la changer c'est pour cette raison que j'ai procédé autrement.

zut! malheureusement je ne peux pas t'aider car je n'y connais rien en VBA...

nono78 a écrit :

il y a un point que je ne saisis pas:

la formule de la colonne C100 peut être différente de celle de C1?

Dans mon fichier, au fur et à mesure qu'il a été construit, les fonctions mentionnées précédemment (surtout recherchev) ont été couramment utilisées un peu partout, et malheureusement je me rends compte maintenant que si les rédactions avaient été faites en utilisant des plages bien bornées comme par exemple RECHERCHEV($A2;Data!$A1:$L818;2;FAUX) au lieu de RECHERCHEV($A2;Data!$A:$L;2;FAUX), les calculs seraient + rapides maintenant.

Donc les formules dont la rédaction sont à corriger peuvent être un peu partout dans le fichier, oui.

Et les formules à corriger sont imbriquées dans des algos + complexes, comme par exemple :

=SI('Feuillet1'!$I$366="XX";RECHERCHEV(A29&B29&C29&D29;'Feuillet12'!DC:DD;2;FAUX)-RECHERCHEV(A29&B29&C29&D29;Feuillet13'!DC:EB;26;FAUX);SI(Feuillet1'!$I$366="AA";RECHERCHEV(A29&B29&C29&D29;'Feuillet12'!DC:EB;26;FAUX);SI('Feuillet1'!$I$366="BB";RECHERCHEV(A29&B29&C29&D29;'Feuillet12'!DC:FC;53;FAUX);RECHERCHEV(A29&B29&C29&D29;'Feuillet12'!DC:DZ;24;FAUX))))

Et j'en ai des millions comme ça...

voili voilou

Merci bcp de ton aide en tous cas!

Nicole

Je pense qu'on s'est mal compris, je comprends très bien ta problématique tu veux réduire la matrice de recherche pour accélérer le traitement.

Les formules à modifier sont effectivement présentes dans toutes les cellules on est d'accord

Mais ma question est la suivante:

La formule de ta cellule C est celle là:

=RECHERCHEV($A1;Data!$A:$L;3;FAUX) pour la ligne 1

est ce que quel que soit x numéro de ligne la formule dans la ligne x de la colonne c est celle la:

=RECHERCHEV($Ax;Data!$A:$L;3;FAUX)

nono78 a écrit :

Mais ma question est la suivante:

La formule de ta cellule C est celle là:

=RECHERCHEV($A1;Data!$A:$L;3;FAUX) pour la ligne 1

est ce que quel que soit x numéro de ligne la formule dans la ligne x de la colonne c est celle la:

=RECHERCHEV($Ax;Data!$A:$L;3;FAUX)

Ce cas de figure est un cas très répandu en effet.

J'ai beaucoup de tableaux qui fonctionnent ainsi. Le seul bémol, par rapport à ton exemple, c'est que le tableau et (donc la première formule) n'est pas forcément située dans la ligne 1, mais peut être en ligne 2, 3, 4... Mais ensuite, oui, dans bon nombre de cas, les cellules situées sous cette première cellules sont "étendues" comme dans ton exemple.

Donc pour reprendre l'algo que je mentionnais précédemment, dans un tableau, je peux avoir :

=SI('Feuillet1'!$I$366="XX";RECHERCHEV(A29&B29&C29&D29;'Feuillet12'!DC:DD;2;FAUX)-RECHERCHEV(A29&B29&C29&D29;Feuillet13'!DC:EB;26;FAUX);SI(Feuillet1'!$I$366="AA";RECHERCHEV(A29&B29&C29&D29;'Feuillet12... etc...

et dans la cellule du dessous :

=SI('Feuillet1'!$I$366="XX";RECHERCHEV(A30&B30&C30&D30;'Feuillet12'!DC:DD;2;FAUX)-RECHERCHEV(A30&B30&C30&D30;Feuillet13'!DC:EB;26;FAUX);SI(Feuillet1'!$I$366="AA";RECHERCHEV(A30&B30&C30&D30;'Feuillet12... etc...

etc... et cela sur des milliers de ligne.

Alors dans l'exemple ci-dessus, il me suffit de faire un "remplacer (Feuillet12'!DC:DD) par (Feuillet12'!DC1:DD1000)", mais "Feuillet12'!DC:DD" n'est pas la seule plage concernée dans mon fichier, j'ai des centaines de plages concernées...

Petites questions :

1. si toutes ces plages mal définies (qui sont des centaines de plages différentes) ne dépassent pas X lignes, penses-tu qu'il serait possible de remplacer toutes les plages (mal) définies seulement par des colonnes dans le fichier par une plage mieux bornée et qui reprendrait les colonnes initiales de la formule en commençant à la ligne 1 et terminant à la ligne X? Donc par exemple, faire en sorte que toute mention de "Feuillet12'!DC:DD" devienne "Feuillet12'!DC1:DDX", toute mention de "Feuillet13'!DC:EB" devienne "Feuillet13'!DC1:EBX", etc...

2. est-ce que tu penses que cela générerait un gain de temps de calcul, sachant que je pense que X serait probablement vers 1500?


nicopat a écrit :
nono78 a écrit :

Petites questions :

1. si toutes ces plages mal définies (qui sont des centaines de plages différentes) ne dépassent pas X lignes, penses-tu qu'il serait possible de remplacer toutes les plages (mal) définies seulement par des colonnes dans le fichier par une plage mieux bornée et qui reprendrait les colonnes initiales de la formule en commençant à la ligne 1 et terminant à la ligne X? Donc par exemple, faire en sorte que toute mention de "Feuillet12'!DC:DD" devienne "Feuillet12'!DC1:DDX", toute mention de "Feuillet13'!DC:EB" devienne "Feuillet13'!DC1:EBX", etc...

2. est-ce que tu penses que cela générerait un gain de temps de calcul, sachant que je pense que X serait probablement vers 1500?

Quand j'y réfléchis, je pense que c'est carrément possible, car il suffirait de remplacer toutes mentions du type A:A, B:B, C:C, etc... par A1:A1500, B1:B1500, C1:C1500, etc...

A première vue, je ne vois pas de cas de figure qui serait problématique.

Ce serait un "remplacer par" sérialisé.

Reste à savoir comment faire cela et si ça gagnerait du temps de calcul.

Re,

Ce bout de code marche pour les rechercheV, appliques le SUR UNE COPIE IDENTIQUE DE TON FICHIER, et dis moi ce que ça donne en terme de rapidité:

Sub def_plage_recherchev()

For Each sht In Sheets
sht.Activate
On Error Resume Next
    For Each Cell In ActiveSheet.UsedRange
        If Cell.HasFormula = True Then
            Plage = Split(Cell.Formula, ",")(1) & "1500"
            Plage = Replace(Plage, ":", "1:")
            a = Split(Cell.Formula, ",")(1)
            Cell.Formula = Replace(Cell.Formula, a, Plage)
        End If
    Next Cell
Next sht

End Sub

Juste une précision, dans ton module supprimes option base 1 et option explicit

nono78 a écrit :

Juste une précision, dans ton module supprimes option base 1 et option explicit

J'ai cherché à faire ça mais je n'ais pas trouver.

Comment accéder à ces options?

J'ai lancé cette macro dans une copie de mon fichier, et j'ai vu apparaître des cellules en erreur à de nombreux endroits.

En regardant de plus près, j'ai vu des cellules dont les formules ne contenaient pas des recherchev() et dont le contenu avait néanmoins été modifié.

Donc apparemment, il doit y avoir un pb (je ne sais pas si c'est du au fait que je n'étais pas parvenue à modifier les options mentionnées).


Sinon, j'envisage une solution pas très intelligente, mais qui devrait fonctionner je pense : lancer un remplacement de toutes les combinaisons de :

"a:b"

"a:c"

"a:d"

"b:c"

"b:d"

etc jusqu'à QX (colonne la plus extrême utilisée dans mon classeur par :

"a1:b1500"

"a1:c1500"

"a1:d1500"

"b1:c1500"

"b1:d1500"

etc...

je pense utiliser une macro de ce type :

Public Sub Rempl()
Dim feuil As Worksheet
For Each feuil In ThisWorkbook.Worksheets
    feuil.Cells.Replace What:="ExpA", Replacement:="ExpB",lookat:=xlpart
    feuil.Cells.Replace What:="ExpC", Replacement:="ExpD",lookat:=xlpart
Next feuil
End Sub

C'est bien bourrin, mais je ne vois pas pourquoi ça ne fonctionnerait pas...

nicopat a écrit :

C'est bien bourrin, mais je ne vois pas pourquoi ça ne fonctionnerait pas...

En même temps, je suis en train de réaliser que ça fait environ 90.000 "remplacer par" à réaliser dans tout le fichier...

et sans même savoir si je gagnerai du temps de calcul au final...

Bon, je n'arrive pas à faire fonctionner une macro faisant les "remplacer par".

J'ai créé un thread à cet effet ici : https://forum.excel-pratique.com/post516618.html#p516618

Je suis preneuse de toute suggestion...

Rechercher des sujets similaires à "accelerer fichier"