Macro excel masquer des lignes

CORNEMUSE -  
 CORNEMUSE -
Bonjour,
Je voudrais masquer les lignes consécutives de la cellule sélectionnée, tant que la cellule au-dessous(de celle sélectionnée), est vide.
J'essaie comme suit, ça ne marche pas, merci de voler à mon secours

Sub masquerlignes()
l = ActiveCell.Row
c = ActiveCell.Column
While Cells(l + i, c) = ""
Cells(l + i, c).Select
Selection.EntireRow.Hidden = True
Wend
End Sub
Sub masquerlignes2()
l = ActiveCell.Row
c = ActiveCell.Column
For i = 1 To 50
If Cells(l + i, c) = "" Then
Cells(l + i, c).Select
Selection.EntireRow.Hidden = True
End If
Next i
End Sub.
A voir également:

11 réponses

michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
bonjour

incrémente i avant wend
i=i+1
wend


mais ca peut se faire sans boucle...

lig = ActiveCell.Row
col = ActiveCell.Column
lig_fin = Columns(col).Find("*", Cells(lig, col), xlValues).Row
If lig_fin > lig + 1 Then
Rows(lig + 1 & ":" & lig_fin - 1).Delete
End If
0
CORNEMUSE
 
Merci, en incrémentant, évidemment ça marche.
J'essaie la 2e solution, ça ne masque pas, ça efface les lignes. Je suppose qu'il me faut remplacer Delete par un autre mot, mais lequel...?
Autre chose, je ne comprends pas les lignes 3 et 5. J'ai cherché Find dans fonctions, sans succès. Merci de m'éclairer si c'est possible.
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
Bonjour,
Oui excuses moi
Rows(lig + 1 & ":" & lig_fin - 1).hidden=true

Pour Find, il faut que tu cherches dans l'aide de VBA (pour aller dans VBA:Alt+F11) et non d'XL. Pour piger, étudies bien l'exemple fourni par MS

Lig_fin est le numéro de la première cellule non vide ("*") sous la cellule sélectionnée (...cells(lig,col)...)
xlvalues demande à prendre la valeur dans la cellule( au cas où les cellules comporterait une formule avec comme résultat: "")
on cache depuis la ligne du dessous: lig+1
jusqu'à la ligne au dessus de lig_fin: lig_fin-1
0
CORNEMUSE
 
Bonjour et merci,
J'ai encore 2 questions...
D'abord, je ne comprends pas "l'exemple fourni par MS"

Ensuite, pourquoi la macro5 foctionne, et pas la 7?

Sub Macro5()
Rows(4 & ":" & 14).Hidden = True
End Sub

Sub Macro7()
Columns(4 & ":" & 14).Hidden = True
End Sub
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
Bonjour

Macro7 ne fonctionne: c'est vrai, big surprise d'autant plus que je suis en référence L1C1 et que
Columns("E" & ":" & "H").Hidden = True

fonctionne... donc, mystère et boule de gomme

