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 :

Remonter cellule non vide d'une ligne si Cellule A de cette dernière et vide


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2017
    Messages : 5
    Par défaut Remonter cellule non vide d'une ligne si Cellule A de cette dernière et vide
    Bonjour à tous,

    Je travaille actuellement sur un gros fichier de plusieurs feuille, et je cherche comme faire en VBA pour remonté les cellule non vide d'une ligne, à la ligne du dessus, suivant si la cellule A est vide.

    J'ai chercher un peut partout mais pas réussi a mettre la main sur ce que je cherche.

    J espere avoir été assez clair dans ma demande.

    Merci a toutes la communauté pour votre aide.

  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 176
    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 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Question récurrente sur les forums
    Pour supprimer des lignes vides d'une liste, on commence depuis la dernière ligne remplie de cette liste et on la remonte vers la première

    En supposant que la liste commence à la première ligne de la feuille et que ce ne soit pas une table structurée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub t()
      Dim LastRow As Long
      Dim R As Long
      With ThisWorkbook.Worksheets("Feuil1")
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
        For R = LastRow To 1 Step -1
         If Len(.Cells(R, "A")) = 0 Then
         .Rows(R).Delete
         End If
        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

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2017
    Messages : 5
    Par défaut
    Bonjour Philippe,

    Tous d'abord merci de te pencher sur mon problème.

    Merci pour ton code mais il ne correspond pas exactement a ce que je recherche, je vais essayer d’être plus précis.

    Mon tableau ce compose des colonne A à P, les colonnes G:M sont parfois remplis par un OUI si la prestation est effectué ou vide si elle ne l'ai pas.

    Sur la ligne 1, j'ai des OUI en G:H et en A1 un numéro de département qui sera toujours présent si la ligne et valide.

    Sur les lignes 2 et 3 j ai seulement des donnés de I:M (OUI) qui devrait ce trouver en fait sur la ligne 1, parfois le problème est sur 2 ligne ( ligne 2 et 3 devrait être en ligne 1) parfois sur une seul ligne (ligne 5 devrait être en ligne 4) toujours sur les colonne G:M, ce problème c'est crée lors d'une importation.

    Ce que je voudrais c'est en me basant sur la colonne A, si cette dernière et vide sur la ligne, les données de G:M doivent remonter sur la ligne au dessus, en partant du bas tu tableau, et si dans la même macro, je peut en même temps supprimer ensuite les lignes qui seront ensuite complètement vide ce serai le top.

    J espère que j'ai été assez claire, si tu a besoin d'un exemple, dit le moi je referait un tableau a l'identique car celui sur lequel je travaille contient des infos confidentiel.

    Merci d'avance encore pour ton aide.

  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 176
    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 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'avoue que l'explication m'est incompréhensible.
    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 confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Comme Philippe, je n'y comprends rien .
    Postes des copies d'écran avant / après (avec plusieurs cas)

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2017
    Messages : 5
    Par défaut
    Salut,

    Merci a tous les deux en effet en me relisant moi non plus je comprend pas

    Je vous joint un exemple:

    Ce que je voudrai c'est que les cellule en VERT remonte sur ceux en BLEU au dessus, si il n'y a pas de département en colonne A.

    Et ensuite supprimer les ligne 3,4,6,8 et 9 qui après cette manip seront complètement vide.

    Dite mois si ce n'est toujours pas assez clair.

    Merci encore
    Fichiers attachés Fichiers attachés

  7. #7
    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 176
    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 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je vous joint un exemple:
    Pour ma part, ce n'est pas d'un classeur à ouvrir que j'ai besoin pour comprendre mais d'une ou plusieurs images affichées.

    Je sais que la tendance dans certains forums est de déposer un classeur sans autres explications et le dépôt d'un autre classeur pour réponse mais ma conception d'un forum est le partage lisible facilement des questions ainsi que des réponses afin que tout le monde en profite sans ouvrir des classeurs
    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

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2017
    Messages : 5
    Par défaut
    Philippe,

    Pas de problème, il est vrai que c'est plus simple pour que tous le monde en profite, ci joint la capture d’écran
    Nom : image_2020-10-25_110310.png
