Aide, excel 2003 masquer réafficher les lignes vides

bonjour,

alors voilà mon problème,

je dois établir un questionnaire, et l’automatiser. j’ai tout réussi sauf la question ouverte. j’ai décidé de m’y prendre par thème.

j’ai créer 2 feuilles, sur la première feuille, j’ai créer un tableau de données (que j’ai nommé BDD) simple. Ensuite dans la seconde feuille, j’ai créer un tableau (que j’ai nommé Thème) à 2 colonnes où à partir de celui-ci j’ai créer un graphique.

Voilà comment je m’y suis pris pour cette question ouverte. Thème doit recueillir les données de BDD (en faisant juste “= et la séléction de la cellule désirée” pour la première colonne car ce sont les thèmes abordés, la seconde colonne sont les données numérique obtenues grâce à la fonction Recherche H, de ce fait, tout ce que je rentre dans BDD est alors automatiquement copié dans le tableau Thème), pour cela pas de problème, mais là où il y a problème, c’est que je ne ne connais pas les thèmes qu’il y aura lors du dépouillement. Alors j’ai élargi le tableau Thème (A:466 à B530) ce qui me laisse une assez grande marge. Malheureusement, Le graphique reprends les données nulles du tableau Thème, alors j’ai les 10 premières données et pour le reste je n’ai que des valeurs zéros sur le graphique ce qui n’est pas très esthètique, mais j’ai remarqué que si on masquait les lignes vides (ou nulle), le graphique ne prennait plus les données nulles et ne prenait en compte que les lignes non vides ( ou non nulle ).

Ce que je veux que dès qu’il y ait une données 0 dans la colonne B dans le tableau Thème, les lignes soit masquée dans celui-ci. mais dès que je rentre de nouvelles données dans BDD qui vont se répercutées dans thèmes en colonne A et B (de ce fait, ces lignes ne sont plus non vides), ces mêmes lignes réapparaîtront. Est-il possible de réaliser cela? si vous avez quelconque problème de compréhension dites le moi ^^
Edité le 10/06/2008 à 10:41

Tu peux utiliser une zone nommée pour la définition de ta série; au lieu de masquer les lignes inutilisées
A ce moment là, tu n’as plus qu’à réajuster les dimensions de cette zone lors de ta copie, et le graphique ne contiendra que les lignes utiles.
Regarde “Names” dans l’aide pour nommer ta zone en VBA

hum, je suis nul en vba et macro, j’ai découvert ça y’a 6 jours et je m’acharne a y comprendre un maximum de truc, mais c’est pas évident, entre la syntaxe et leur divers définitions. Et puis, il faut que la personne qui entre les résultats n’ait rien à faire hormis rentré ses résultats, c’est ce que mon supérieur veut, alors je suis bien embété ^^
Edité le 09/06/2008 à 12:24

Tu peux donner le morceau de code qui te sert à copier dans ta seconde feuille ?
Et aussi la formule qui correspond à ta série ?
(à prendre dans la barre de formule de ton graphique, quand la série est sélectionnée)

gcc,

tu vas vraiment me prendre pour un gros nul, mais je vois pas de quoi tu parles…
le morceau de code c’est quoi ? et la formule qui est censé être dans la série sélectionné aussi c’est quoi ?
=SI(DECALER(Dépouillement!A188;1;0;1;1)="";"";(DECALER(Dépouillement!A188;1;0;1;1))) ça c’est ma formule pour que quand je rentre des données dans BDD, elles soient directement copiées dans le tableau thème.
ensuite pour le graphique…-_- Peut-être, que tu parle de la séléction de la série de données du tableau?

Ah oui j’oubliais, j’ai pas encore fait de formule macro ou de truc sous vba j’y arrive pas, et les formule que j’ai pu testé ne collait pas
Edité le 09/06/2008 à 13:31

Non, c’est moi qui avais mal compris ; comme tu parlais de copie de la première feuille vers la seconde, j’en avais déduit que tu le faisais par macro.

Dans ton cas, pas de morceau de code donc, puisque tu travailles par formule.
Par contre, je ne comprends pas ce que tu veux faire avec
=SI(DECALER(Dépouillement!A188;1;0;1;1)="";"";(DECALER(Dépouillement!A188;1;0;1;1)))
Que ca marche, je n’en doute pas, ce que je me demande, c’est à quoi sert le SI dans ton cas

Sinon, pour le graphique, et sa série, c’est bien ce que tu dis.

Mais si tu veux arriver à ce que tu souhaites, tu seras obligé d’utiliser au minum une macro, soit déclenchée par bouton, soit au changement de valeur de tes cellules d’entrée, parce qu’il fut bien qu’à un moment le programme sache qu’il doit modifier les conditions d’affichage du graphique que ce soit en redimensionnant la série ou en masquant des lignes.

