Effacer les ranger vide dans exel

Résolu
Papoux123 Messages postés 286 Statut Membre -  
Papoux123 Messages postés 286 Statut Membre -
Bonjour. Je cherche la formule dans exel qui me permettrait d'effacer d'un seul coup toutes les rangées vides entre celles qui ont du texte car c'est assez long à effacer lignes par lignes. Présentement je dois copier et coller un fichier dans un autre et effacer lignes par lignes pour regrouper tout le texte ensemble. Est-ce que cette formule existe et si oui comment procéder.

Merci a ceux ou celles qui pren dront de leurs temps pour résoudre mon problème

23 réponses

  • 1
  • 2
  1. Utilisateur anonyme
     
    Bonjour,

    Exemple type :

    Sub EffaceLigne()
    
        Dim Boucle As Long, Plage As Range
            
        Application.ScreenUpdating = False
        Set Plage = ActiveSheet.UsedRange
        For Boucle = 1 To Plage.Rows.Count
            If (IsEmpty(Cells(Boucle, 1).Value)) Then
                Cells(Boucle, 1).EntireRow.Delete
                If (Boucle < Plage.Rows.Count) Then
                    Boucle = (Boucle - 1)
                End If
            End If
        Next Boucle
        Application.ScreenUpdating = True
    
    End Sub
    '
    

    Lupin
    0
  2. Papoux123 Messages postés 286 Statut Membre 42
     
    Merci beaucoup. Une question, je dois écrire ce script dans une macro?
    et si oui, cette macro démarera automatiquement?

    Jacques
    0
  3. Utilisateur anonyme
     
    re :

    oui cette "Sub" ( procédure ) est une macro, et non elle ne se lance pas de façon automatique !
    sous Excel -> Alt F11 -> pour accéder à l'éditeur de VB
    Clic droit sur nom du classeur dans la fenêtre de gauche
    Choisir // Insertion / Module
    Faire un copier coller
    Pour lancer la macro :
    Menu Excel // Outils / Macro / Macro ...
    Choisir EffaceLigne / Exécuter

    Pour un déclenchement automatique !
    sous Excel -> Alt F11 -> pour accéder à l'éditeur de VB
    Double clic sur le nom de la feuille
    Fenêtre de droite - liste déroulante de gauche
    Choisir [ Worksheets ]
    Fenêtre de droite - liste déroulante de droite
    Choisir [ Change ]

    Copier le code sans la déclartion de la routine dans le nouveau bloc routine :

    Private Sub Worksheet_Change(ByVal Target As Range)
        
        Dim Boucle As Long, Plage As Range
            
        Application.ScreenUpdating = False
        Set Plage = ActiveSheet.UsedRange
        For Boucle = 1 To Plage.Rows.Count
            If (IsEmpty(Cells(Boucle, 1).Value)) Then
                Cells(Boucle, 1).EntireRow.Delete
                If (Boucle < Plage.Rows.Count) Then
                    Boucle = (Boucle - 1)
                End If
            End If
        Next Boucle
        Application.ScreenUpdating = True
    
    End Sub
    '
    

    Lupin
    0
  4. Papoux123 Messages postés 286 Statut Membre 42
     
    Ca fonctionne très bien en mode manuel mais je ne suis pas capable d'accéder a ce que tu dis car après avoir fait Alt F11, c'est une fenêtre Microsoft Visual Basic qui apparaît et la ligne d'outils, je ne vois pas le nom de la feuille, dois-je aller dans les menus?

    Merci encore :)
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Utilisateur anonyme
     
    re :

    une image vaut mille mots !

    http://membre.oricom.ca/lupin/util/vbe.jpg

    Lupin
    0
  7. Papoux123 Messages postés 286 Statut Membre 42
     
    Un gros merci :)
    0
  8. Papoux123 Messages postés 286 Statut Membre 42
     
    Juste à suivre exactement ce qui est écrit plus haut, ça marche
    0
  9. Papoux123 Messages postés 286 Statut Membre 42
     
    Admettons que dans mon fichier j'utilises 150 lignes mais que je veux effacer les lignes vides que dans les 50 premières lignes et ne pas tenir comptes des lignes vides dans les 100 autres lignes est ce que c'est possible en modifiant la macro?
    Merci encore
    0
  10. Utilisateur anonyme
     
    re :

    oui, c'est possible :

    Sub EffaceLigne()
    
        Dim Boucle As Long, Plage As Range
        Dim Limite As Long
            
        Application.ScreenUpdating = False
        Set Plage = ActiveSheet.UsedRange
        Limite = Plage.Rows.Count
        
        If (Limite > 50) Then
            Limite = 50
        Else
            Limite = Plage.Rows.Count
        End If
        
        For Boucle = 1 To Limite
            If (IsEmpty(Cells(Boucle, 1).Value)) Then
                Cells(Boucle, 1).EntireRow.Delete
                If (Boucle < Plage.Rows.Count) Then
                    Boucle = (Boucle - 1)
                End If
            End If
        Next Boucle
        Application.ScreenUpdating = True
    
    End Sub
    '
    

    Lupin
    0
  11. Papoux123 Messages postés 286 Statut Membre 42
     
    Bonjour LUPIN. Encore une fois merci. J'ai essayé le nouveau script mais il efface les lignes vides même après les 50 premières.
    J'ai effacé la première macro et j'ai copié celle ci mais le résultat est le même. Est-ce que j'oublie quelque choses?

    Merci
    0
  12. Utilisateur anonyme
     
    re:

    Là je suis un peu dans les limbes, chez moi ça fonctionne correctement.

    If (IsEmpty(Cells(Boucle, 1).Value)) Then
    Ici, Boucle incrémente la ligne et [ , 1 ] spécifie la première colonne.
    Donc la première colonne ne doit pas être vide !

    J'ai effectué une petite modif dans le code au cas ou :

    Sub EffaceLigne()
    
        Dim Boucle As Long, Plage As Range
        Dim Limite As Long
            
        Application.ScreenUpdating = False
        Set Plage = ActiveSheet.UsedRange
        Limite = Plage.Rows.Count
        
        If (Limite > 50) Then
            Limite = 50
        Else
            Limite = Plage.Rows.Count
        End If
        
        For Boucle = 1 To Limite
            If (IsEmpty(Cells(Boucle, 1).Value)) Then
                Cells(Boucle, 1).EntireRow.Delete
                If (Boucle < Limite) Then
                    Boucle = (Boucle - 1)
                End If
            End If
        Next Boucle
        Application.ScreenUpdating = True
    
    End Sub
    '
    

    Lupin
    0
  13. Papoux123 Messages postés 286 Statut Membre 42
     
    Je te remerci beaucoup, ça fonctionne à merveille, j'aurais une autre question en rapport à Exel. Si dans une colonne, je retrouve dans une ligne le texte suivant 10 + 2, est-il possible d'enlever le +2 et mettre 2 dans une autre colonne sur la même ligne? Le fait est que mon logiciel CX-Supervisor ne prend pas le +2 et n'affiche rien quand il retrouve ça.

    Un gros merci, heureusement qu'il y a des gens comme toi qui prennes de leurs temps pour aider les autres

    Jacques
    0
  14. Utilisateur anonyme
     
    Re :

    Voici 2 techniques :

    La première la plus simple lorsqu'un délimiteur est présent !
    Option Explicit
    
    Sub ChaineDeCaracteres1()
    
        Dim Valeur As Variant, Boite As Variant
        Dim Plage As Range, Cible As Range, Limite As Long
        
        Limite = Range("A1:A65536").End(xlDown).Row
        ' Ici le choix de la colonne A
        Set Plage = Range("A1:A" & Limite)
        For Each Cible In Plage
            Valeur = Cible.Value
            Boite = Split(Valeur, "+", , vbTextCompare)
            'Test d'abord et enleve le commentaire
            'Cible.Offset(0, 0).Value = Boite(0)
            Cible.Offset(0, 1).Value = Boite(1)
        Next Cible
    
    End Sub
    '
    


    La plus compliqué lorsqu'il faut analyser toute
    la chaine de caractères.

    Sub ChaineDeCaracteres2()
    
        Dim Valeur As String, Boite(2) As String
        Dim Plage As Range, Cible As Range, Limite As Long
        Dim Longueur As Long, Boucle As Long, Carac As String
        Dim Indice As Integer
        
        Limite = Range("A1:A65536").End(xlDown).Row
        ' Ici le choix de la colonne A
        Set Plage = Range("A1:A" & Limite)
        For Each Cible In Plage
            Valeur = CStr(Cible.Value)
            Longueur = Len(Valeur)
            Boite(0) = "": Boite(1) = "": Indice = 0
            For Boucle = 1 To Longueur
                Carac = Mid(Valeur, Boucle, 1)
                ' Tout caractère peut ici être testé et manipulé
                If (Carac = "+") Then
                    Indice = 1
                End If
                Boite(Indice) = Boite(Indice) & Carac
            Next Boucle
            'Test d'abord et enleve le commentaire
            'Cible.Offset(0, 0).Value = Boite(0)
            Cible.Offset(0, 1).Value = Boite(1)
        Next Cible
    
    End Sub
    


    Michel
    0
  15. Papoux123 Messages postés 286 Statut Membre 42
     
    Merci Michel, ça fonctionne mais pas totalement, dans la colonne A si je met 10 + 5, le 5 s'inscrit dans la colonne B mais dans la colonne A, il faudrait qu'il ne reste que le chiffre 10. Présentement dans la colonne A, tout le texte reste la.

    Merci beaucoup

    Jacques
    0
  16. Utilisateur anonyme
     
    re :

    oui, je vois, enleve la ligne de commentaires !
            'Test d'abord et enleve le commentaire
    ->    'Cible.Offset(0, 0).Value = Boite(0)
            Cible.Offset(0, 1).Value = Boite(1)
    


    Michel
    0
  17. Papoux123 Messages postés 286 Statut Membre 42
     
    Super Michel, ça fonctionne très bien, merci encore

    Passe de très joyeuses fêtes:)

    Jacques
    0
  18. Papoux123 Messages postés 286 Statut Membre 42
     
    Si je voudrais envoyer le chiffre après le "+" trois cases plus loin dans la même ligne, est-ce que c'est possible?

    Merci

    jacques
    0
  19. Utilisateur anonyme
     
    re:

    Dans la boucle [ Cible In Plage ]
    Cible est la cellule en cours

    À partir de la propriété [ Offset(L,C) ] il est possible
    d'adresser toute la feuille. Ici dans notre exemple,
    nous sommes sur le même ligne, d'ou le 0 (zéro)

    Cible.Offset(0,C)

    Nous placions une case à droite, donc +1

    maintenant, ce sera +3 : Cible.Offset(0,3).Value
    Sub ChaineDeCaracteres1()
    
        Dim Valeur As Variant, Boite As Variant
        Dim Plage As Range, Cible As Range, Limite As Long
        
        Limite = Range("A1:A65536").End(xlDown).Row
        Set Plage = Range("A1:A" & Limite)
        For Each Cible In Plage
            Valeur = Cible.Value
            Boite = Split(Valeur, "+", , vbTextCompare)
            Cible.Offset(0, 0).Value = Boite(0)
            Cible.Offset(0, 3).Value = Boite(1)
        Next Cible
        Set Plage = Nothing
    
    End Sub
    '
    


    Michel
    0
  20. Papoux123 Messages postés 286 Statut Membre 42
     
    ¨Ca fonctionne comme voulu. J'aimerai ça être bon comme toi, tu sembles bien te débrouiller avec ça. D'ou as tu appris les codes de programmation pour Exel? J'ai cherché mais je ne trouve pas les réponses que je veux .

    Merci encore

    Jacques
    0
  21. Utilisateur anonyme
     
    re :

    J'ai appris avec les années, j'ai suivi mon premier cours de BASIC
    pendant ma technique (Électrotechnicien) en 1983. Ma première
    application VBA a été réalisé en 96 sous Excel 95, l'application
    récupérait un fichier texte contenant toutes les commandes de la
    cie et triait les commandes pour les diviser en une dizaine de groupe
    de production, par date, par client, etc...

    J'ai suivi le forum de microsoft excel pendant plusieurs années,
    et avec le temps on en vient à connaître les trucs et astuces.
    Il n'y a pas de secret, c'est de la pratique, beaucoup de recherche
    et un bon bouquin.

    Michel
    0
  • 1
  • 2