Effacer les ranger vide dans exel

Résolu/Fermé
Papoux123 Messages postés 274 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 14 avril 2016 - 7 déc. 2007 à 13:42
Papoux123 Messages postés 274 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 14 avril 2016 - 21 déc. 2007 à 16:27
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

Utilisateur anonyme
7 déc. 2007 à 18:07
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
Papoux123 Messages postés 274 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 14 avril 2016 42
7 déc. 2007 à 20:08
Merci beaucoup. Une question, je dois écrire ce script dans une macro?
et si oui, cette macro démarera automatiquement?

Jacques
0
Utilisateur anonyme
7 déc. 2007 à 20:31
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
Papoux123 Messages postés 274 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 14 avril 2016 42
7 déc. 2007 à 20:57
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
7 déc. 2007 à 21:29
re :

une image vaut mille mots !

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

Lupin
0
Papoux123 Messages postés 274 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 14 avril 2016 42
7 déc. 2007 à 21:34
Un gros merci :)
0
Papoux123 Messages postés 274 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 14 avril 2016 42
9 déc. 2007 à 20:41
Juste à suivre exactement ce qui est écrit plus haut, ça marche
0
Papoux123 Messages postés 274 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 14 avril 2016 42
9 déc. 2007 à 20:47
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
Utilisateur anonyme
12 déc. 2007 à 16:03
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
Papoux123 Messages postés 274 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 14 avril 2016 42
12 déc. 2007 à 19:39
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
Utilisateur anonyme
13 déc. 2007 à 14:52
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
Papoux123 Messages postés 274 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 14 avril 2016 42
14 déc. 2007 à 01:49
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
Utilisateur anonyme
14 déc. 2007 à 23:54
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
Papoux123 Messages postés 274 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 14 avril 2016 42
17 déc. 2007 à 02:08
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
Utilisateur anonyme
17 déc. 2007 à 15:21
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
Papoux123 Messages postés 274 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 14 avril 2016 42
17 déc. 2007 à 16:44
Super Michel, ça fonctionne très bien, merci encore

Passe de très joyeuses fêtes:)

Jacques
0
Papoux123 Messages postés 274 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 14 avril 2016 42
17 déc. 2007 à 20:22
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
Utilisateur anonyme
18 déc. 2007 à 02:54
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
Papoux123 Messages postés 274 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 14 avril 2016 42
19 déc. 2007 à 22:16
¨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
Utilisateur anonyme
20 déc. 2007 à 13:56
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