=SI(DECALER(Dépouillement!A188;1;0;1;1)="";"";(DECALER(Dépouillement!A188;1;0;1;1))) sert à ne pas émettre zéro , mais une cellule vide s’il n’y a aucune donnée, ni plus ni moins ^^.
Alors, pour ce qui du graphique, il est basé sur 2 colonnes : A466 à B 530, plus précisément, en A466 à A530 ce sont les différents thèmes (soit série 1 : ‘Résultats, Graphiques’!$A$466:$A$530), en B466 à B530 les données numériques (série 2 : ‘Résultats, Graphiques’!$B$466:$B$530)
Edité le 09/06/2008 à 14:14

Ca commence à être un peu plus clair.
Si j’ai bien compris, les thèmes (colonne A) sont toujours présents, mais certains peuvent être non utilisés (colonne B vide) ?

Edit :
La colonne A représente les valeurs d’abcisse de ton graphique, ou une série de données ?
Edité le 09/06/2008 à 14:37

plus ou moins c’est bien ça. voilà si la valeur numérique du thème est de 0 ce serait bien de masqué la ligne pour que le graphique ne le prenne pas en compte, pour que la ligne réapparaisse, il faudrait que la colonne A ( thème) et B ( données numériques) soient toutes deux remplies, je sais pas si c’est possible mais… ce serait bien que oui.

Je te précise au passage, que j’ai plusieurs associations, disons 10, que j’ai paramétré de manière à ce que quand je change d’association, il y ait les résultat pour l’association choisie, et donc il peut y avoir la donnée 0 en colonne B pour l’association 1 (donc la ligne est masqué) mais peut-être que l’association 2 n’aura pas 0 (donc la ligne réapprait ) je sais pas si ma précision est importante et compréhensible ou non, mais je me disais que plus y’a d’élément, mieu ce sera précis.

j’avais pas vu ton edit, mais oui c’est ça, la colonne A est en abscisse.
Edité le 09/06/2008 à 15:29

Il va donc te falloir une macro pour masquer les lignes.
Rien de très compliqué si on y a pas à pas.
Pour activer cette macro, tu as deux solutions

  • soit tu insères sur ta feuille un bouton “Actualiser le graphique” (juste au dessus du graphique par exemple)
  • soit tu actives un évènement du classeur à chaque modification de cellule, et l’évènement se chargera de lancer la macro

La première solution demande une action supplémentaire de la part de l’utilisateur (un clic) mais elle est plus simple à mettre en oeuvre.
En plus dans le cas de la seconde; comme il y a ajout/suppression de ligne à chaque saisie, la mise en page risque de bouger et cela ne sera pas forcément évident dans le cas de plusieus saisies successives.

A toi de choisir ; de ce choix dépendra la suite de l’écriture.

gcc,

la question ouverte est la dernière du questionnaire, alors pour des raisons de mise en page il devrait pas y avoir de problème, en ce qui me concerne j’opte pour la solution la plus simple puisque je devrait le présenter pour rapport de stage, alors je devrais savoir le réexpliquer ^^.

Bref, si tu me dis que la première solution est la plus simple d’accès, il vaut mieux aller en ce sens, après c’est aussi comme cela t’arrange ^^. là je termine ma journée mais je reviendrai demain.

au fait, gcc, je te remercie pour ton aide ^^

Après une mure réflexion, la solution 1 semble la plus adapté et la moins contraignante, et si j’ai bien compris, j’aurais juste à actualiser mes données, et cliquer sur le bouton, et hop magie : le graphique s’actualise ? Si je change d’association via la liste déroulante par exemple, de l’association 1 à 2, est ce que si je reclique sur le bouton, le graphique s’actualisera également.
Edité le 10/06/2008 à 09:19

Bon alors dans l’ordre, si tu n’es pas trop habitué aux macros

  • tu crées un module dans VBA
  • Dans ton module, tu crées une fonction
    sub MasquerLignes()
    Msgbox “Ma fonction”
    end sub

C’est pour tester le bouton ; tu remplaceras ensuite le message par le vrai code
Ensuite tu reviens sous excel, tu affiches la barre d’outils Formulaire, et tu choisis le bouton que tu mets à la place de ton choix sur ta feuille
Il va te demander à quelle macro tu veux l’associer, tu choisis la tienne (normalement, tu n’auras pas trop le choix)
Tu testes le bouton

edit :
Ensuite, il ne te reste plus qu’à écrire la fonction de masquage proprement dite, à l’aide d’une boucle sur ta zone de valeurs
Si tu bloques, tu dis où et on verra à ce moment là
Edité le 10/06/2008 à 09:28

gcc,

j’ai fait ce que tu m’as conseillé quand je clique sur le bouton, un message apparaît indiquant “ma fonction”
Ensuite, je sais pas écrire la fonction de masquage, j’ai découvert qu’il fallait taper “hidden = true” mais pour le reste, c’est tendu

Comme je te le disais, il suffit de faire une boucle pour balayer chaque valeur, utilisée ou pas
Si j’ai bien compris, c’est la zone B466 à B530
C’est elle qui servira de base pour la suite, tu n’auras qu’à changer les valeurs si ce n’est pas ca

Sub MasquerLignes
' d'abord démasquer tout
Range("B466:B530").rows.hidden = false

