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 :

Besoin d'aide pour alléger une boucle


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien eaux
    Inscrit en
    Mars 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien eaux

    Informations forums :
    Inscription : Mars 2014
    Messages : 3
    Par défaut Besoin d'aide pour alléger une boucle
    Bonjour à tous,

    J'utilise un code pour décaler mes cellules vides sur chaque ligne de ma feuille.
    Le problème c'est que l'exécution est très longue car j'ai environ 6000 lignes.

    J'aurais besoin d'aide pour rendre la démarche plus rapide

    je vous soumets le code :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    For i = 2 To lig
     
                    'si ast1(col7) vide, décale les autres (répete 3x  si juste ast4(col10) remplie)
                    hit = 1
                    Do
                        If Cells(i, 7).Value = "" Then
                            'décalage des 2 premières
                            Range(Cells(i, 8), Cells(i, 9)).Cut
                            ActiveSheet.Paste Destination:=Range(Cells(i, 8), Cells(i, 9)).Offset(0, -1)
                            'décalage de la dernière
                            Cells(i, 10).Cut
                            ActiveSheet.Paste Destination:=Cells(i, 10).Offset(0, -1)
                            hit = hit + 1
                        End If
                    Loop While hit < 4
     
                    'si ast2(col8) tjr vide, décale les suivantes (répète 2x)
                    hit = 1
                    Do
                        If Cells(i, 8).Value = "" Then
                            Range(Cells(i, 9), Cells(i, 10)).Cut
                            ActiveSheet.Paste Destination:=Range(Cells(i, 9), Cells(i, 10)).Offset(0, -1)
                            hit = hit + 1
                        End If
                    Loop While hit < 3
     
                    'si ast3(col9) tjr vide, décale les suivantes pas besoin de répétition.
                    If Cells(i, 9).Value = "" Then
                        Cells(i, 10).Cut
                        ActiveSheet.Paste Destination:=Cells(i, 10).Offset(0, -1)
                    End If
     
                Next i
    Je vous remercie déjà de votre lecture.

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Il faudrait que tu décrives plus précisément ce que doit faire ton code.
    Par exemple, pourquoi les boucles Do Until sur les "hit" ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Technicien eaux
    Inscrit en
    Mars 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien eaux

    Informations forums :
    Inscription : Mars 2014
    Messages : 3
    Par défaut
    En fait je cherche à supprimer les cellules vides sur chaque ligne pour les colonnes 7 à 10.

    Pour cela, j'ai pensé à tester la première cellule i,7 si elle est vide, je décale les trois suivante d'un rang vers la gauche.

    les Do me servent à répéter l'opération tant que la première cellule est vide.

    actuellement, j'ai ceci :

    x| x| x| x|
    x| | | x|
    | x| x| x|
    | | x| x|

    et je voudrais cela :

    x| x| x| x|
    x| x| | |
    x| x| x| |
    x| x| | |

    mais je ne sais pas trop gérer les boucles, et je n'ai pas d'autres idées pour arriver à ce résultat.

  4. #4
    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 163
    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 163
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour cela, j'ai pensé à tester la première cellule i,7 si elle est vide, je décale les trois suivante d'un rang vers la gauche.
    Pourquoi les décaler ?
    Si tu dois supprimer une ligne si une ou plusieurs cellules sont vides, la codification sera différente. Une simple boucle partant de la dernière ligne en direction de la première avec un test est suffisant.
    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

  5. #5
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Je crois que j'ai compris (mais pas trop sûr).

    Pour chaque ligne, tu souhaites supprimer les cellules vides. Si tu trouves dans la ligne une cellule vide, tu l'écrases en décalant ce qui est à sa droite d'un cran.

    C'est ça ?

    Déjà, dans ton code, je ne comprends pas pourquoi tu as utilisé des Do While et non pas des For to, beaucoup plus simples à utiliser.

    Mais tu te compliques la vie.

    Ceci devrais suffire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i = 2 To lig
       For hit = 9 To 7 Step -1
          If Cells(i, hit) = "" Then Cells(i, hit).Delete Shift:=xlToLeft
       Next hit
    Next i

  6. #6
    Candidat au Club
    Homme Profil pro
    Technicien eaux
    Inscrit en
    Mars 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien eaux

    Informations forums :
    Inscription : Mars 2014
    Messages : 3
    Par défaut
    Oui je me suis compliqué la vie mais je ne voyais pas comment faire.

    A vrai dire je n'ai pas pensé à partir de la fin pour revenir au début.

    je vais essayé ça et je reviens vous dire...

    ... On ne peut pas mieux faire ! c'est exactement ce que je cherchais depuis ce matin !

    Merci infiniment.

  7. #7
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Ou peut être directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil1").Range("G2").Resize(Lig, 4).SpecialCells(xlCellTypeBlanks).Delete Shift:=xlToLeft

  8. #8
    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 163
    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 163
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Deux syntaxes possibles
    S'il faut contrôler une seule colonne, avec la propriété SpecialCells(xlCellTypeBlanks)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub t()
     Dim rng As Range
     Set rng = ActiveSheet.Range("A1:A75")
     rng.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    End Sub
    Avec le contrôle de plusieurs colonnes sur la même ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub t2()
     Dim rng As Range, r As Long
     Set rng = ActiveSheet.Range("A1").CurrentRegion
     With rng
      For r = .Rows.Count To 2 Step -1
       If Len(.Cells(r, 1)) = 0 And Len(.Cells(r, 4)) = 0 Then .Cells(r, 1).EntireRow.Delete
      Next
     End With
    End Sub
    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

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

Discussions similaires

  1. [XL-2003] Besoin d'aide pour faire une boucle loop sur une macro
    Par spacesheep dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 14/04/2010, 11h42
  2. Réponses: 22
    Dernier message: 20/05/2008, 10h25
  3. [MySQL] Besoin d'aide pour faire une boucle
    Par plex dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 15/04/2008, 13h47
  4. [VBA-E]besoin d'aide pour faire une boucle
    Par mikazounette dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/04/2006, 14h04
  5. besoin d'aide pour intégrer une entité dans un MCD
    Par barkleyfr dans le forum Schéma
    Réponses: 17
    Dernier message: 13/10/2005, 13h29

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