Selection plusieurs cellules en langage VBA

Résolu
lolau88 Messages postés 21 Statut Membre -  
lolau88 Messages postés 21 Statut Membre -
Bonjour,
je souhaite que toutes les cellules vides de certaines colonnes dans mon tableau Excel se masquent automatiquement. J'ai créé une macro mais ça ne fonctionne que si la première cellule de la colonne contient du texte, et moi je voudrais que les lignes disparaissent quand toutes les cellules sont vides, et pas seulement la première.
Quelqu'un aurait-il une solution à mon problème?
Merci bcp

Voici la macro :

For Each cel In Range("A3:A226")
If cel = "" Then
cel.EntireRow.Hidden = True
End If
Next


7 réponses

  1. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Bonjour

    Pour masquer les lignes dont toutes les cellules sont vides et ... pour les reafficher
    Const lideb = 2
    
    Public Sub masquer()
    Dim li As Long, cofin As Long, lifin As Long
    lifin = Cells.Find("*", , , , xlByRows, xlPrevious).Row
    For li = lideb To lifin
      cofin = Cells(li, Columns.Count).End(xlToLeft).Column
      If cofin = 1 And Cells(li, 1) = "" Then Rows(li).EntireRow.Hidden = True
    Next li
    End Sub
    
    Public Sub demasquer()
    Dim lifin As Long
    lifin = Cells.Find("*", , , , xlByRows, xlPrevious).Row
    Rows(lideb & ":" & lifin).EntireRow.Hidden = False
    End Sub


    Cdlmnt
    0
    1. lolau88 Messages postés 21 Statut Membre
       
      Merci ccm81
      mais je débute vraiment en VBA et en copiant et collant ton code dans ma macro ça ne fonctionne pas.
      En fait j'ai un bouton sur lequel j'appuie et les lignes concernées (en occurrence pour mon tableau cela concerne des groupes de cellules de A26 à O57, A64 à O154...) disparaissent lorsque les cellules y sont vides.
      Merci d'avance pour tes explications.

      cdlmnt
      0
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bpnjour
    salut ccm, ca va ?

    C'est au moins 1 cellule vide n'importe tout sur une ligne du Tableau qui masque ou toutes cellules sur une ligne du tabkeau qui masque?
    0
  3. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Salut michel,

    je m'étais aussi posé la question
    Est ce qu'on doit masquer la ligne
    - lorsqu'au moins une cellule est vide (et peut être dans une plage donnée)
    - lorque toutes les cellules sont vides

    je te laisse continuer, je dois plier boutique !

    Bon après midi
    0
  4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    je te laisse continuer, je dois plier boutique !

    moi aussi...

    1 ou plusieurs cellules vides dans tableau entre A et O

    Option Explicit
    '--------------------------------------
    Sub nettoyer_tableaux()
    'A26 à O57, A64 à O154...)
    Call cacherligvide("A26:O57")
    Call cacherligvide("A64:O156")
    End Sub
    '-------------------------------------------------
    Sub cacherligvide(plage)
    On Error Resume Next
    Range(plage).SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
    End Sub

    0
    1. lolau88 Messages postés 21 Statut Membre
       
      Bonjour Michel_m
      En fait je ne veux pas que la ligne se masque lorsqu'il y a au moins une cellule pleine.
      Donc la seule condition pour que la ligne se masque, c'est si toutes les cellules de la ligne sont vides.
      Merci
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    re
    en attendant la soupe

    Option Explicit
    Const Col_deb As String = "A"
    Const Col_fin As String = "O"

    '-----------------------------------------------
    Sub nettoyer_tableaux()
    'A26 à O57, A64 à O154...)

    Application.ScreenUpdating = False
    Call cacherligvide(26, 57)
    Call cacherligvide(64, 154)
    End Sub

    '-------------------------------------------------
    Sub cacherligvide(deb, fin)
    Dim Plage As Range, Nbre As Byte, Lig As Byte, Cptr As Byte

    Set Plage = Range(Cells(deb, Col_deb), Cells(fin, Col_deb))
    Nbre = Application.CountIf(Plage, "")
    Lig = deb - 1
    For Cptr = 1 To Nbre
    Lig = Columns(Col_deb).Find("", Cells(Lig, Col_deb), xlValues).Row
    If Application.CountA(Range(Cells(Lig, Col_deb), Cells(Lig, Col_fin))) = 0 Then
    Rows(Lig).Hidden = True
    End If
    Next
    End Sub

    0
    1. lolau88 Messages postés 21 Statut Membre
       
      Bonjour Michel,

      merci pour ce code, ça fonctionne bien en effet. Mais je ne parviens pas à l'utiliser avec un bouton de commande activeX.
      Le but est que lorsque j'appuie sur ce bouton, toutes les lignes vides doivent se masquer. Merci encore et désolé de mon amateurisme dans le langage VBA.
      0
  7. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Le bouton activeX se trouve dans le module feuille concerné


    0
    1. lolau88 Messages postés 21 Statut Membre
       
      Oui, je sais où est le bouton activeX mais en fait ce qui ne fonctionne pas c'est l'ordre du code. Voilà ce que j' ai mis, mais ça m'affiche un message d'erreur lors de l'exécution.

      Option Explicit

      Private Sub CommandButton1_Click()

      Const Col_deb As String = "A"
      Const Col_fin As String = "O"

      Sub nettoyer_tableaux()
      Application.ScreenUpdating = False
      Call cacherligvide(4, 13)
      Call cacherligvide(19, 31)

      Sub cacherligvide(deb, fin)
      Dim Plage As Range, Nbre As Byte, Lig As Byte, Cptr As Byte

      Set Plage = Range(Cells(deb, Col_deb), Cells(fin, Col_deb))
      Nbre = Application.CountIf(Plage, "")
      Lig = deb - 1
      For Cptr = 1 To Nbre
      Lig = Columns(Col_deb).Find("", Cells(Lig, Col_deb), xlValues).Row
      If Application.CountA(Range(Cells(Lig, Col_deb), Cells(Lig, Col_fin))) = 0 Then
      Rows(Lig).Hidden = True
      End If
      Next
      End Sub
      0
  8. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Option Explicit
    Const Col_deb As String = "A"
    Const Col_fin As String = "O"

    '-----------------------------------------------
    Private Sub CommandButton1_Click()
    'A26 à O57, A64 à O154...)

    Application.ScreenUpdating = False
    Call cacherligvide(26, 57)
    Call cacherligvide(64, 154)
    End Sub

    '-------------------------------------------------
    Sub cacherligvide(deb, fin)
    Dim Plage As Range, Nbre As Byte, Lig As Byte, Cptr As Byte

    Set Plage = Range(Cells(deb, Col_deb), Cells(fin, Col_deb))
    Nbre = Application.CountIf(Plage, "")
    Lig = deb - 1
    For Cptr = 1 To Nbre
    Lig = Columns(Col_deb).Find("", Cells(Lig, Col_deb), xlValues).Row
    If Application.CountA(Range(Cells(Lig, Col_deb), Cells(Lig, Col_fin))) = 0 Then
    Rows(Lig).Hidden = True
    End If
    Next
    End Sub

     Michel
    0
    1. lolau88 Messages postés 21 Statut Membre
       
      Merci Michel, c'est tout à fait ça.
      Bonne journée.
      0
      1. lolau88 Messages postés 21 Statut Membre > lolau88 Messages postés 21 Statut Membre
         
        Bonjour Michel,

        j'ai encore une erreur qui s'affiche lors de l'exécution de la macro : "erreur d'exécution 6"
        Serais tu me dire de quoi cela provient? La macro fonctionnait pourtant au départ lorsque je l'ai mise puis quand j'ai rajouté des lignes, ça m'a affiché ce message d'erreur.
        Voici le code que j'ai mis :

        Option Explicit
        Const Col_deb As String = "A"
        Const Col_fin As String = "O"

        Private Sub CommandButton1_Click()

        Application.ScreenUpdating = False
        Call cacherligvide(25, 42)
        Call cacherligvide(44, 73)
        Call cacherligvide(78, 102)
        Call cacherligvide(105, 134)
        Call cacherligvide(139, 171)
        Call cacherligvide(177, 197)
        Call cacherligvide(201, 205)
        Call cacherligvide(209, 212)
        Call cacherligvide(216, 219)
        Call cacherligvide(221, 238)
        Call cacherligvide(243, 267)
        Call cacherligvide(270, 299)

        End Sub

        Sub cacherligvide(deb, fin)
        Dim Plage As Range, Nbre As Byte, Lig As Byte, Cptr As Byte

        Set Plage = Range(Cells(deb, Col_deb), Cells(fin, Col_deb))
        Nbre = Application.CountIf(Plage, "")
        Lig = deb - 1
        For Cptr = 1 To Nbre
        Lig = Columns(Col_deb).Find("", Cells(Lig, Col_deb), xlValues).Row
        If Application.CountA(Range(Cells(Lig, Col_deb), Cells(Lig, Col_fin))) = 0 Then
        Rows(Lig).Hidden = True
        End If
        Next
        End Sub

        Merci beaucoup
        0
    2. lolau88 Messages postés 21 Statut Membre
       
      Bonjour Michel,

      j'ai encore une erreur qui s'affiche lors de l'exécution de la macro : "erreur d'exécution 6"
      Serais tu me dire de quoi cela provient? La macro fonctionnait pourtant au départ lorsque je l'ai mise puis quand j'ai rajouté des lignes, ça m'a affiché ce message d'erreur.
      Voici le code que j'ai mis :

      Option Explicit
      Const Col_deb As String = "A"
      Const Col_fin As String = "O"

      Private Sub CommandButton1_Click()

      Application.ScreenUpdating = False
      Call cacherligvide(25, 42)
      Call cacherligvide(44, 73)
      Call cacherligvide(78, 102)
      Call cacherligvide(105, 134)
      Call cacherligvide(139, 171)
      Call cacherligvide(177, 197)
      Call cacherligvide(201, 205)
      Call cacherligvide(209, 212)
      Call cacherligvide(216, 219)
      Call cacherligvide(221, 238)
      Call cacherligvide(243, 267)
      Call cacherligvide(270, 299)

      End Sub

      Sub cacherligvide(deb, fin)
      Dim Plage As Range, Nbre As Byte, Lig As Byte, Cptr As Byte

      Set Plage = Range(Cells(deb, Col_deb), Cells(fin, Col_deb))
      Nbre = Application.CountIf(Plage, "")
      Lig = deb - 1
      For Cptr = 1 To Nbre
      Lig = Columns(Col_deb).Find("", Cells(Lig, Col_deb), xlValues).Row
      If Application.CountA(Range(Cells(Lig, Col_deb), Cells(Lig, Col_fin))) = 0 Then
      Rows(Lig).Hidden = True
      End If
      Next
      End Sub

      Merci beaucoup
      0
      1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320 > lolau88 Messages postés 21 Statut Membre
         
        Bonjour
        comme tu dépasses 255, il faut passer en integer au lieu de Byte, tu peux alors aller jusqu'à 32767

        Dim Plage As Range, Nbre As Integer, Lig As Integer, Cptr as integer
        0
      2. lolau88 Messages postés 21 Statut Membre > michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Super, ça marche nickel. T'es trop fort...
        Bonne journée
        0