Programmation d'un Bouton Toggle

max_31

XLDnaute Junior
Bonjour
Quelqu'un pourrait il me donner un coup de man a programmer un bouton Toggle, avec les spécificités indiquées dans le fichier joint ?
J'ai essayé, mais le resultat est loin d'etre concluant...
Merci d'avance.
 

Pièces jointes

  • Exemple.zip
    13.9 KB · Affichages: 106
  • Exemple.zip
    13.9 KB · Affichages: 105
  • Exemple.zip
    13.9 KB · Affichages: 109
Dernière édition:

_Thierry

XLDnaute Barbatruc
Repose en paix
Re : Programmation d'un Bouton Toggle

Bonjour Max, le Forum


Voici un truc relativement allambiqué !

Dans un Module Standard (Module1 par Exemple) :

Code:
[COLOR=blue]Public[/COLOR] TheLocker [COLOR=blue]As Boolean
[/COLOR]



Dans Le Private Module de ThisWorkBook :

Code:
[COLOR=blue]Private Sub[/COLOR] Workbook_Open()
TheLocker = [COLOR=blue]True[/COLOR]
    Sheets("Données").ToggleButton1 = [COLOR=blue]False[/COLOR]
TheLocker = [COLOR=blue]False[/COLOR]
[COLOR=blue]End Sub[/COLOR]


Dans Le Private Module de La Feuille "Données" :

Code:
[COLOR=blue]Private Sub[/COLOR] ToggleButton1_Click()
[COLOR=blue]With[/COLOR] Me.ToggleButton1
    .Caption = IIf(.Value = [COLOR=blue]True[/COLOR], "Impression", "Ecran")
[COLOR=blue]End With[/COLOR]

[COLOR=blue]If[/COLOR] TheLocker [COLOR=blue]Then Exit Sub
[/COLOR][COLOR=blue]If[/COLOR] TestDateExist [COLOR=blue]Then[/COLOR]
    [COLOR=blue]If [/COLOR]TestDateValue [COLOR=blue]Then[/COLOR]
        MsgBox "Glop Glop", vbInformation
    [COLOR=blue]Else[/COLOR]
        MsgBox "Fourchette de Dates Invalide", vbCritical
        TheLocker = [COLOR=blue]True[/COLOR]
        Me.ToggleButton1 = [COLOR=blue]False[/COLOR]
    [COLOR=blue]End If
