ouvrir et fermer un plan par macro

  • Initiateur de la discussion andré
  • Date de début
A

andré

Guest
Salut à vous,

Je souhaite remplacer ou doubler un plan (Menu Données / Grouper et créer un plan / après avoir décoché sous Paramètres "lignes de synthèse sous les lignes de détail" et "colonnes de synthèse à droite des colonnes de détail) par une macro qui permettrait d'ouvrir et de fermer ce plan (tant verticalement qu'horizontalement) par un double-click gauche sur la première cellule de la ligne ou de la colonne de synthèse de chaque plan ?

A titre d'exemple : l'aide MS / Raccourcis clavier / Raccourcis clavier.
Sous cet exemple c'est par un simple click, mais dans ce cas, il n'y aurait pas moyen de modifier les données de la cellule, problème qui me semble être résolu par le double-click.

Il y a-t-il l'un d'entre vous qui aurait ce type de macro sous la main, ou quelque chose qui s'en rapproche ?
J'ai bien essayé d'en enregistrer une, mais il y a refus !
Le petit exemple joint montre ce que je souhaite réaliser.

Merci d'avance.
Ândré.
 

Pièces jointes

  • PlanV2.zip
    8.5 KB · Affichages: 55
@

@Christophe@

Guest
Bonsoir André,

Voici le code à mettre dans Feuil1:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Left(Target.Value, 6) = "Poste " Then
Cancel = True
If ActiveWindow.DisplayOutline = False Then ActiveWindow.DisplayOutline = True: Exit Sub
If ActiveWindow.DisplayOutline = True Then ActiveWindow.DisplayOutline = False: Exit Sub
End If
End Sub


Bonne fin de journée

@Christophe@
 
@

@Christophe@

Guest
Re,

Correction André, j'avais lu trop vite, dsl

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Left(Target.Value, 6) = "Poste " Then
Cancel = True
If Rows(Target.Row).ShowDetail = False Then Rows(Target.Row).ShowDetail = True: Exit Sub
If Rows(Target.Row).ShowDetail = True Then Rows(Target.Row).ShowDetail = False: Exit Sub
End If
End Sub


@Christophe@
 
@

@Christophe@

Guest
Re,

Voici ton code complét pour les ligne et colonne:

Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Left(Target.Value, 6) = "Poste " Then
Cancel = True
If Rows(Target.Row).ShowDetail = False Then Rows(Target.Row).ShowDetail = True: Exit Sub
If Rows(Target.Row).ShowDetail = True Then Rows(Target.Row).ShowDetail = False: Exit Sub
End If

If Target.Value = "OFFRE" Or Target.Value = "METRE" Then
Cancel = True
If Columns(Target.Column).ShowDetail = False Then Columns(Target.Column).ShowDetail = True = True: Exit Sub
If Columns(Target.Column).ShowDetail = True Then Columns(Target.Column).ShowDetail = False: Exit Sub
End If
End Sub


Bonne chance

@Christophe@
 
A

andré

Guest
Salut @Christophe@,

Ta macro marche super bien, merci !
C'est exactement ce que je souhaitais.
Je m'étonne néanmoins de deux choses : la première c'est que je sois parvenu à la faire fonctionner (lol), la deuxième c'est que je sois parvenu à me faire comprendre (relol).

Si je puis me permettre, j'aurai quand même une petite remarque.
La macro fonctionne sur le contenu (les valeurs) des cellules.
Pour Offre, Métré et Prix, pas de problème, mais les termes Poste 1, Poste 2, ... étaient donnés à titre informatif, en réalité ils portent n'importe quelle dénomination, tel "Maçonneries de fondation" ou "Dalles de béton coulées sur place" ou "Tuiles en terre cuite", ...

Il faudrait donc que ce soit la position de la cellule dans le Plan (supérieure gauche) qui soit prise en compte, et non son contenu.
Est-ce possible ?

Autre chose : vois-tu la possibilité, et ceci uniquement pour les colonnes, que l'ouverture d'un plan puisse en même temps fermer les autres.

En tous cas, bravo, c'est simple et ça coûte pas cher (rerelol).

Ândré.

PS : si j'ai bonne mémoire, ne serais-tu pas également de région bruxelloise ?
Si c'est le cas, je t'offre les prochains jours la Duvel promise depuis si longtemps à @+Thierry, tant pis pour lui !
 
@

@Christophe@

Guest
Re,

Oui André je suis de bxl, lol

Je m'occupe de ton fichier, juste une petite question?

Les termes qui vont remplacer poste1, poste2,... auront t'il toujours la même adresse, ou va tu rajouter des lignes, ce qui va crée un déplacement des autres cellule.

Merci pour l'info

@Christophe@
 
@

@Christophe@

Guest
Re André,

Voici avec cellule fixes:

Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Application.ScreenUpdating = False
If Not Application.Intersect(Target, Range("B9,R9,AG9,B21,R21,AG21,B29,R29,AG29,B36,R36,AG36")) Is Nothing Then
Cancel = True
If Rows(Target.Row).ShowDetail = False Then Rows(Target.Row).ShowDetail = True: Exit Sub
If Rows(Target.Row).ShowDetail = True Then Rows(Target.Row).ShowDetail = False: Exit Sub
End If

If Target.Value = "OFFRE" Or Target.Value = "METRE" Then
Cancel = True
Outline.ShowLevels ColumnLevels:=1
Columns(Target.Column).ShowDetail = True
End If
Application.ScreenUpdating = False
End Sub


@Christophe@
 
A

andré

Guest
Salut @Christophe@

Je reviens de promenade avec mes chiens et j'avais pensé à quelque chose, lorsque je prends connaissance de ta réponse.

Pour les colonnes, il serait peut-être préférable que la macro puisse fonctionner sur toute la hauteur des colonnes, qui sont fixes, A:A, et les deux autres à désigner ultérieurement.
Donc en double-clickant n'importe où dans une de ces colonnes la macro réagirait en ouvrant le plan situé à sa droite et en fermant les autres.

De même pour les lignes un double-click n'importe où sur la ligne de synthèse devrait ouvrir ou fermer le plan, mais les lignes ne sont pas fixes et peuvent varier de 5 à 50 lignes !
Il faudrait donc que la macro ne soit d'application que sur les lignes de synthèse qui sont variables en positionement.
Peut-être qu'un double-click n'importe où dans un plan l'ouvrirait ou le fermerait, si c'est plus facile que de localiser les lignes de synthèse, mais laisse-moi encore réfléchir cette nuit, et demain matin j'aurai bien trouvé quelque chose.

Puisque ma mémoire (bruxelloise) était bonne, je te propose d'arroser cela ensemble, quant tu veux et où tu veux.
Mon nadresse e-mail : lindenhof@pi.be

A demain.
Ândré.
 
@

@Christophe@

Guest
Re,

Voila le resultat André, j'espère que cela conviendra:

Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
On Error GoTo fin
If Target.Value = "OFFRE" Or Target.Value = "METRE" Then
Cancel = True
Outline.ShowLevels ColumnLevels:=1
Columns(Target.Column).ShowDetail = True
End If

If Not Application.Intersect(Target, Range("B:B, R:R, AG:AG")) Is Nothing Then
Target.EntireRow.ShowDetail = Not Target.EntireRow.ShowDetail
Cancel = True
End If
Exit Sub
fin:
Cancel = False
End Sub


Bonne nuit et à demain

@Christophe@
 
A

andré

Guest
Bonjour @Christophe@,

Merci pour ta solution, mais il y a un petit problème : les colonnes ne se ferment plus par le double-click, alors que dans la première version cela fonctionnait bien.
Je suppose que ce n'est qu'un détail, je n'ai pas encore cherché l'erreur.
Pour les lignes c'est parfait.

Mais comme la nuit porte conseil, voici ce à quoi j'avais songé.

Les lignes de synthèse se différencient des autres du fait que se sont les seules à avoir une valeur en colonne B.
Donc : =SI(INDIRECT("B"&LIGNE())<>"";la macro;"")
Dès lors, il me semble que le double-click n'importe où dans une ligne de synthèse déclenchera la macro d'ouverture et de fermeture des lignes.

Pour les colonnes de synthèse c'est la même chose, elles sont les seules à avoir une valeur en ligne 1.
Ici toutefois il y peut-être moyen de simplifier en supprimant le plan.
Le double-click sur une colonne dont la cellule de la ligne 1 est non vide afficherait ou cacherait les colonnes jusqu'à la cellule suivante non vide de la ligne 1.

Cette dernière procédure ne pourrait toutefois pas être d'application pour les lignes, car je souhaite pourvoir trier les plans sans les dissocier de leurs détails.

J'avais aussi songé à baptiser ce petit programme "musette" (= accordéon - lol), qu'en penses-tu ?

Bonne journée et à bientôt.
Ândré.
 
@

@Christophe@

Guest
Bonjour André,

A oui, une bonne nuit de repos, cela porte ses fruits, lol

Pour être honnête André, les formules c'est pas trop mon truc!

Je viens de tester la dernière macro, et elle marche bien chez moi sous Win XP, excel XP.

As tu une erreur, un bug,... qu'elle est exactement le problème, ou cliques tu,...?

Merci

@Christophe@
 
A

andré

Guest
Resalut,

Je viens de parcourir ta dernière proposition plus en détail, et j'ai honte (lol).

En cliquant sur une colonne de synthèse ouverte, effectivement elle ne se ferme pas.
Mais en cliquant sur une autre, la première se ferme bien.
C'est parfait, il suffisait de le savoir.

Comme en réalité je devrais agrandir ce tableau par une série de plans de colonnes supplémentaires, j'ai essayé d'adapter la macro, ... et j'y suis parvenu.
C'est une victoire sur moi-même, beaucoup plus importante que toutes les autres.

Mais comme le nombre de plans de colonnes supplémentaires n'est pas défini au départ, et que je ne souhaite pas devoir intervenir à chaque fois dans cette macro, n'y a-t-il pas moyen d'écrire un code qui cache et affiche les colonnes entre les cellules non vides ?

C'est peut-être beaucoup te demander, mais aujourd'hui n'est pas un jour comme un autre (c'est mon anniversaire : j&m=aa - lol).