' balayer et masquer si valeur vide
for each c in Range("B466:B530)
  if c = "" then
    c.rows.hidden = true
  endif
next

end sub

gcc,

je met ce que tu m’as donné à l’intérieur de la première macro, à la suite, ou dans un autre module ?

en fait quand je clique sur le bouton, il y a marqué le même message “ma fonction”. si j’affecte a seconde macro, cela n’a aucun effet. De plus, je suis obligé de changé le nom de ton code “MasquerLignes” pour ta seconde macro, il me met un message “nom ambigüe” -_- je comprends pas…

c’est bon, j’ai trouvé où se situait l’erreur, enfin plutot la mienne plutot que la tienne, en fait dans la colonne B, il fallait mettre ça à la place : if c = “0” then. La cellule vide intervenait dans la colonne A ^^.

En revanche j’ai un autre souci, le tableau s’actualise bien, et c’est magique ^^, mais la séléction du tableau source va jusu’à 533 pour les colonnes A et B alors que toutes mes lignes sont cachés… Là je comprends pas d’où peut venir l’erreur, surtout que j’ai bien vérifié ta sélection et il n’y a pas d’erreurs… Là je suis dans le brouillard.

C’est bon, j’ai trouvé j’avais fait sans m’en rendre compte une mauvaise sélection auparavant ^^, et bizarrement j’y avais affecté cette mauvaise plage. Bref je te remercie vraiment pour tout ce que as fait Gcc, si tu habitais près de chez moi je t’aurais bien payé un mc do ^^ merci encore et à bientôt ( dans de nouveaux problème ^^ )
Edité le 10/06/2008 à 10:38

1 - Le message, c’était du provisoire pour tester le bouton, donc tu mets à la place
2 - if c=“0”
Ce serait plutôt if c=0 (sans les guillemets) mais bon …
et ce n’est pas dans ces cellules que tu as tes fameuses formules =SI(DECALER(Dépouillement!A188;1;0;1;1)="";"";(DECALER(Dépouillement!A188;1;0;1;1)))
Dans ce cas, comment as-tu des zero ?

3- Qu’est-ce que tu appelles la sélection du tableau source ?
“Toutes mes lignes sont cachées” de 1 à 65536 ?

tu peux faire une copie d’écran ?

Gcc,

=SI(DECALER(Dépouillement!A188;1;0;1;1)="";"";(DECALER(Dépouillement!A188;1;0;1;1))) cela était affecté pour la colonne A pour les thème ^^, ou je ne voulait pas de zéro mais des cellules vides s’il n’y avait pas de thème ^^. Pour le 0 j’avais juste fait une fonction recherche H, donc quand la cellule était vide dans le premier tableau (BDD), le second affichait automatiquement zéro

Maintenant, j’ai un autre souci, mineure certe mais bon, c’est beaucoup moins grave ^^ c’est dans mon premier tableau, j’avais mis exactement le même nombre de cellule que dans le tableau Thème. il y a 64 lignes qui compose le tableau Thème, mais j’en avais fait de même dans le tableau BDD ^^ y’a-t-il un moyen de simplement cacher les lignes et les réactivé si la ligne du dessus est rempli de nouveau ?

par exemple sur un tableau de 10 lignes, 7 lignes sont remplies, 2 sont cachées, et il reste une ligne pour remplir, et si celle-ci est rempli la ligne suivante s’affiche vide pour que je puisse éventuellement la remplir pour ensuite activé la suite. est-ce que tu comprends ?

Pour ce qui est à mon écran :
www.cijoint.fr…

Pour ce qui est sur ma macro vba :
www.cijoint.fr…

voila ce ce que je voudrais changé ou paramétré :
www.cijoint.fr…

(Les problèmes sont intervenus plus tôt que prévus… dsl)
Edité le 10/06/2008 à 11:11

Tu n’as besoin que d’un seul module dans ton programme : supprime la macro d’essai, recopie à la place celle qui te sert maintenant et supprime le module 2

Tes copies d’écran ne sont pas très lisibles, mais je crois avoir compris :
Dans ton premier tableau, tu souhaites masquer les lignes vides, à l’exception de la première.

Le pb est le même que pour la visualisation du graphique : pour mettre à jour les formats (les hauteurs de ligne), il te faut une macro, donc un bouton.
A partir de là c’est le même principe :

  • tu démasques le tableau
  • tu balaies toutes les lignes de ton tableau, et si la cellule contient quelque chose, ou si c’est la première cellule vide, tu ne fais rien, sinon tu masques

A la limite, si on part du principe que tu vas visualiser (donc appuyer sur le bouton existant) après chaque ligne saisie, tu peux inclure ce traitement à la suite de l’autre dans ta macro

il faut donc insérer une variable alors non ? en plus je comprends pas ton “c” il correspond à une variable ? je croyais que c’était i x ou y moi quelque chose comme ca
Edité le 10/06/2008 à 11:58

le c est de type Range, autrement dit il représente une cellule
Avec for each c in … on balaie toutes les cellules de la zone en question

Au niveau de l’utilisation que j’en ait faite, on ne devrait pas écrire c mais c.value qui représente le contenu de la cellule; mais .value est la valeur implicite.