Code de changement d'aspect d'un bouton invalide

tessel75 -  
 tessel75 -
Bonjour,
J'ai le code suivant qui contrôle l'aspect d'un bouton (Appuyé / Relâché) selon qu'on tient la souris appuyée ou Relâchée.

VBA le rejette en me signalant que : "le nombre d'argument de la fonction est incorrect"


Function BOUTONS_Enfoncer(A)
    With CodeContextObject
        ![B].SpecialEffect = 2
        BOUTONS_Enfoncer = !B.SpecialEffect
    End With
Sortie:
End Function


Je remercie les spécialistes de VBA pour leur aide et leurs corrections.
A voir également:

15 réponses

f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 715
 
Re,

La definition de variables:

https://www.excel-pratique.com/fr/vba/variables.php
1
tessel75
 
Merci pour le post; je ne manquerai pas de le lire attentivement.
Bonne semaine. A +
0
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 715
 
Bonjour,

l'argument A sert a quoi?????
0
tessel75
 
Bonjour,
Je ne sais même pas moi-même; j'ai honte.
En fait il s'agit d'une base perso assez ancienne que j'ai réactivé il y a qq semaines. A l'époque ça marchait.
Je voulais à l'époque avoir des boutions de ma propre fabrication qui donnent l'aspect d'être enfoncé sur click, et relaché sur dé-click. Donc la variable A était à la base une zone de liste utilisé comme un bouton; et comme je ne voulais pas refaire un code pour chaque "bouton" de ce type, j'ai essayé une procédure que je puisse utiliser partout.
Merci de m'aider.
Plus au fond des choses, comme je suis un parfait autodidacte avec VBA il y plein de trucs de base que j'ignore et dont je me suis passé jusque là par pure ignorance de la manipulation des déclarations et autres subtilités.
Encore, Merci.
0
blux Messages postés 27147 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
Salut,

c'est signalé sur quelle ligne ?

Parce qu'il existe aussi l'objet 'bouton bascule' dans les contrôles standard access, qui doit avoir le même comportement que ce que tu souhaites réaliser.
0

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

Posez votre question
tessel75
 
Bonsoir f894009, Bonsoir Blux,
En fait ce n'est pas signalé, parce que je ne déclare presque jamais mes variables et de même je n'utilise quasiment jamais la déclaration "set", parce que je n'ai jamais compris, ni ce que ça signifiait, ni ce à quoi ça servait, et c'est peut-être ça le problème.
En fait je faisait les choses tant que ça passait, mais ça ne passe plus.
Quant à l'objet lui-même, ce n'est pas un "Bouton-bascule" ou un "bouton de commande" simple, qui n'ont que 2 positions, mais un bouton de commande personnel qui me permet d'appeler d'autres formulaires ou des états, ou n'importe quelle action, à partir de ce qui est sélectionné dans la "Boite de Liste", mais à laquelle je donne l'apparence d'un bouton avec plusieurs choix possibles.
Alors, finalement ma question est peut-être justement, quelle déclaration faire ? Et comment la faire?
Je vous remercie.
0
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 715
 
Bonjour,
Repartons du debut:

montrez une des lignes de code qui appelle cette fonction.

A+
0
tessel75
 
Avec tous mes remerciements pour la prise en main.

Il n'y a rien avant parce que c'est la 1ère ligne
Sur la propriété du contrôle en question "Sur Souris Appuyée" j'ai entré la fonction " =BOUTONS_Enfoncer(A)

Le reste est tel que le montre le code posté de la 1ère à la dernière ligne en totalité.
0
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 715
 
Re,

je vais regarder et je vous teints au courant. En tout etat de cause le controle ne peut pas etre un bouton de commande.

A+
0
tessel75
 
Bonjour F894009,
Non pas que je tienne à te contrarier, bien au contraire, je te poste le formulaire avec le pavé dont je parle et l'extrait de code.
Je n'ai pas mis la source qui ne présente pas d'intérêt pour la question qui est posée et qui, de plus comporte, des noms privés. Il ne s'agit que du code qui est visible en mode création évidemment.

Ce qui est question pour tout mon sujet se trouve avec le "Pavé" gris en haut à droite du formulaire. Il s'agit en fait d'un contrôle "Zone de Liste" que j'ai détourné en "bouton de commande". La liste est indépendante et n'est donc rattachée à aucune source, il y a seulement une liste de noms qui correspondent à ce qui va être appeler. Ainsi, en cliquant sur l'un ou l'autre de ces noms, on commande l'ouverture d'un autre formulaire ou d'un état. Tu pourras voir en lisant le code de "Sur click" qu'il est tout à fait possible de transformer un contrôle en "Bouton de commande"; et il marche très bien sans difficulté.

Pour le reste, la partie qui pose problème est celle correspondant à : "Sur souris appuyée" et "Sur souris relachée".

Encore merci

http://cjoint.com/?3CcpulJ7L4d
0
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 715
 
Re,

Non pas que je tienne à te contrarier Pas le moins du monde, je maintiens, cela ne peut s'appliquer a un controle bouton de commande parce que la propriete specialEffect n'existe pas. Pour le reste je vais chercher.

A bientot
0
tessel75
 