l'exemple de la fonction Find de l'aide Microsoft (MS) est celui-ci
With Worksheets(1).Range("a1:a500")
    Set c = .Find(2, lookin:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            c.Value = 5
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With


question à 1 euro: pourquoi cette variable firstaddress ?
piger cela te sera utile dans tes macros comme ca l'a été, non sans mal, pour moi :-)

0
CORNEMUSE
 
Bonsoir Michel,

J'aimerais comprendre pourquoi la macro suivante, que tu m'as indiquée, ne fonctionne pas.

Sub Macro1()
With Worksheets(1).Range("a1:a50")
Set c = .Find(2, LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Value = 5
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
End sub

Le débogueur me répond erreur d'exécution 91... Variable objet ou variable de bloc with non définie.
Merci de ton aide.
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318 > CORNEMUSE
 
Bonjour,

Curieux, c'est pourtant un copier-coller de l'aide microsoft et je l'avais déjà étudié pour apprendre mais peut-^tre pas jusqu'au bout !!!...

ce qui se passe: lorsque tous les 2 ont été remplacés par des 5, c.address ="rien"(nothing) et donc n'existe pas d'où erreur
Enfin, tel que je crois comprendre

voici ce que j'ai fait pour éviter le plantage
Sub cherche()
With Worksheets(1).Range("a1:a50")
    Set c = .Find(2, LookIn:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            c.Value = 5
            Set c = .FindNext(c)
            If c Is Nothing Then: Exit Do
        Loop While c.Address <> firstAddress
    End If
End With

End Sub


Mais si quelqu'un sur le forum connait le pourquoi du comment, je suis preneur!

Bonne soirée
0
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282 > michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention  
 
Salut michel et cornemuse,

Je suis presque d'accord avec toi michel, plus précisément je dirais que si c=nothing alors c.address ne veut plus rien dire.
D'ailleurs à quoi sert ce test c.Address <> firstAddress ?
A rien j'ai l'impression, puisque s'il ne trouve plus rien on aura .FindNext(c)=nothing et c'est justement la première condition de sortie de boucle.
J'ai testé :
Sub Macro1()
    With Worksheets(1).Range("a1:a50")
        Set c = .Find(2, LookIn:=xlValues)
        If Not c Is Nothing Then
            firstAddress = c.Address
            Do
                c.Value = 5
                Set c = .FindNext(c)
            Loop While Not c Is Nothing
        End If
    End With
End Sub

comme simplification et ça a l'air de bien tourner...

eric
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318 > eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention  
 
Bonjour Eric,

j'arrivais à la formulation que toi en prenant ma douche (si,si, ca m'arrive)

bizarre quand même pour un exemple donné par MS et qu'on retrouve souvent dans des codes...
0
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
Bonsoir tout le monde,

En un peu plus court si j'ai bien compris la demande :
    If ActiveCell.Offset(1, 0) = "" Then
        Range(ActiveCell.Offset(1, 0), ActiveCell.End(xlDown).Offset(-1, 0)).EntireRow.Hidden = True
    End If


eric
0
CORNEMUSE
 
Bonsoir Eric,
J'ai essayé la macro:

If ActiveCell.Offset(1, 0) = "" Then
Range(ActiveCell.Offset(1, 0), ActiveCell.End(xlDown).Offset(-1, 0)).EntireRow.Hidden = True
End If

Elle ne correspond pas tout à fait à ce queje souhaite: elle affiche toutes les lignes de la feuille au-dessous de la cellule active, si ces lignes ont leur cellule de la même colonne que la cellule active, vide.
Or la feuille contient plusieurs plages correspondant à ces critères, et je souhaite que la 1ère plage seulement soit concernée.
Merci de ton aide.
0

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

Posez votre question
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
Bonjour Eriiic,

As tu une explication pour le coup de la macro7 ?
j'y perd mon peu de patois VBA...
donc, si tu connaissais le pourquoi du comment ?
0
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
Salut michel,

Pour excel "1:4" ne peut représenter qu'une plage de lignes (malgré que l'ambiguïté pourrait être levée par l'utilisation de columns)
On peut supposer que pour faciliter la saisie (4 & ":" & 14) soit converti en ("4:14") (conversion des nombres en strings), ce qui donne une syntaxe correcte pour rows mais pas pour columns.
J'ai beau réfléchir, je ne vois pas comment désigner directement une plage de colonnes par leur numéro...
Laissons mûrir, ça viendra peut-être :-)

Bonne journée
eric
0
CORNEMUSE
 
Salut à vous,
Je n'ai pas eu le temps de travailler les dernières réponses(mes activtés de retraité, et la préparation des fêtes familiales, ça occupe), mais j'ai une autre question.
Je bricole depuis une quinzaine d'années sur les macros d'Excel. Autodidacte, j'ai quand même rencontré des gens qui m'ont mis ou remis sur des rails (sinon je planterais des choux), mais je ne suis pas ouvert au(x) langage(s) qu'utilisent les habitués de l'informatique. Ce n'est pas pour raconter ma vie, mais pour situer...
Les macros que je crée et utilise, sont écrites sur des modules Virtual Basic. Et j'ai découvert qu'il existe des macos écrites sur des feuilles excel, dans un langage qui m'est inconnu. Exemple:
TRIER LES DONNEES
=SELECTIONNER("L11C1:L199C20")
=TRIER(1;"L11C1";1)
=SELECTIONNER("L5C1")
=RETOUR()
Si quelqu'un peut m'aider, me traduire par exemple ce qui précède, me dire où m'adreser...
Merci
0
lami20j
 
Salut,

Sub Macro7()
Columns(4 & ":" & 14).Hidden = True
End Sub


Essai

Range(Columns(4),Columns(14)).Hidden = True
0
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
Bonsoir,

Ce sont les premières macro (excel 4). Visual basic n'existait pas et les macros étaient saisies dans des feuilles.
https://www.google.fr/search?hl=fr&client=firefox-a&rls=org.mozilla:fr:official&hs=SOu&ei=W5IyS8qcA8Pb4gasluiqCA&sa=X&oi=spell&resnum=0&ct=result&cd=1&ved=0CAYQBSgA&q=macro+excel+4&spell=1&gws_rd=ssl

eric
0
CORNEMUSE
 
Salut Eric,
C'est vrai qu'avec Excel 4, les macros étaient écrites sur des feuilles, en français, ce qui me facilitait la tâche, mais le langage était le même qu'aujourd'hui. C'est pourquoiu je ne comprends pas avec les L1C1...
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
Bonjour Eric,

Merci du renseignement; je vais aller fouiner là dedans!
coirdialement,
Michel
0
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
Re,

Il y avait et il y a encore 2 styles de références dans excel : A1 (que tu connais) et L1C1.
Dans le style L1C1 tu désignes ligne et colonne de ta référence.
Ex :
=L5C1 : référence absolue ligne-colonne équivalente à =$A$5 ( (ligne 5 colonne 1)
=L(-2)C(-1) : référence relative ligne-colonne, 2 lignes au dessus et 1 colonne à gauche. Si tu es en B6 équivalent à =A4

Tu peux tester en allant dans les options, onglet 'général', cocher 'Style de référence L1C1'

eric
0
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
Re,

je répond ici au post 16 car ça devient le bazar ce fil ;-)

J'ai essayé la macro:
If ActiveCell.Offset(1, 0) = "" Then
Range(ActiveCell.Offset(1, 0), ActiveCell.End(xlDown).Offset(-1, 0)).EntireRow.Hidden = True
End If
Elle ne correspond pas tout à fait à ce queje souhaite: elle affiche
(je suppose qu'il faut lire 'masque') toutes les lignes de la feuille au-dessous de la cellule active, si ces lignes ont leur cellule de la même colonne que la cellule active, vide.
C'est quoi la différence avec ta demande du post 1 ? qui est :
Je voudrais masquer les lignes consécutives de la cellule sélectionnée, tant que la cellule au-dessous(de celle sélectionnée), est vide.

Or la feuille contient plusieurs plages correspondant à ces critères, et je souhaite que la 1ère plage seulement soit concernée.
Ben ça s'arrete à la 1ère cellule non vide..

Qcq chose m'échappe mais quoi ? :-s
0
CORNEMUSE
 
Bonjour, je précise, et te présente mes excuses pour l'erreur suivante,

J'ai effectivement remplacé True par False, pensant que ça serait sans conséquences...
En fait, avec True, ça marche, mais pas avec False.

Mon exemple, avec False:

cellule B1 occupée
B2 à B10, vides
B11 et B12 occupées
B13 à B17, vides
B18, B19, B20, occupées
B21 à B28, vides
B29 et B30, occupées

cellule active: B1. Je lance la macro, toutes les lignes sont affichées, alors que je ne souhaitais voir que les lignes 2 à 10.
De même, je voudrais lancer à partir de B12 ou B20 et découvrir les lignes 13 à 17 ou de 21 à 28.

Encore mes excuses et merci.
0