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 :

Suprimer lignes vides avec VBA Excel 2003


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2008
    Messages : 106
    Points : 58
    Points
    58
    Par défaut Suprimer lignes vides avec VBA Excel 2003
    Bonjour à vous!

    Je vous explique ce que je désire faire:

    1. Couper les lignes de la feuil1 pour lesquelles il y a la valeur "1" dans la colonne D et les copier dans la feuil2.
    2. Protéger la feuil2 avec un mot de passe pour éviter toutes modifications.
    3. Supprimer les lignes vides de la feuil1 (pour l'instant j'ai fait une formule pour mettre une donné dans la colonne F si la ligne n'est pas vide).

    Mon problème: Je n'arrive pas à faire supprimer toutes les lignes vides dans la feuil1. Ça fait déja quelques années que je n'ai pas joué dans VBA... pourriez-vous SVP m'aider?

    Merci à l'avance!!


    Voici mon 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
    Sub Copierlignes()
     
      Dim Lig     As Long
      Dim Col     As String
      Dim NbrLig  As Long
      Dim NumLig  As Long
      Dim Rw As Range
     
      Sheets("Feuil2").Activate ' feuille de destination
      ActiveSheet.Unprotect ("motdepasse")
      Col = "D"                 ' colonne de la donnée non vide à tester
      NumLig = 0
      With Sheets("Feuil1")     ' feuille source
      NbrLig = .Cells(65536, Col).End(xlUp).Row
      For Lig = 1 To NbrLig
        If .Cells(Lig, Col).Value = "1" Then
          .Cells(Lig, Col).EntireRow.Cut
          NumLig = NumLig + 1
          Cells(NumLig, 1).Select
          Rows(ActiveSheet.UsedRange.Rows.Count + 1).Select
          ActiveSheet.Paste
        End If
      Next
      End With
          ActiveSheet.Protect "motdepasse", DrawingObjects:=True, Contents:=True, Scenarios:=True
        Sheets("Feuil1").Activate
        Range("A1:Z65536").Select
            For Each Rw In Selection.Rows
                If Rw.Cells(1, 6).Value = "" Then       ' S'il n'y a pas de valeur dans la colonne F
                   Rw.EntireRow.Delete
                End If
            Next Rw
    End Sub

  2. #2
    Membre confirmé Avatar de drakkar_agfa
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 618
    Points : 638
    Points
    638
    Par défaut
    Bonjour,

    Voici une petite procédure que je me suis fais dans mon classeur personnel. Je l'utilise pour presque tous mes fichiers excel.

    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
    Sub SupprimerLignesVides()
    Dim Col
    Dim Lig As Long
    Dim i As Long
    Dim Depart As Long
     
    'sélection d'une cellule dans la colonne concernée
    Col = Application.InputBox("Veuillez indiquer la lettre" & Chr(10) _
                                & "de la colonne concernée")
     
    'si clic sur annuler on stoppe la procédure
    If Col = False Then Exit Sub
     
    'insertion du n° de la dernière ligne
    Lig = Application.InputBox("Veuillez indiquer le numéro" & Chr(10) _
                                & "de la dernière ligne à supprimer", Type:=1)
     
    'si clic sur annuler on stoppe la procédure
    If Lig = False Then Exit Sub
     
    'sélection de la première ligne
    Depart = Application.InputBox("Veuillez indiquer le numéro" & Chr(10) _
                                & "de la première ligne de données.")
     
    'si clic sur annuler on stoppe la procédure
    If Depart = False Then Exit Sub
     
    For i = Lig To Depart Step -1
        If Cells(i, Col) = "" Then Rows(i).Delete
    Next
    End Sub
    Tu peux le modifier pour l'utiliser avec ce que tu veux.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2008
    Messages : 106
    Points : 58
    Points
    58
    Par défaut
    Bonjour!

    J'aimerais que l'opération soit transparentre pour l'utilisateur (qu'il clique sur le bouton "transférer les données", que les lignes se transfère dans la bonne feuille et que les lignes vides soient supprimées). Je ne veux pas qu'utilisateur ait à entrer des paramètes puisque je m'adresse à des gens très peux expérimentés en Excel.

    Mais merci quand même, je vais retenir ce code pour une autre application

  4. #4
    Membre confirmé Avatar de drakkar_agfa
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 618
    Points : 638
    Points
    638
    Par défaut
    Il est pratique (classeur personnel, donc accecible en tout temps!) mais pour ton code, dépendant de ton niveau en VBA, tu peux remplacer les inputbox par les paramètres de la fonction
    du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub SupprimerLignesVides(lDepart as long, lFin as long, lColonne as long)
    Comme ça, dans ta fonction principale, tu fais ton code qui copie les lignes, transfère,..... ensuite tu apelle SupprimerLignesVides dans ton code en passant les paramètres.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2008
    Messages : 106
    Points : 58
    Points
    58
    Par défaut
    Comme je vous disais, il y a déja plusieurs années depuis la dernière fois que j'ai fais du VBA alors c'est tout un exercice pour moi de convertir un code come ça

  6. #6
    Membre confirmé Avatar de drakkar_agfa
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 618
    Points : 638
    Points
    638
    Par défaut
    Ok, alors au plus simple :

    ajoutes la déclaration suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim lFin as long
    dim lColonne as long
    Et ce code à la fin de ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    'Si tu veux une autre colonne que la A pour trouver la dernière ligne remplie change le A ici
    lFin = Worksheets("Feuil1").Range("A65536").End(xlUp).Row
    'Mets ici le numéro de la colonne où tu vérifies si la cellule est vide.
    lColonne = ???
     
    For i = lFin To 1 Step -1
        If Cells(i, lColonne) = "" Then Rows(i).Delete
    Next

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2008
    Messages : 106
    Points : 58
    Points
    58
    Par défaut
    Wow merci ça fonctionne très bien! Parcontre, un nouveau problème s'est créé (je ne sais pas si c'est du à la supression de ligne, mais je ne crois pas).

    Lors de l'exécution de la partie où je verrouille Feuil2, des plages sont créées pour "Permettre à l'utilisateur de modifier des plages" et je me retrouve que toutes les cellules de Feuil2 sont protégées SAUF celles où il y a du texte...

    Je n'ai aucune fonction qui détermine des plages pour modification.

    Comment puis-je empecher cela de ce produire? Le but de la macro est justement que l'utilisateur ne puisse pas modifier le texte une fois transféré dans Feuil2...

    Merci encore!!!

    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
    Sub Copierlignes()
     
      Dim Lig     As Long
      Dim Col     As String
      Dim NbrLig  As Long
      Dim NumLig  As Long
      Dim Rw As Range
      Dim lFin As Long
      Dim lColonne As Long
     
      Sheets("Logbook - barré").Activate ' feuille de destination
      ActiveSheet.Unprotect ("logbook")
      Col = "D"                 ' colonne de la donnée non vide à tester
      NumLig = 0
      With Sheets("Logbook - entrée")     ' feuille source
      NbrLig = .Cells(65536, Col).End(xlUp).Row
      For Lig = 1 To NbrLig
        If .Cells(Lig, Col).Value = "1" Then
          .Cells(Lig, Col).EntireRow.Cut
          NumLig = NumLig + 1
          Cells(NumLig, 1).Select
          Rows(ActiveSheet.UsedRange.Rows.Count + 1).Select
          ActiveSheet.Paste
        End If
      Next
      End With
          ActiveSheet.Protect "logbook", DrawingObjects:=True, Contents:=True, Scenarios:=True
     
        lFin = Worksheets("Logbook - entrée").Range("F65536").End(xlUp).Row
        lColonne = 6
        Sheets("Logbook - entrée").Activate
    For i = lFin To 1 Step -1
        If Cells(i, lColonne) = "" Then Rows(i).Delete
    Next
     
     
    End Sub

  8. #8
    Membre confirmé Avatar de drakkar_agfa
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 618
    Points : 638
    Points
    638
    Par défaut
    Je crois que tu devrais créer un nouveau sujet avec ce problème et mettre celui-ci comme résolu!

    Et pourrais-tu expliquer autrement ceci
    Lors de l'exécution de la partie où je verrouille Feuil2, des plages sont créées pour "Permettre à l'utilisateur de modifier des plages" et je me retrouve que toutes les cellules de Feuil2 sont protégées SAUF celles où il y a du texte...
    Je ne comprends pas parfaitement ce que tu veux dire...

    Merci!

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

Discussions similaires

  1. VBA Excel 2003 Copier ligne sous plusieurs conditions
    Par Harreauv dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 31/01/2013, 18h40
  2. [XL-2003] Probleme de Frame avec VBA Excel 2003
    Par bisene dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 18/12/2010, 16h50
  3. envoi mail outlook avec vba excel
    Par momolamoto dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/09/2010, 10h45
  4. Réponses: 2
    Dernier message: 17/07/2007, 11h53
  5. Images avec VBA Excel
    Par dorschner dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/09/2006, 23h28

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