Macro / Temps exécution trop lent

Bonjour le forum

Je reviens vers pour vous exposer un problème de lenteur hors normal dans l’exécution d'une macro

J'utilise cette macro pour RESET d'une cinquantaine de champs nommés sur une seule feuille d'un classeur

Dim n As Name
For Each n In ActiveWorkbook.Names
   if n.RefersToRange.Parent.name = ActiveSheet.name then
       n.RefersToRange.value =""
    end if
Next n
Set n = Nothing

Son problème c'est que son temps d’exécution est anormal. (15 à 20 s )

J'ai essayé d'utiliser toutes les astuces recommandées, comme:

  • application.screenupdating=false
  • application.screenupdating=True
  • application.calculation=xlmanual
  • application.calculation=xlAutomatic

mais aucun résultat observé.

de ce fait, je m'adresse aux experts, pour une solution possible pouvant résoudre ce problème.

Merci d'avance

Bonjour,

impossible de deviner sans un classeur exemple.

eric

Bonjour,

En attendant d'examiner le fichier, essaie ainsi :

Sub xxx()
    Dim n As Name, nf$
    nf = ActiveSheet.Name
    Application.ScreenUpdating = False
    For Each n In ActiveWorkbook.Names
        With n.RefersToRange
            If .Parent.Name = nf Then .ClearContents
        End With
    Next n
End Sub

bonjour Mferrand

merci pour l'initiative

cette macro me donne une erreur à ce niveau

err

Erreur 1004 > Erreur définie par l'application ou par l'objet

A+

Quand j'aurai constaté l'erreur sur un fichier, je ferai le nécessaire pour l'éliminer !

MFerrand a écrit :

Quand j'aurai constaté l'erreur sur un fichier, je ferai le nécessaire pour l'éliminer !

Bonsoir Mferand, le forum

La confiance en soi est le premier secret des experts en la matière. rdi2:

T'as raison.

Ton code est bien fonctionnel après lui avoir inséré "On Error Resume Next"

il parait que le problème était dans mon fichier.

d'autre part, le code est remarquablement mieux que celui que j'avais. je te remercie beaucoup

mieux vaut que jamais

mais quand même le temps d’exécution reste toujours un peu gênant.

puis-je te demander gentiment une modification du code qui conduit à limiter la recherche et la RAZ des champs nommés au niveau d'un plage bien défini. Je pense q'avec cette astuce, le temps peut être réduit au max.

la plage qui contient les champs nommés est limité en A7:X280.

Nom feuille TRANS

Merci beaucoup.

Autre essai :

Sub xxx()
    Dim n As Name, nf$, pleff$
    nf = "TRANS"
    For Each n In ActiveWorkbook.Names
        With n.RefersToRange
            If .Worksheet.Name = nf Then pleff = "," & .Address
        End With
    Next n
    pleff = Replace(pleff, ",", "", 1, 1)
    Worksheets(nf).Range(pleff).ClearContents
End Sub

Bonjour Mferand, le forum

Merci pour cet aimable coup de main.

d'après mes différents essais pour ce nouveau code, et sauf erreur de ma part, j'ai pu constater que la RAZ se faite uniquement sur la dernière cellule nommée.

par essai, si on supprime complètement le nom de la dernière cellule, la RAZ prend la cellule avant-dernière qui est devenue la dernière bien sûr.

A+

Dernier essai :

Sub xxx()
    Dim n As Name, nf$, pleff$, i%
    nf = "TRANS"
    For Each n In ActiveWorkbook.Names
        With n.RefersToRange
            If .Worksheet.Name = nf Then pleff = ";" & .Address
        End With
    Next n
    pleff = Split(pleff, ";")
    Application.ScreenUpdating = False
    With Worksheets(nf)
        For i = 1 To UBound(pleff)
            .Range(pleff(i)).ClearContents
        Next i
    End With
End Sub

Bonjour

Le nouveau code s’arrête à UBound et me donne :

Erreur de compilation > Tableau attendu

quoi qu'il en soit, je te remercie et j’apprécie ton intervention.

cordialement

Exact, omis de modifier déclaration !

Mettre pleff au lieu de pleff$ dans la ligne de déclaration.

MFerrand a écrit :

Exact, omis de modifier déclaration !

Mettre pleff au lieu de pleff$ dans la ligne de déclaration.

Re

Oui l'erreur a disparu, mais cette foisci et après plusieurs essai la macro ne prend que la première cellule nommée.

Rechercher des sujets similaires à "macro temps execution trop lent"