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 :

Optimisation d'une boucle for


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2013
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 81
    Par défaut Optimisation d'une boucle for
    Bonjour,

    C'est la troisième fois que je vous demande quelque chose en peu de temps, j'en ai conscience, mais vos aides m'ont vraiment été utiles jusqu'ici et je bloque vraiment sur un programme pourtant simple...

    Je désire simplement supprimer les lignes qui affichent 0 dans la colonne F et rajouter FA devant les autres chiffres.
    Le code qui suit marche... mais il est incroyablement lent ! (environ une ligne par minute, et mon ordinateur plante au bout d'un moment) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub rajout_FA()
    ' à finir : l'idée est de supprimer les lignes avec 0 en valeur, puis de concatnéer la colonne 2 avec FA)
    For i = 87695 To 6 Step -1
        If Cells(i, 6) = 0 Then
            Rows(i).Delete
        Else: Cells(i, 6) = "FA" & Cells(i, 6)
        End If
    Next i
    End Sub
    N'y a-t-il pas moyen de l'optimiser ?

    Je vous remercie par avance,
    Novice_VBA

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Tu peux déjà ajouter en début de procédure la ligne suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Application.ScreenUpdating = False
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    déjà tu scannes depuis 87695?
    si c'est le nombre de ligne que tu as pas de problème, si tu en à que 10 alors ta boucle est trop longue.

    couplé avec la proposition de Philippe Tulliez ça devrait aller.

    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
    Sub rajout_FA()
    ' à finir : l'idée est de supprimer les lignes avec 0 en valeur, puis de concatnéer la colonne 2 avec FA)
    Dim Plage As Range
    Dim Start As Long
    Dim Fin As Long
    Set Plage = ActiveSheet.UsedRange
    Start = Range(Plage(1, 1).Address).Row - 1
    Fin = Plage.Rows.Count + Start
    Set Plage = Nothing
    For i = Fin To 6 Step -1
        If Cells(i, 6) = 0 Then
            Rows(i).Delete
        Else: Cells(i, 6) = "FA" & Cells(i, 6)
        End If
    Next i
    End Sub

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2013
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 81
    Par défaut
    Bonjour,

    Merci

    Je vais essayer de rajouter ce que vous m'avez dit.
    Malheureusement, rdurupt, je veux bien commencer à cette ligne là... (le code que vous m'avez donné rendait mon code plus efficient ou permettait juste de réduire le nombre de lignes si j'en avais trop ?)

    Je vous tiens au courant,

    Novice_vba

  5. #5
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    et en passant par des tableaux ?
    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
    Sub rajout_FA()
    Dim tbl(), i As Long, dl As Long, v As Long
    Dim Cible()
    dl = Range("F" & Rows.Count).End(xlUp).Row
    ReDim tbl(1 To dl)
    tbl = Range("F6:F" & dl)
    v = 0
    For i = 1 To UBound(tbl)
      If tbl(i, 1) <> 0 Then
        v = v + 1
        ReDim Preserve Cible(1 To v)
        Cible(v) = "FA" & tbl(i, 1)
      End If
    Next i
     
    Range("F6:F" & dl).ClearContents
    Range("F6").Resize(UBound(Cible), 1) = WorksheetFunction.Transpose(Cible)
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2013
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 81
    Par défaut
    Bonjour,

    Mon ordinateur étant très lent, et le programme toujours lourd malgré les modifications, j'ai envisagé - comme l'a suggéré Evandermeulen - d'utiliser un tri (mais je garderai précieusement les autres idées en mémoire pour d'autres longs programmes).

    Par contre, j'aimerais pouvoir récupérer sur un onglet à part les lignes qui ont été trié (ce qui revient finalement à la même chose).
    Pensez-vous que cela prendra moins de temps ? (la différence est que supprimer une ligne excel est long, alors que copier la vingtaine de colonne par ligne dont j'ai besoin devrait prendre moins de temps, non ?)

    Peut-être aussi existe-t-il un moyen que je ne connais pas de faire un copier-coller manuel d'une feuille excel triée vers une autre non triée sans que les exigences de format ne pose problème ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Si tu filtres tes données et que tu veux les exporter dans un autre onglet une seule ligne de code suffi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil1").UsedRange.SpecialCells(xlCellTypeVisible).Copy Worksheets("Feuil2").Range("A1")

  8. #8
    Membre Expert Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Par défaut
    Edit: Semi-doublon, désolé...

    Salut,

    Tu peux essayer en utilisant ces lignes en début de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.ScreenUpdating = False 'Fige l'écran
    Application.Calculation = xlCalculationManual 'Désactive les calculs automatiques
    Et il faut bien entendu réactiver en fin de code grâce à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    Sans quoi ta boucle est tout à fait correcte.
    La seule autre piste, si tu supprime beaucoup de 0 est de faire la suppression via un filtre

Discussions similaires

  1. Optimisation d'une boucle for each
    Par misscricri dans le forum VB.NET
    Réponses: 3
    Dernier message: 26/01/2012, 00h06
  2. erreur pendant l'optimisation d'une boucle for
    Par bakaratoun dans le forum MATLAB
    Réponses: 2
    Dernier message: 29/01/2010, 15h44
  3. optimiser une boucle for
    Par bakaratoun dans le forum MATLAB
    Réponses: 2
    Dernier message: 28/01/2010, 15h22
  4. Optimisation d'une boucle for
    Par Vorlane dans le forum MATLAB
    Réponses: 0
    Dernier message: 07/07/2009, 12h36
  5. optimiser mon code avec une boucle for?
    Par Invité dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 16/11/2007, 09h33

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