IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Optimiser le temps de traitement


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 61
    Points : 13
    Points
    13
    Par défaut Optimiser le temps de traitement
    Bonjour à tous !

    J'ai codé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub CommandButton2_Click()
     
    Dim Cell As Range
     
        Application.ScreenUpdating = False
     
        For Each Cell In Range("CE12:CE397")
     
            If Cell.value <> "N" Then
     
                Cells(Cell.Row, 83).value = "N"
            End If
        Next
     
    End Sub
    Le code marche parfaitement bien (il remplace les valeurs différentes de N par N). Le problème c'est le temps d'execution (un peu moins d'une minute), en effet il y a énormément de lignes à vérifier et modifier.

    Je me demandais donc, si il y avait une astuce pour optimiser ce temps de traitement ? (à part changer de PC bien-sûr ^^).

    Merci pour votre aide !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Vous avez quelle version d'Excel ?

    Si j'ai bien compris, vous traitez le 83e colonne, ce qui n'est pas grave, mais avez-vous des formules dans votre tableau.

    J'ai rempli 500 lignes et 82 colonnes avec des chiffres, puis la 83e colonne avec un A. Pour remplacer tous les A, il faut compter 3 secondes, avec un code différent du vôtre (et une version qui n'est pas récente 2003), mais ce n'est sans doute pas la seule raison.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 61
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par jacques_jean Voir le message
    Bonjour,

    Vous avez quelle version d'Excel ?

    Si j'ai bien compris, vous traitez le 83e colonne, ce qui n'est pas grave, mais avez-vous des formules dans votre tableau.

    J'ai rempli 500 lignes et 82 colonnes avec des chiffres, puis la 83e colonne avec un A. Pour remplacer tous les A, il faut compter 3 secondes, avec un code différent du vôtre (et une version qui n'est pas récente 2003), mais ce n'est sans doute pas la seule raison.
    Oui je rempli uniquement la 83ème colonne, elle est composée soit de R, soit de N, pas de formule dans la colonne mais une formule dans chaque cellule, dans un tableau qui comporte 385 lignes et 159 colonnes. Je suis sur Excel 2010. Pouvez-vous me fournir le code que vous avez utilisé ?

  4. #4
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Aucun code VBA n'est ici nécessaire.
    Cette seule formule excel en (exemple) XX1 :
    puis étirée vers le bas jusqu'en XX40
    mettra en colonne XX de chaque ligne, de la ligne 1 à la ligne 40, un "N" pour chaque valeur de la colonne A <> "N" !
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Voici le code (simpliste) :

    Sub Changer()
    Dim i&, pl&, dl&, x As String
    pl = 1 '1re ligne
    dl = 500 'dernière ligne

    For i = pl To dl
    x = Cells(i, 83)
    If x <> "N" Then
    Cells(i, 83) = "N"
    End If
    Next i


    End Sub
    Mais si vous avez de nombreuses formules vous pouvez mettre au début :

    With Application
    .Calculation = xlManual
    End With
    et à la fin :

    With Application
    .Calculation = xlAutomatic
    End With

  6. #6
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 61
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par unparia Voir le message
    Bonjour
    Aucun code VBA n'est ici nécessaire.
    Cette seule formule excel en (exemple) XX1 :
    puis étirée vers le bas jusqu'en XX40
    mettra en colonne XX de chaque ligne, de la ligne 1 à la ligne 40, un "N" pour chaque valeur de la colonne A <> "N" !
    Merci pour ta réponse unparia,

    Je ne veux pas simplement remplacer le contenue des cellules de ma colonne. L'idée c'est que l'utilisateur en appuyant sur l'un des deux boutons passe du R au N et inversement à sa guise (car cela modifie les calculs effectués).

    Donc j'ai besoin de VBA. à l'époque où j'ai tapé ce code, le traitement était plus rapide (mais le fichier n'était pas rempli comme aujourdhui).

  7. #7
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 61
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par jacques_jean Voir le message
    Voici le code (simpliste) :



    Mais si vous avez de nombreuses formules vous pouvez mettre au début :



    et à la fin :
    Donc le fait que les cellules contiennent des formule ralenti l'application de ce code ?

    Je vais tenter de les désactiver, comme vous me l'avez conseillé.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Je ne sais pas si vous avez lu ma réponse (avant-dernière).

  9. #9
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 61
    Points : 13
    Points
    13
    Par défaut
    J'ai ajouté les lignes qui désactive le calul automatique, cela fonctionne parfaitement. Merci énormément Jacques !

    Je laisse le code complet pour les éventuels intéréssé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Private Sub CommandButton1_Click()
     
    Dim Cell As Range
     
        Application.ScreenUpdating = False
     
    With Application
    .Calculation = xlManual
    End With
     
        For Each Cell In Range("CE12:CE397")
     
            If Cell.value <> "R" Then
     
                Cells(Cell.Row, 83).value = "R"
            End If
        Next
     
    With Application
    .Calculation = xlAutomatic
    End With
     
    End Sub
    Bonne journée !

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 27
    Points : 9
    Points
    9
    Par défaut
    Bonsoir,

    Dans ton premier message tu parles de temps d'exécution de ta macro : l'utilisation de variables tableau permet un gain de temps.
    1) déclarer la variable : dim monTableau() as string (quelques fois excel demande le type variant)
    2) charger la variable : worksheets("Feuil1").range("A2:C814").value
    3) utiliser une boucle : for i = lbound(monTableau) to ubound(monTableau)
    ... insérer le code souhaité...
    next i
    4) décharger la variable : erase monTableau

    SylvieB

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Eh bien, il ne vous reste plus qu'à exécuter un exemple avec un tableau de 500 lignes et 83 colonnes et par rapport à un temps d'exécution de 3 secondes vous précisez le nombre de secondes gagnées ? Et ne pas oublier que le gain principal vient de la modification du mode de calcul des formules étant donné que ce nombre est important et que c'est le calcul automatique qui augmente énormément le temps d'exécution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. optimiser le temp du traitement d'une boucle
    Par riad_09 dans le forum Développement
    Réponses: 1
    Dernier message: 05/11/2009, 08h38
  2. Réponses: 2
    Dernier message: 11/04/2009, 12h57
  3. optimisation du temps de traitement cat
    Par josepeemiasa dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 10/03/2008, 18h35
  4. Optimisation du temps de traitement
    Par djuddju dans le forum Oracle
    Réponses: 4
    Dernier message: 20/04/2006, 21h16
  5. optimisation de temps de traitement xml/xslt
    Par Erwy dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/05/2004, 16h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo