Selection plusieurs cellules en langage VBA [Résolu/Fermé]

lolau88 17 Messages postés dimanche 15 décembre 2013Date d'inscription 17 octobre 2016 Dernière intervention - 21 sept. 2016 à 11:32 - Dernière réponse : lolau88 17 Messages postés dimanche 15 décembre 2013Date d'inscription 17 octobre 2016 Dernière intervention
- 17 oct. 2016 à 10:35
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



Afficher la suite 

16 réponses

ccm81 8204 Messages postés lundi 18 octobre 2010Date d'inscription 12 décembre 2017 Dernière intervention - Modifié par crapoulou le 21/09/2016 à 12:04
0
Utile
1
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
lolau88 17 Messages postés dimanche 15 décembre 2013Date d'inscription 17 octobre 2016 Dernière intervention - 21 sept. 2016 à 13:17
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
michel_m 14941 Messages postés lundi 12 septembre 2005Date d'inscriptionContributeurStatut 13 décembre 2017 Dernière intervention - 21 sept. 2016 à 13:51
0
Utile
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?
ccm81 8204 Messages postés lundi 18 octobre 2010Date d'inscription 12 décembre 2017 Dernière intervention - 21 sept. 2016 à 14:00
0
Utile
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
michel_m 14941 Messages postés lundi 12 septembre 2005Date d'inscriptionContributeurStatut 13 décembre 2017 Dernière intervention - 21 sept. 2016 à 14:15
0
Utile
1
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

lolau88 17 Messages postés dimanche 15 décembre 2013Date d'inscription 17 octobre 2016 Dernière intervention - 21 sept. 2016 à 14:25
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
michel_m 14941 Messages postés lundi 12 septembre 2005Date d'inscriptionContributeurStatut 13 décembre 2017 Dernière intervention - 21 sept. 2016 à 17:30
0
Utile
1
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

lolau88 17 Messages postés dimanche 15 décembre 2013Date d'inscription 17 octobre 2016 Dernière intervention - 22 sept. 2016 à 16:58
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.
michel_m 14941 Messages postés lundi 12 septembre 2005Date d'inscriptionContributeurStatut 13 décembre 2017 Dernière intervention - 22 sept. 2016 à 17:32
0
Utile
1
Le bouton activeX se trouve dans le module feuille concerné


lolau88 17 Messages postés dimanche 15 décembre 2013Date d'inscription 17 octobre 2016 Dernière intervention - 23 sept. 2016 à 13:29
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
michel_m 14941 Messages postés lundi 12 septembre 2005Date d'inscriptionContributeurStatut 13 décembre 2017 Dernière intervention - Modifié par michel_m le 23/09/2016 à 13:43
0
Utile
5
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
lolau88 17 Messages postés dimanche 15 décembre 2013Date d'inscription 17 octobre 2016 Dernière intervention - 26 sept. 2016 à 08:17
Merci Michel, c'est tout à fait ça.
Bonne journée.
lolau88 17 Messages postés dimanche 15 décembre 2013Date d'inscription 17 octobre 2016 Dernière intervention > lolau88 17 Messages postés dimanche 15 décembre 2013Date d'inscription 17 octobre 2016 Dernière intervention - 12 oct. 2016 à 13:12
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
lolau88 17 Messages postés dimanche 15 décembre 2013Date d'inscription 17 octobre 2016 Dernière intervention - 27 sept. 2016 à 11:13
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
michel_m 14941 Messages postés lundi 12 septembre 2005Date d'inscriptionContributeurStatut 13 décembre 2017 Dernière intervention > lolau88 17 Messages postés dimanche 15 décembre 2013Date d'inscription 17 octobre 2016 Dernière intervention - 12 oct. 2016 à 13:58
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
lolau88 17 Messages postés dimanche 15 décembre 2013Date d'inscription 17 octobre 2016 Dernière intervention > michel_m 14941 Messages postés lundi 12 septembre 2005Date d'inscriptionContributeurStatut 13 décembre 2017 Dernière intervention - 17 oct. 2016 à 10:35
Super, ça marche nickel. T'es trop fort...
Bonne journée