Suppression de lignes vide a intégrer dans une macro

Résolu
shynseby Messages postés 22 Statut Membre -  
shynseby Messages postés 22 Statut Membre -
Bonjour,

j'ai déjà regarder plusieurs post avec divers solution mais aucune n'a l'air de résoudre mon problème. (ou je n'ai pas tout compris)

j'ai une macro qui génère un nouveau tableau excel sur une feuille à partir de formules.
des données apparaissent mais pas à toutes les lignes. c'est normal car il y a un tri et certaines information sont supprimé volontairement.

je me retrouve avec un tableau de 20000 lignes dont les 3/4 vides.

Comment faire pour la macro me sélectionne les lignes 3 à 20000 et me supprime toutes celles qui sont vides?

je joint un passage de ma macro avec la ligne en jaune qui pose problème:

11 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour

    ta syntaxe est correcte... pourquoi pose t elle problème ?
    1
  2. shynseby Messages postés 22 Statut Membre
     
    j'ai lancé la macro et je joint des captures d'écran:


    puis visual basic s'ouvre avec la ligne en jaune



    et voila un petit aperçu du tableau (je cache volontairement les données qui peuvent être confidentiel)

    0
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Oui, je me souviens !
    Cela veut dire que tu n'as pas de cellules vides dans la zone recherchée

    pour contrecarrer:

    On Error Resume Next

    Range("A3:A20000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

    --
     Michel
    0
  4. shynseby Messages postés 22 Statut Membre
     
    bien tenter,
    Effectivement je n'ai plus le message d'erreur. mais cela ne marche pas.

    j'ai bien vérifier que mes cellules était vide et c'est le cas.


    Cependant, elles n'ont pas été vide tout le temps.
    Je m'explique.

    sur la ligne A, il y a des formules qui vont chercher des infos dans un autre tableau et s'il ne trouve rien, il affiche rien au lieu d'afficher un message d'erreur.

    Par exemple dans la case A1:



    en gros, la macro copie les formules de la ligne A et les colle sur les 20000 lignes en dessous.

    les formules et la macro marche très bien

    Ensuite, je copie les 20000 lignes et je fais un collage spécial "Valeurs" pour que mes cellules n'affiche plus mes formules mais les résultats de celle-ci.

    et ensuite j'essai de supprimer les lignes vides.

    Cela à peut-être un rapport...
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Maurice
     
    Bonjour

    faire un test avec cette macro
    Sub SupprimeLigne()
    Nlig = Cells(Rows.Count, 1).End(xlUp).Row
        On Error Resume Next
          With Range("A3:A" & Nlig)
             .SpecialCells(4).EntireRow.Delete
             '.SpecialCells(4).EntireRow.Select
          End With
        On Error GoTo 0
    End Sub
    

    A+
    Maurice
    0
    1. shynseby Messages postés 22 Statut Membre
       
      non, désolé cela ne fonctionne pas non plus.
      0
  7. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour

    en général quand il y a des formules ou on veut "rien" on a en résultat ""

    par ex si (A1="blabla";4;"")

    et "rien " n'est pas rien (raymond devos) ce qui expliquerait le message d'erreur

    envoie un extrait de ton classeur avec environ 1000 lignes, (sur 20000 lignes on procèdera peut-^tre autrement )

    Mettre le classeur sans données confidentielles en pièce jointe sur https://www.cjoint.com/
    et coller le raccourci proposé (clic droit) dans le message de réponse
    Dans l’attente

    0
  8. shynseby Messages postés 22 Statut Membre
     
    Bonjour,

    je vous joint le fichier en simplifié.

    sur 100 lignes.

    j'ai aussi raccourci la macro pour avoir uniquement l'essentiel

    le bouton pour activer la macro se situe sur la feuille STAT$ TPS.
    Les cases en verte permet de modifier les recherches

    http://www.cjoint.com/c/ELjiFDHzjMC
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Re,

      ce serait + pratique pour moi que tu m'envoies le classeur avec les formules (colonne A)

      d'avance merci
      0
    2. shynseby Messages postés 22 Statut Membre
       
      http://www.cjoint.com/c/ELjjRwB5HXC

      les formules sont dans la colonnes A de la feuille RECAP QUAI TPS
      0
  9. Maurice
     
    Bonjour
    tien mon message est pas passer
    ton tableau est pas vide dur
    il faut jouer avec les dates
    Sub Supprime()
    Application.ScreenUpdating = False
    Nlig = Cells(Rows.Count, 1).End(xlUp).Row
       For L = Nlig To 3 Step -1
          If Range("A" & L).Value2 = "" Then Rows(L).Delete
       Next
    MsgBox "Terminer"
    End Sub
    

    attention ses très long
    A+
    Maurice
    0
  10. shynseby Messages postés 22 Statut Membre
     
    Génial merci mais effectivement c'est très long car la macro va faire ça sur plusieurs feuilles.

    une idée!

    Si je remplace l'emplacement "rien" par des "0".

    cela peut être plus simple?

    j'ai trouvé sur le net:

    Sub Sup_zero()
    Dim i%

    For i = Range("A20000").End(xlUp).Row To 1 Step -1
    If Not InStr(1, LCase(Cells(i, 1).Value), "0") = 0 Then
    Rows(i).Delete
    End If

    Next i
    End Sub


    par contre je ne sais comment la faire partir de la 3eme ligne et non de la première car sur ma ligne 1, il y a mes formules de base.
    0
  11. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Si je dérange pas trop...

    pour les essais j'ai ajouté une feuille "essai" pour ne pas effacer la feuille "recap" et tout recharger en cas d'erreur eou de nouveau test
    il reste à masquer les zéros et mettre au format des dates heures (a toi de jouer)

    100 lignes traitées en 4/100 de seconde

    merci de me dire le temps pour 20 000lignes (j'ai dans la t^te une autre solution peut-^tre + rapide)

    Option Explicit
    '---------------------------------------------
    Sub affiner()
    Dim Derlig As Integer, T_brut, Nbre As Integer, T_fin
    Dim Lig As Integer, Cptr As Integer, Col As Byte
    Dim start As Single

    '--------------------------------initialisations
    Application.ScreenUpdating = False
    start = Timer
    With Sheets("RECAP QUAI TPS")
    'mémorisation en RAM de recap quai
    Derlig = .Columns("A").Find(what:="*", searchdirection:=xlPrevious).Row
    T_brut = .Range("A3:AI" & Derlig)
    'taille variable-tableau final
    Nbre = Application.CountIf(.Columns("A"), ">" & 0)
    ReDim T_fin(1 To Nbre, 1 To 35)

    '--------------------------------traitement
    For Lig = 1 To UBound(T_brut)
    If T_brut(Lig, 1) <> "" Then
    Cptr = Cptr + 1
    'remplissage tableau fin
    For Col = 1 To 35
    T_fin(Cptr, Col) = T_brut(Lig, Col)
    Next
    'sortie si on a atteint le nombre de dates en colonne A
    If Cptr = Nbre Then Exit For
    End If
    Next

    '--------------------------restitution tableau affiné
    'rendu essai à supprimer après validation de la procédure
    With Sheets("essai")
    .Range("A3").Resize(Nbre, 35) = T_fin
    .Range("A3:AI" & Nbre + 3).Borders.Weight = xlThin
    End With
    ' rendu final
    '.Range("A3:AI" & Derlig).Clear
    '.Range("A3").Resize(Nbre, 35) = T_fin
    '.Range("A3:AI" & Nbre + 3).Borders.Weight = xlThin
    End With

    Application.ScreenUpdating = True
    MsgBox "traitement effectué en: " & Timer - start & " sec."
    End Sub


     Michel
    0
    1. shynseby Messages postés 22 Statut Membre
       
      Bonjour,

      désolé mais je vois pas trop où vous voulez en venir.

      Car c'était solution marche 1 fois. mais si je change mon transporteur ou mes dates de recherche, rien ne se passe.

      là tu n'as qu'une partie de la macro car elle traite 5 feuilles en tout dont une avec une récap statistique.
      0
  12. shynseby Messages postés 22 Statut Membre
     
    merci, je vais clore le sujet puisque Maurice à répondu à ma question.

    merci à tous
    0