Tu avais compris que je plaisantais.
Pour ce qui est de "SpecialEffect", j'espère te convaincre en te demandant de regarder dans la fenêtre des propriétés des contrôles : Onglet Format / Ligne Apparence = "A 2 dimensions \ En relief \ 3D enfoncé \ Gravé \ Ombré \ Ciselé "
Il suffit alors de jouer sur cette apparence pour donner l'impression que le contrôle s'enfonce quand on clique, et revient à sa position quand on dé-clique. C'est tout bête.
0
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 715
 
Re,

Pour ce qui est de "SpecialEffect", j'espère te convaincre Oui pour un controle listbox, mais pas pour un controle bouton de commande

A+
0
tessel75
 
Eh! Oui! C'est ce que je me tue à essayer d'expliquer depuis le début.

3ème post : "Je voulais à l'époque avoir des boutons de ma propre fabrication qui donnent l'aspect d'être enfoncé sur click, et relaché sur dé-click. Donc la variable A était à la base une zone de liste utilisée comme un bouton"

5ème post : " la "Boite de Liste", mais à laquelle je donne l'apparence d'un bouton"

7ème post : "Il s'agit en fait d'un contrôle "Zone de Liste" que j'ai détourné en "bouton de commande""

Je n'ai pas dit que c'était un "bouton de commande" au sens strict du mot, et c'est bien pourquoi je voulais jouer sur les effets spéciaux, et que j'ai écrit ce code. Lequel me donne des soucis aujourd'hui.

Peux-tu me dire, après tout ça, à quoi sert le mot "set" parce que j'ai l'impression que beaucoup vient de là.
Ne devrais-je pas écrire :
"
dim A as contrôle
set A = Screen.ActiveControle
etc ...
"
0
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 715
 
Bonjour,

C'est ce que je me tue Quel devouement!!!!!!!

Private Sub Commande66_Click()
    Dim A As Control
    Set A = Screen.ActiveControl
    X = A.Name
    Me(X).Caption = "azer"
End Sub



L'exemple ci-dessus (quoique pas tres utile), vous permet d'affecter a une variable, definie comme Control, des proprietes du controle actif du formulaire.




A+
0
tessel75
 
Bonjour et Merci pour tes réponses.

J'ai bien regardé ta réponse et j'en conclus que ce qui pêchait dans l'introduction de mon code initial était surtout le paramètre " A "dans le titre de la procédure :
" Function BOUTONS_Enfoncer(A) "
qui en plus ne sert à rien puisqu'elle suivie de l'annonce :
" With CodeContextObject "
et que j'aurais dû faire suivre par :
" .SpecialEffect = 2" , plutôt que " ![B].SpecialEffect = 2 "
Et alors, la dernière ligne ( BOUTONS_Enfoncer = !B.SpecialEffect ) est aussi inutile et peut donc être supprimer.

Je ne voudrais pas abuser, mais peux-tu me dire à quoi servent vraiment toutes les déclarations "Dim ..."? Je sais qu'il faut les mettre, et tous les codes un peu conformes les affichent, mais comme je passe la plupart du temps ces déclarations et que mes codes marchent, je continue, sans doute à tord.
Et il en est de même pour l'expression "Set ..." dont j'ignore l'utilité. J'ai beau lire le didacticiel, je n'arrive pas à me convaincre puisque la variable créée pendant la procédure est effacée à la fin de cette même procédure.

Avec tous mes remerciements pour ta patience et tes explications, je te souhaite un bon dimanche.
0
blux Messages postés 27147 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
En résumé (et pour compléter le lien donné par f894009) :

Dim déclare une variable.
Let affecte une valeur à une variable de type non-objet (optionnel)
Set affecte un objet à une variable de type objet.

Ex :
Dim A as Integer        
Dim MaBase as Database        
A = 15        
Let A = 15        
Set MaBase = CurrentDb


Pour ce qui est de la création/suppression des variables, elles sont bien entendu supprimées à la fin de la procédure. Cependant, une variable de type Public ne le sera jamais. Mais ce n'est pas parce qu'une variable est supprimée que l'on va récupérer sa place en mémoire (VBA ne dispose pas à cet effet d'un 'garbage collector' (ramasse-miettes en français), dont l'usage est de libérer les portions de mémoire qui ne sont plus nécessaires). Au bout d'un moment, si l'application access est très gourmande en objets (et reste longtemps en utilisation), il peut se produire des problèmes de ressources maximales atteintes avec à la clé des comportements 'inattendus' (table qui refusent de s'ouvrir, temps d'exécution des requêtes anormalement longs...).
Il est donc de bon ton de déclarer les objets inutilisés comme ne contenant plus rien à la fin d'une procédure, grâce à Set MonObjet = Nothing, cela va provoquer la libération de l'espace mémoire utilisé (garbage collector 'manuel'). On obtient le même comportement en 'fermant' un objet (style recordset) : MonRecordset.Close.

Un peu plus d'infos ici :

https://docs.microsoft.com/en-us/office/troubleshoot/access/prevent-database-bloat-dao
http://dailydoseofexcel.com/archives/2004/06/07/nothing-keyword/
https://stackoverflow.com/questions/517006/is-there-a-need-to-set-objects-to-nothing

Et si tu as un peu d'acide acétylsalicylique à disposition, tu peux aller là :
https://docs.microsoft.com/en-us/archive/msdn-magazine/2002/october/basic-instincts-objects-and-values-part-2-memory-management
0
tessel75
 
Merci Blux
Voila qui est très clair.
Bonne journée
0