[/COLOR][COLOR=blue]Else[/COLOR]
MsgBox "Dates Invalides", vbCritical
TheLocker = [COLOR=blue]True[/COLOR]
Me.ToggleButton1 = [COLOR=blue]False[/COLOR]
[COLOR=blue]End If[/COLOR]
TheLocker = [COLOR=blue]False[/COLOR]
[COLOR=blue]End Sub[/COLOR]
[COLOR=#0000ff][/COLOR] 
[COLOR=blue]Private Function[/COLOR] TestDateExist() [COLOR=blue]As Boolean[/COLOR]
   [COLOR=blue] If[/COLOR] Not IsEmpty(Me.Range("B9")) [COLOR=blue]And Not[/COLOR] IsEmpty(Me.Range("C9")) [COLOR=blue]Then[/COLOR]
        [COLOR=blue]If[/COLOR] IsDate(Me.Range("B9")) [COLOR=blue]And[/COLOR] IsDate(Me.Range("C9")) [COLOR=blue]Then[/COLOR]
            TestDateExist = [COLOR=blue]True[/COLOR]
        [COLOR=blue]Else[/COLOR]
            TestDateExist = [COLOR=blue]False[/COLOR]
        [COLOR=blue]End If[/COLOR]
    [COLOR=blue]Else[/COLOR]
            TestDateExist = [COLOR=blue]False[/COLOR]
    [COLOR=blue]End If
End Function[/COLOR]
[COLOR=#0000ff][/COLOR] 
[COLOR=blue]Private Function[/COLOR] TestDateValue() [COLOR=blue]As Boolean[/COLOR]
    [COLOR=blue]If [/COLOR]Me.Range("B9") < Me.Range("C9") [COLOR=blue]Then[/COLOR]
        TestDateValue =[COLOR=blue] True[/COLOR]
    [COLOR=blue]Else[/COLOR]
        TestDateValue = [COLOR=blue]False[/COLOR]
    [COLOR=blue]End If[/COLOR]
[COLOR=blue]End Function[/COLOR]

Bon Appétit !!!

@+Thierry
 

max_31

XLDnaute Junior
Re : Programmation d'un Bouton Toggle

Merci Thierry.
C'est nickel.
Il faut juste que je reprenne 1 ou 2 trucs pour le faire coller exactement a mon fichier.
Mais une question : a quoi sert la variable "The Locker" ?
Bon appétit a toi.
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re : Programmation d'un Bouton Toggle

Re Bonjour Max

"TheLocker" est une variable Boolean (Vrai/Faux) permettant de vérouiller l'action de l'évènement "Click" du ToggleButton intempestif (Dans ce cas : Deux fois le message d'erreur) sans pour autant avoir à utiliser la dangereuse instruction "Application.EnableEvents = False" qui peut faire avoir des cheveux blancs aux développeurs !!!

Re-Bon Appétit

@+Thierry
 

Gorfael

XLDnaute Barbatruc
Re : Programmation d'un Bouton Toggle

max_31 à dit:
Bonjour
Quelqu'un pourrait il me donner un coup de man a programmer un bouton Toggle, avec les spécificités indiquées dans le fichier joint ?
J'ai essayé, mais le resultat est loin d'etre concluant...
Merci d'avance.
Salut
Un peu embêté, par ce que je n'ai pas tout le code, alors quelques petites remarques :

Tu utilises le nom "Impression" pour ton bouton :
il est préférable d'utiliser des noms qui ne peuvent pas être confondu avec des instructions, ça évite les ambiguïtés

Macro Impression_Click()
Tu viens d'avoir une action sur le bouton et tu testes .... la présence de quelque chose en B9 et C9
C'est pas le bouton qui est important ?
Comme je ne connais pas tes autres macro, je suis un peu perplexe, mais par principe, je vérifie l'état de ce qui a déclenché la macro

Moi, je verrai plutot :
PHP:
Private Sub Impression_Click()
If Me.Impression Then
    If IsEmpty(Range("B9")) Or Not (IsDate(Range("B9"))) Then
        Me.Impression = False
        Me.Impression.Caption = "Écran"
        MsgBox ("Veuillez saisir une date de début d'impression")
        Exit Sub
    ElseIf IsEmpty(Range("C9")) Or Not (IsDate(Range("C9"))) Then
        Me.Impression = False
        Me.Impression.Caption = "Écran"
        MsgBox ("Veuillez saisir une date de fin d'impression")
        Exit Sub
    Else
        If Range("B9") > Range("C9") Then
            MsgBox ("Veuillez mettre les dates dans l'ordre")
            Exit Sub
        End If
        Me.Impression.Caption = "Impression"
        'traitement impression'
    End If
Else
    Me.Impression.Caption = "Écran"
    'traitement Écran'
End If
End Sub
avec un tel test, ta macro d'ouverture devient
PHP:
Private Sub Workbook_Open()
    Sheets("Données").Impression = False
    Call Sheets("Données").Impression_Click
End Sub

Reste cohérent : tu ne peux pas avoir
Impression = False
Me.Impression.Caption = "Écran"

mais soit
Me.Impression = False
Me.Impression.Caption = "Écran"

soit
Impression = False
Impression.Caption = "Écran"

comme tu préfères.
Sinon, tu vas t'emmêler les pinceaux un de ces jours !

Une méthodologie stricte est plus contraignante, mais on gagne du temps dans le deboggage et la maintenance, surtout en cas de modifications importantes quand tu n'as plus le code en tête.

Juste un p'tit truc en plus :
Cells est utile quand la colonne est un nombre, autrement il vaut mieux utiliser Range : c'est plus explicite et plus rapide
A+
 
Dernière édition:

max_31

XLDnaute Junior
Re : Programmation d'un Bouton Toggle

Merci pour ces précisions Gorfael.

Je ne suis qu'un novice en programmation, et donc, tes elements vont clairement me permettre d'etre effectivement plus cohérent. Je veillerais a cela a l'avenir.
Par ailleurs, il est vrai que je n'ai pas bien compris la signification du "Me."

Sinon, peut etre pourrais-je essayer de mettre tout mon code, afin de voir ce qui ne va pas ?

Bon aprem'...
 

Gorfael

XLDnaute Barbatruc
Re : Programmation d'un Bouton Toggle

max_31 à dit:
Merci pour ces précisions Gorfael.

Je ne suis qu'un novice en programmation, et donc, tes elements vont clairement me permettre d'etre effectivement plus cohérent. Je veillerais a cela a l'avenir.
Par ailleurs, il est vrai que je n'ai pas bien compris la signification du "Me."

Sinon, peut etre pourrais-je essayer de mettre tout mon code, afin de voir ce qui ne va pas ?

Bon aprem'...
Re...
Me fait référence à l'objet en cours. Pas très important sur Excel, mais sur Access, par exemple quand tu emploies un formulaire en tant que sous-formulaire, ça évite les erreurs de code
Sur Excel, quand tu commence par Me., il te fournit le reste des propiètès, méthodes et objets accessibles et c'est plus facile, ça évite less erreurs d'écriture.

Ce que je disais, c'est qu'il faut soit le mettre soit l'omettre, mais toujours.
Quand je fais référence à un contrôle, je le mets toujours, sinon, je travaille avec Sheets("nom") ou Activesheet (pour les lignes, colonnes, cellules)

Le but, c'est e rendre le code le plus explicite possible : quand t'as une dizaine de macros imbriquées, et que tu veux faire une modif deux ans après, il faut des repères clairs.

Sinon, vas-y pour le code, on verra ce qu'on peut en faire
A+
 

max_31

XLDnaute Junior
Re : Programmation d'un Bouton Toggle

Salut Gorfael,

voila, j'ai mfini de mettre au point mon fichier, et mes macros.
A priori ca tourne comme ca. Mais bon, c'est loin d'etre du grand art, et j'imagine que cela doit pouvoir etre ameliorer, afin de diminuer les temps de traitement.

Il y a 2 grandes lignes dans ce projet :
1\ colorer la partie planning,
2\ preparer une sortie pour impression

Pour le 1\ :
Il y a 2 méthodes. L'une est longue : on balaye tout le document a l'aide du bouton "Réinitialisiser" et de la macro qui va avec. L'autre consiste a ne mettre a jour que les 3 autours de la ligne active, et si le curseur se trouve dans l'espace intitulé "Phase"...

Pour le 2\ :
L'objectif est de saisir ue date de début et de fin, et de ne faire apparaitre que les colonnes concernées lorsque l'on clique sur le bouton bascule "Ecran/Impression", et de revenir ensuite à l'affichage complet lorsque l'on reclique sur ce bouton.

J'ai mis des lignes masquées permettant d'avoir des parametres, auquel je fais reference dans mon code. J'ai inclu cela, car si je veux insérer des lignes, des colonnes, a différents endroits, cela se mettra a jour tout seul, sans que j'ai a y retoucher... (enfin j'espere).
Je reconnais q cela n'est peut etre pas tres academique, mais bon, je ne savais pas comment faire autrement, et peut etre que cela peut etre ameliore...

Pour ce qui est des autres améliorations possibles, cela serait les suivantes :
- quand on passe du mode "Impresion" au mode "Ecran", actuellement les colonnes "Phases" sont toutes affichées. Serait il possible de les regrouper via le "plan" que j'ai mis en place ?
- pour la mise en forme lors de la vu impression, est il possible de mettre un cadre en trait epais sur le bord, et revenir au format original lorsque l'on repasse en mode ecran : exemlple :
si les dates d'impression choisie sont comprises entre mars/2005 et décembre/2007, alors le bord gauche de mars/2005 passe en trait epais et le bord droit de décembre/2007 reste en trait epais. Par contre, lorsque l'on rebascule en mode Ecran, alors le bord gauche de mars/2005 repasse en pointillé, et le bord droit de décembre/2007 reste en gras.

Dis moi si tu as compris ce que je recherche, et surtout si tu as le temps de regarder...

Si tel n'est pas le cas, je comprendrais tres bien,

Merci d'avance...
 

Pièces jointes

  • Fichier a ameliorer.zip
    28.7 KB · Affichages: 90

Gorfael

XLDnaute Barbatruc
Re : Programmation d'un Bouton Toggle

Salu max_31
Pour l'instant, je m'amuse sur tes codes, et plutôt que de pourrir ton code de commentaires, autant les faire ici.
Attention, ce n'est pas ce qu'il faut faire, mais ce que je fais, et pourquoi je le fait

Variables Public :
Je n'utilises des variables globales que quand c'est absolument nécessaire :
- ça prend de la RAM
- elles peuvent être modifiées avoir une valeur autre que celle désirée
- ça peut provoquer des conflits si tu la redéclares, etc.
Je ne m'en sers que quand je dois transmettre une valeur à des procédures qui sont totalement indépendantes

Variables
Je ne suis pas programmeur : je peux rester des semaines sans faire du code.
Mon optique reste toujours la même : reprendre un code longtemps après ne doit pas m'obliger à passer des heures pour retrouver son fonctionnement.
donc, le type, je le mets en entier, et une ligne par déclaration. Et comme ça, je retrouve ma déclaration d'un coup d'oeil et je n'ai pas d'erreur en lisant long au lieu de & et integer au lieu dz %

Mes variables commencent toujours par une majuscule. quand je valides une ligne de code écrite en minuscules, Excel me met la majuscule, s'il la reconnait par ce qu'elle est déclarée. Si elle reste en minuscules, il y a une erreur.

j'utilise le moins possible des variables d'une seule lettre : X, Y, Z sont des compteurs (pour les boucles. Lig, Col ou Cel sont des variables plus explicites, et le temps perdu à taper 3 lettres, bof !
Par contre, quand je sais que mon erreur est sur la variable ligne, une recherche sur Lig est moins ch.... que sur L (fais un essai sur ta variable K pour mieux xomprendre ce que je dis)

Le type de variables :
J'essaie de mettre le type de variable adapté aux valeurs utilisées, mes en tenant compte (si possible) de la valeur maxi que celle-ci peut atteindre :
Les lignes sont toujours déclarées en Long, la valeur max étant 65536 qui dépasse la capacité Integer (32768). À ceux qui pleurent les 2 octets supplémentaires, je demanderais pourquoi ils n'utilisent pas Byte ? 90% des utilisations naviguent dans les 100 lignes/100 colonnes alors ?
Moi, je reste avec mes habitudes : Colonne avec integer (max=256) et ligne avec Long (max=65536). J'ai jamais de plantage pour dépassement de capacité. Moi, je ne vais jamais à la dernière cellule, volontairement, mais si ça arrive, je sais ce que je fais, mais mes (comme disait la chèvre) fichiers sont utilisables par tout le monde. Et depuis que ça m'est arrivé de chercher des heures à reproduire un plantage, pour découvrir que j'avais un espace en ligne 65536, je fais en sorte que ça ne m'arrive plus

EnableEvents
c'est ma hantise : je travailles des fois sur 4 ou plus de classeurs à macro évènements automatiques. et les résultats ne sont pas toujours visibles immédiatement. Si EnableEvents est sur False et que je ne le sais pas...
Donc, je le couple avec ScreenUpdating (voir l'aide) et surtout, je fais une gestion (basique, mais gestion quand même) des erreurs : c'est pas pour faire "PRO", c'est uniquement pour repasser EnableEvents à True

Cells(x,y).value
Je n'utilise Cells qu'avec un compteur de colonne
Cells(Lig,120) est plus difficile à localiser que Range("DP" & Lig)
Value étant la valeur par défaut, je ne la précise jamais, et ça ne peut pas génèrer d'erreur, puisque c'est la valeur par défaut

Je répète (sans odeur) que c'est Ma Vision du code et que chacun est libre de faire ce qu'il veut, mais par expérience, je sasi que mon code est compréhensible par n'importe quel néophyte. Pas le raisonnement, je parle du code, parce que des fois, je me fais des noeuds avec les boyaux de la tête et que quand je vois des #censurés# comme Monique, Bricofire ou d'autres(y en a tellement) qui obtiennent le même résultat (ou mieux) en plus simple et plus concis, ça me rend dingue. Mais je reviendrais et ma vengeance sera terrible

A+
 

max_31

XLDnaute Junior
Re : Programmation d'un Bouton Toggle

Je te remecie Gorfael pour tous les éléments que tu viens de m'indiquer, car moi, je ne suis q'un néophite, et tout ce que tu as dit au dessus, je ne le savais pas : ex la taille maxi d'un "Integer" ou d'un "Long".
Je ne savais pas nn plus ce que signifiait le "%" dans mon code. Si je l'ai utilisais, c'est que j'avais repris ces choses sur le forum, que je les avais agglomere... Mais je ne connaissais pas leur signification.
Donc pour ce qui est de EnableEvents, et de Range ("AB" & x) plutot que Cells(x,y).Value, la vois tu je n'y savais rien, mis a part ta remarque faite sur ce fil un peu pus haut...
Pour ce qui est du nom des variables, il est verai que j'aurais pu faire un effort, mais je ne pensais pas que mon code evoluerait comme ca.
Sinon, si tu arrives a comprendre mon code, et que tu vois comment l'ameliorer, alors la, n'hesites pas, car moi, j'en suis incapable...
En tous les cas, merci Gorfael pour ton "memo", je vais l'imprimer pour le réutiliser ulterieurement.
Merci.
 

Discussions similaires

Réponses
12
Affichages
289

Statistiques des forums

Discussions
312 504
Messages
2 089 076
Membres
104 021
dernier inscrit
abdesslem