Forum Clubic

Aide, excel 2003 masquer réafficher les lignes vides (page 2)

ok, mais ce que je veux c’est qu’en dessous de la lignes non vides, il y ait la ligne suivante de la plage automatiquement, pour que je puisse saisir la suite à chaque fois^^

C’est pas un problème

' démasquer
range("Axx:Ayy).rows.hidden = false  ' xx et yy sont les limites du tableau
AMasquer = false 'flag qui passera à true dès qu'il faudra masquer les lignes
for each c in range("Axx:Ayy)   if c = ""
    if AMasquer = true then
      c.rows.hidden = true
    endif 
    AMasquer = true
  endif
next

lorsque je le met à la suite de la macro, j’ai une erreure 1004 : la méthode range de l’objet global a échoué -_- et quand j’essai sur un autre module le curseur se met juste derrière “false”
le next est en surbrillance jaune, je crois que ton if c = “” de cette partie : for each c in range("Axx:Ayy) if c = “” doit être à la ligne et apparemment il faut ajouter “then”.
Edité le 10/06/2008 à 13:20

effectivement, j’ai oublié le then
et il faut bien ensuite aller à la ligne
Mais ca ne devrait pas donner une erreur de range

Tu as bien remplacé partout Axx et Ayy par les première et dernière valeurs de tableau (ex “A30:A78”) ?

Edit :
Il y a deux erreurs de syntaxe (2 fois la même)
Ce n’est pas
range("Axx:Ayy)
mais
range(“Axx:Ayy”)
(il manque le guillemet fermant
Edité le 10/06/2008 à 13:54

Ok !!!

Tout fonctionne pour le mieux dans le meilleur des mondes merci à toi pour t’être déquarcassé ^^ vraiment 1000 merci !!! Tout fonctionne à merveille ! C’est moi qui avais pas compris qu’il fallait que je remplace les xx yy lol autant pour moi merci encore ! Continue à être magicien comme ça bye

Bonjour gcc,

j’ai un nouveau problème, rien de bien particulier en fait. le problème est que bien que je sois content du résultat obtenu grâce à ton aide, je ne comprends pas certaines choses dans ta macro ci dessous :

" ’ démasquer
range("Axx:Ayy).rows.hidden = false ’ xx et yy sont les limites du tableau
AMasquer = false 'flag qui passera à true dès qu’il faudra masquer les lignes
for each c in range("Axx:Ayy) if c = “”
if AMasquer = true then
c.rows.hidden = true
endif
AMasquer = true
endif
next "

j’ai demandé à mon supérieur en excel, mais là où ça coince, c’est : “AMasquer = false 'flag qui passera à true dès qu’il faudra masquer les lignes”. En effet, ton “Amasquer” est une variable déjà intégré dans vba, ou tu l’as créer ? de même que nous ne comprenons pas le terme flag. Dans le cas où tu aurais créer ta variable, pourrais-tu nous l’expliquer davantage.
Aussi moi je ne comprends pas, comment tu as fait pour que cette macro soit directement affecté à la première feuille et non la seconde, de même pour l’autre macro qui agit sur la feuille 2 et non la première… il me semble qu’il nous faut taper des trucs comme : activesheets, worksheets, select on action… mais toi tu n’as rien utilisé de tout cela.
Ce serait bien que tu nous éclaire un petit peu surtout pour moi qui doit présenter ce document à la fin de mon bts…

merci à toi.

Non, c’est bien une variable créée de toutes pièces
En fait, il y a assez peu de variables intégrées à VBA et accessibles à l’utilisateur.
Tu vas surtout trouver des fonctions (même sans argument, comme CurDir par exemple), ou des constantes (comme xlRows)

Aussi moi je ne comprends pas, comment tu as fait pour que cette macro soit directement affecté à la première feuille et non la seconde, de même pour l’autre macro qui agit sur la feuille 2 et non la première… il me semble qu’il nous faut taper des trucs comme : activesheets, worksheets, select on action… mais toi tu n’as rien utilisé de tout cela."

Tout d’abord, je n’ai vu nulle part que tu utilisais plusieurs feuilles, j’ai donc fait comme si le classeur n’en comportait qu’une.
Ensuite, das la mesure où tu lances ta macro par un bouton, tu es sûr que ce soit la bonne feuille qui soit active, et quand tu ne précises pas, les références se font par défaut à la feuille active.
Au passage :
activesheets n’existe pas
select on action : jamais entendu parler

N’oublie pas qu’il y a plusieurs manières d’écrire le VBA dans Excel

  • le code associé aux feuilles, ou au classeur, dans lequel tu peux traiter les évènements
  • le code général écrit dans les modules, accessible depuis toutes les feuilles et utilisé soit en autonome (macros), soit appelé par les fonctions contenues dans les feuilles.

Nous n’avons vu là qu’une très petite partie des possibilités du VBA

Si tu laisses ton programme en utilisation à la fin de ton stage, n’oublie pas de le documenter abondamment, et de faire un maximum pour éviter les pièges aux futurs utilisateurs :
Par exemple, il faut impérativement que tu encadres tes zones tableau, de manière à ce que personne ne rentre de données en dehors des plages que tu t’es fixées.
Le bon sens voudrait que tu verrouilles les cellules en dehors des zones de saisie autorisées, mais c’est un autre problème, et ta macro telle qu’elle est écrite ne fonctionnerait plus

Bon courage pour ton rapport. N’oublie pas les chapitres “Mes points d’achoppement” et “Ce qu’il reste à faire pour améliorer le programme”, ca montre que tu maîtrises le sujet et c’est un bon thème de discussion à l’oral
Edité le 13/06/2008 à 09:50

Merci à toi gcc d’avoir vite répondu à mon appel ^^ je tiendrai compte de tes conseils. Mais j’aimerai savoir comment comment créer la variable, et à quoi elle fait référence. Et puis j’arrive pas à comprendre l’articulation qui permet de laisser la ligne suivante vide:

’ démasquer
range("Axx:Ayy).rows.hidden = false ’ xx et yy sont les limites du tableau
AMasquer = false 'flag qui passera à true dès qu’il faudra masquer les lignes
for each c in range("Axx:Ayy) if c = “”
if AMasquer = true then
c.rows.hidden = true
endif
AMasquer = true
endif
next

j’imaginais qu’on mettrai un truc comme : c+1 show ou un truc comme ça.
alors moi je comprends la macro comme ça :

les lignes de la plage Axx:Ayy ne sont pas cachées
la variable “Amasquer” est fausse
donc pour chaque cellule dans la plage
si la cellule est vide
et que La vérification Amasquer est positive
alors les lignes de la cellules sont cachées
Fin de la fonction if
Amasquer est vrai
Fin de la fonction if
on recommence la boucle

Fin de la macro

Après c’est vrai que j’ai vu qu’il y avait plusieurs possibilité d’écriture pour une seule réponse, mais toutes ne sont pas forcément aussi faciles à déchiffrer. ^^
Edité le 13/06/2008 à 11:12

up

Non, pas .show mais .select
C’est ce qu’on ferait si on voulait que l’affichage suive sur la feuille, ou si on avait choisi de travailler avec ActiveCell()
Mais c’est totalement superflu et en plus ça ralentit notablement l’exécution.

alors LA LIGNE contenant la cellule en question est masquée

Pour le reste, ton interprétation est correcte.
A noter aussi qu’on force Amasquer à Vrai à chaque fois que la condition est remplie, même s’il l’était déjà

ok j’y vois un peu plus claire, mais mon supérieur me demandait pourquoi avoir créer ta variable “Amasquer”, il ne comprends pas l’intérêt, mais si tu l’as créer et utilisé, ce n’est pas non plus par hasard, et il aimerait comprendre. Pour flag on avait compris drapeau en anglais, mais on voyait pas le lien avec l’informatique, merci à toi ^^

Demande-lui sa solution sans utiliser de variable, on comparera (il y a toujours plusieurs solutions pour un même résultat)

Pour bien voir à quoi elle sert, il suffit que tu la rendes inactive, tu vas voir tout de suite la différence.
Pour la rendre inactive, il suffit qu’elle ait la même valeur tout au long du programme, puisqu’elle ne sert que de test
Donc pour voir la différence, tu as juste à remplacer
AMasquer = false
par
AMasquer = true,
et laisser le reste inchangé

Bonjour gcc,

Nous avons essayé la méthode de mon supérieur et avons comparé, et oui si nous ne mettons pas ta variable, la ligne vide suivante ne s’affiche pas. En fait, lui il n’aurait pas du tout créer de variable donc pas de “Amasquer”. Résultat la macro fonctionnait parfaitement, mais elle était incomplète. Et si nous avons bien compris ton raisonnement ou lecture de ta maccro, lorsque celle-ci fini sa boucle, elle réintervient à Amasquer faux, vu que Amasquer au départ est faux donc la ligne suivante apparaît vide. Et moi si j’ai bien compris ton raisonnement, on pourrait comprendre que :

“’ démasquer
Range(“A189:A255”).Rows.Hidden = False ’ xx et yy sont les limites du tableau
AMasquer = False 'flag qui passera à true dès qu’il faudra masquer les lignes”

est la fin de la macro, et dès que je remplis la ligne, cette partie de la macro entre en action :

“For Each c In Range(“A189:A255”)
If c = “” Then
If AMasquer = True Then
c.Rows.Hidden = True
End If
AMasquer = True
End If
Next”

et Next relance sur la variable “Amasquer” qui s’arrête car, la condition rempli n’est pas encore valide, donc la seconde partie de la macro n’entre pas de suite en ligne de compte.

Enfin si j’ai une erreure de raisonnement dis le.
Edité le 16/06/2008 à 10:33

:non:
Non, un programme ne fait toujours que ce qu’on lui dit de faire.
Lorsqu’on boucle, on conserve la valeur de Amasquer
Et heureusement, parce que sinon la ligne
c.Rows.Hidden = True
ne serait jamais exécutée.

Pour être logique jusqu’au bout, on devrait avoir
“For Each c In Range(“A189:A255”)
If c = “” Then
If AMasquer = True Then
c.Rows.Hidden = True
End If
if AMasquer = false then
AMasquer = True
endif
End If
Next”

Autrement dit; mettre le flag à Vrai une bonne fois pour toutes, sachant qu’ensuite il va y rester.
Mais il n’y a aucun inconvénient à reforcer à vrai une valeur qui l’était déjà.
Et comme c’est le PC et pas toi qui fais le boulot, et qu’en plus l’affectation est à peine plus compliquée pour lui que le test qu’on lui demanderait de faire …

ouais, mais je comprends plus trop du coup, si Amasquer est vraiment vide on efface la ligne contenant la cellule, mais si c’est Amasquer s’avère faux, on laisse visible la ligne, mais si Amasquer est faux alors ca veut dire que cette cellule est non vide. Misère je comprends plus rien… je suis tout embrouillé sur l’articulation de la macro :
si c’est vide on masque : parce que “c” est vide, donc Amasquer est vrai
et on démasque si Amasquer est faux…
ou le Amasquer à la notion positive vrai traduit que Amasquer est vraiment faux

AMasquer n’est JAMAIS vide.
Il est initialisé à faux dès sa création.
Et il y reste jusqu’à ce qu’il rencontre une ligne AMasquer=true.
Et ensuite, comme il ne rencontre plus jamais de ligne AMasquer=false, il reste à vrai tout le reste du programme.

Non, ca veut dire simplement qu’on ne l’a pas encore changé de valeur.
Il n’y a aucune relation directe entre l’état de la cellule et la valeur de A Masquer, si ce n’est que pour faire le changement de valeur il faut être dans une condition (if) et qu’on n’y rentre que si la cellule est vide

A aucun moment on ne démasque dans le programme
Sauf à la première ligne bien sûr, mais là c’est de l’inconditionnel, AMasquer n’est même pas encore défini, il ne le sera qu’à la ligne d’après

Edit : si tu sais utiliser le debugger, déroule le programme en pas à pas, en mettant un espion sur la variable AMasquer et un autre sur le contenu de la cellule
Tu comprendras mieux.
Edité le 16/06/2008 à 11:51

Je vais essayer