Ândré.
 
@

@Christophe@

Guest
Re,

Bonne anniversaire André. Et une Duvel pour fêter cela, lol

Je comprends pas bien ce que tu veux faire, il y a surement pas de problème. Explique moi un peu mieux.

Se que j'ai compris c'est qu'il risque d'y avoir d'autre plan, en plus de Offre et Metre. C'est bien cela?

Bonne journée

@Christophe@
 
A

andré

Guest
Je suis relà !

Merci pour tes bons voeux, eh oui, cela en fait une de plus, ... heureusement d'ailleurs (lol).

La feuille finale contiendra, en dehors de l'offre, du métré et du prix, plusieurs "états d'avancement" c'est à dire le calcul mensuel des travaux exécutés afin de pouvoir en facturer le montant total.
Le nombre de ces états d'avancement est variable suivant la durée du chantier et peut varier de 2 à 10, voire plus.

Afin de ne pas alourdir inutilement le classeur (ce qui réduit la vitesse de calcul) je souhaite créer ces états d'avancement au fur et à mesure de mes besoins, donc à chaque fois un plan supplémentaire.
Ceci m'obligera aussi de modifier à chaque fois la macro en y ajoutant le nouveau nom de la colonne de synthèse et la référence de la colonne suivante.

De là l'idée suivante pour la macro :
Si je double-clique dans une colonne où la cellule de la ligne 1 est vide, alors rien,
Si cette cellule n'est pas vide et que la cellule visible à sa droite est vide, alors je sélectionne toutes les cellules vides jusqu'à la première cellule non vide et je cache ces colonnes,
Au cas contraire, je sélectionne la cellule non vide et sa voisine non vide et j'affiche toutes les cellules cachées qui se trouvent entre les deux premières.

Il me semble que cette procédure devrait me permettre de pouvoir agrandir ma "musette" sans toucher à la macro.

Qu'en penses-tu ?
Attend quand même que je réflchisse encore un peu avant de t'exciter (lol).

Merci encore pour ta collaboration.
Ândré.
 
@

@Christophe@

Guest
Re bonjour André,

J'espère que cela te conviendra,

Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
On Error GoTo fin
If Not Application.Intersect(Target, Range("A1:IV1")) Is Nothing Then
Outline.ShowLevels ColumnLevels:=1
Target.EntireColumn.ShowDetail = Not Target.EntireColumn.ShowDetail
Cancel = True
End If

If Not Application.Intersect(Target, Range("B:B, R:R, AG:AG")) Is Nothing Then
Target.EntireRow.ShowDetail = Not Target.EntireRow.ShowDetail
Cancel = True
End If
Exit Sub
fin:
Cancel = False
End Sub


Bonne journée

@Christophe@
 

Discussions similaires

Statistiques des forums

Discussions
312 339
Messages
2 087 407
Membres
103 538
dernier inscrit
Mbolatiana Hyacinthe