Affichages : 861
Taille : 54,2 Ko

    Je remet ce que je cherche a faire :

    Ce que je voudrai c'est que les cellule en VERT remonte sur ceux en BLEU au dessus, si il n'y a pas de département en colonne A.

    Et ensuite supprimer les ligne 3,4,6,8 et 9 qui après cette manip seront complètement vide.


    Merci encore

  9. #9
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Essaies :
    EDIT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub RemonterLesOui2()
    Dim dL&, nL&, nC%
      With Worksheets("Feuil1")
        dL = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
        For nL = dL To 3 Step -1
          If .Cells(nL, "A").Formula = "" Then
            For nC = 7 To 13
              If .Cells(nL, nC).Value = "oui" Then .Cells(nL - 1, nC).Value = "oui"
            Next nC
            .Rows(nL).Delete
          End If
        Next nL
      End With
    End Sub
    EDIT2 : Autre méthode 10 à 15 fois plus rapide en utilisant avec un tableau VBA :
    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
    Option Explicit
    Sub RemonterLesOui()
    Dim t, i&, n&, j%
      t = Worksheets("Feuil1").Range("A1").CurrentRegion.Value
      n = 2
      For i = 3 To UBound(t)
        If IsEmpty(t(i, 1)) Then
          For j = 7 To 13
            If t(i, j) = "oui" Then t(n, j) = "oui"
          Next j
        Else
          n = n + 1
          For j = 1 To UBound(t, 2)
            t(n, j) = t(i, j)
          Next j
        End If
      Next i
      Worksheets("Feuil1").Range("A1").CurrentRegion.Value = t
      If n < UBound(t) Then Worksheets("Feuil1").Rows(n + 1 & ":" & UBound(t)).Delete
    End Sub

  10. #10
    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 176
    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 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La procédure de Patrice est nettement plus courte que la mienne mais comme j'y ai passé un peu de temps, je la publie tout de même

    La feuille se nomme Prestation, remonte les cellules remplies (il suffit de tester "Oui" au lieu du nombre de caractères) des colonnes H à M (à modifier éventuellement) des lignes des cellules vides de la colonne A
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Sub t()
      ' Déclaration
      Dim rng As Range
      Dim Cell As Range
      Dim tbl()
      Dim Column As Integer
      Dim Elem As Long
      Dim Count As Long
      Dim RowNumberToFill As Long
      Dim LastRowProcessed As Long
      '
      Set rng = ThisWorkbook.Worksheets("Prestation").Range("A1").CurrentRegion
      Application.ScreenUpdating = False
      ' Détecte les lignes vides
      For Each Cell In rng.Resize(ColumnSize:=1)
        If Len(Cell.Value) = 0 Then
           ReDim Preserve tbl(Count)
           tbl(Count) = Cell.Row
           Count = Count + 1
        End If
      Next
      ' Examine les cellules des colonnes H à M des lignes vides et les remontes
      With rng
        For Elem = 0 To UBound(tbl)
          If LastRowProcessed Then
             If LastRowProcessed <> tbl(Elem) - 1 Then
                RowNumberToFill = tbl(Elem) - 1 ' N° de ligne à remplir
                LastRowProcessed = tbl(Elem)
             End If
           Else
             LastRowProcessed = tbl(Elem): RowNumberToFill = tbl(Elem) - 1
          End If
          For Column = 8 To 13 ' Parcours les colonnes H à M
            If Len(.Cells(tbl(Elem), Column)) Then
               .Cells(tbl(Elem), Column).Cut Destination:=.Cells(RowNumberToFill, Column)
            End If
          Next
        Next
      End With
      ' Suppression des lignes
      With rng
        For Elem = UBound(tbl) To 0 Step -1
        .Rows(tbl(Elem)).Delete Shift:=xlUp
        Next
      End With
      Set rng = Nothing: Set Cell = Nothing
    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

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2017
    Messages : 5
    Par défaut
    Merci beaucoup,

    Je ne suis pas chez moi pour le moment je test ça demain matin est reviens vers vous.

    Bon dimanche a vous.

Discussions similaires

  1. Réponses: 5
    Dernier message: 18/03/2020, 10h08
  2. Réponses: 4
    Dernier message: 13/02/2020, 09h21
  3. [WD-2010] Style non-conforme d'une ligne insérée dans un tableau
    Par GBW067 dans le forum Word
    Réponses: 2
    Dernier message: 16/11/2018, 10h36
  4. Réponses: 1
    Dernier message: 18/05/2017, 11h29
  5. [Jtable]comment permettre le non selection d'une ligne ?
    Par Invité dans le forum Composants
    Réponses: 1
    Dernier message: 30/11/2005, 11h36

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