Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Boîte de dialogue et Scrollbar

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

mécano41

XLDnaute Accro
Bonjour,

Dans la partie jointe d'une application, j'ai le problème suivant :

- en cliquant sur les flèches gauche et droite de la barre "Excentration", une alerte survient si la valeur est inférieure à 14 ou supérieure à 23. En validant le message, la valeur revient à 14 ou à 23. Là, tout fonctionne comme je le souhaite.

- si j'utilise le curseur et que je le place directement entre 0 et 13 ou entre 24 et 30, il faut que je valide deux fois le message avant de retrouver la position normale.

Je n'arrive pas à trouver pourquoi dans ce cas, "Dés" (voir feuille de calculs - j'ai mis les noms de cellules dans la colonne à droite) reprend la valeur qui ne convient pas au lieu de garder celle que je viens de donner.

Quelqu'un pourrait-il jeter un coup d'oeil là-dessus? (la routine de gestion de la barre est "Sub ScrollBar2_Change()" dans "BoîteDeDialogue1")

Merci d'avance

Cordialement
 

Pièces jointes

Re : Boîte de dialogue et Scrollbar

Bonsoir Mécano,

Sans aller dans le détail (code un peu touffu dans un jargon qui n'est pas le mien à cette heure tardive), je vois cependant que:
  1. Tu déclenches l'alerte et de fait le userform dès que la valeur d'une cellule donnée (par ex "correction") pilotée par le scrollbar atteint un certain seuil et pas quand le Scrollbar.value atteint un seuil donné.
  2. Qu'il n'y pas de pb si la valeur du scrollbar est modifiée par les flèches + ou -, mais qu'il apparaît en utilisant le curseur.
  3. Que ce n'est pas ta procédure "alerte" qui remet la valeur dans les bornes mais ta procédure appelante.
Je vois plusieurs pistes:
  • la remise dans les bornes de ta valeurs dans ton code ci-dessous n'est pas adaptée à un "saut trop" grand et ne gère pas ce cas (point 2 ci-dessus), de fait après correction, ta valeur est encore hors seuil et l'alerte est appelée.
  • déclencher si possible l'alerte au changement de valeur du scrollbar et pas de la cellule
  • Stocker en variable la valeur en cours du scrollbar et le réaffecter si le seuil est dépassé. Ceci dans ta procédure "alerte"
Par exemple: une variable public dans un module standard :Public ScroVal
et au début du scrollbarchange :ScroVal=Scrollbar.value
ensuite dans ta procédure d'alerte, tu commence par rétablir la valeur du scrollbar :scrollbar.value=ScroVal.

Tout ceci à tester bien sûr!





Code:
If RappVolImp.Value Then ' ------------------------------- Si choix "Rapport volumétrique imposé"
    If BoîteDeDialogue3.VarDécCent Then  ' ------------------------------- Si choix "par décalage central"
        If Range("CosDeltaPlusTau").Value > 1 Then                                              ' Si cos(delta+tau) > 1
            Call Alerte(1)                                                                                       ' Alerte
            [COLOR=Blue][B]ScrollBar2.Value = Round(Range("DésMin").Value + 1, 0)  [/B][/COLOR]                         ' et retour curseur à position maxi autorisée
        End If
        If Range("Correction").Value < -Range("ExcMax").Value Then                     ' Si angle de correction de décalage dépasse la limite
        Call Alerte(2)
[COLOR=Blue][B]            ScrollBar2.Value = Round(Range("DésPourDécMax").Value - 1, 0)  [/B][/COLOR]            ' et retour curseur à position maxi autorisée
        Else
          [B][COLOR=Blue]  ScrollBar3.Value = Round(Range("Correction").Value, 0)  [/COLOR][/B]                        ' sinon, positionnement curseur décalage central (mis avant car arrondi à l'entier)
            DécAffiché.Value = CStr(Round(Range("Correction").Value, 2)) & " °"        ' On met la valeur à jour dans la boîte de dialogue ( avec décimales)
            Range("Delta").Value = Range("CorrRad")                                               ' Mise à jour dans la feuille
        End If
    End If
Voilà ce que je peux faire pour toi ce soir 🙂

Bonne soirée
 
Dernière édition:
Re : Boîte de dialogue et Scrollbar

Bonjour le forum, mécano

Oups, pas frais moi hier soir! 🙁
Non seulement tu avais bien identifié le pb de curseur et bouton, mais en plus j'ai dit des âneries:

La solution proposée de stocker la valeur du scrollbar en début de procédure ne peut se faire qu'avec 2 variables publiques! pas une seule....😱

Lors du scrollbarchange, remplir oldvalue avec newvalue et si tu dépasse un seuil, rétablir oldvalue. Vois si tu comprends l'exemple et dis nous.
Code:
Private Sub UserForm_Initialize()
NewScroVal = ScrollBar1.Value
OldScroVal = ScrollBar1.Value
End Sub


Private Sub ScrollBar1_Change()
OldScroVal = NewScroVal
NewScroVal = ScrollBar1.Value

'If ton test Then ScrollBar1.Value = OldScroVal

End Sub
On pourrait toutefois utiliser une seule variable publique à condition de ne la remplir qu'à la fin de la procédure scrollbarchange et après avoir fait le reste de l'alerte, etc....

Dernière chose : pourquoi ne pas limiter le scrollbar (min /max) au lieu de déclencher une alerte??

Bonne journée
 
Re : Boîte de dialogue et Scrollbar

Bonjour,

Merci pour ces réponses. J'avais déjà essayé des choses de ce genre, malheureusement cela ne change rien. J'ai réessayé ce matin exactement comme tu me l'as indiqué mais c'est toujours pareil.

Je ne limite pas le scrollbar parce que les limites qui me causent soucis sont variables. Elles varient en fonction d'autres paramètres introduits par ailleurs. En dépassant les limites, un cosinus devient >1 et c'est là le test réel, la limite du "désaxage" n'est qu'une conséquence.

Je vais encore chercher. Mon problème est que je vois bien qu'après l'alerte, on repasse dans le Scrollbar2_change() mais je ne vois pas comment je récupère la mauvaise valeur au lieu de la bonne!

Tu sembles dérouté par mon code mais cela ne m'étonne pas car :

- je n'ai pas beaucoup d'expérience en VBA (j'ai commandé un bouquin pour m'améliorer). Il est probable que le code est plus compliqué que nécessaire (manque de connaissance d'instructions plus puissantes)
- comme l'application comporte pas mal de calculs (matrices et vecteurs) je préfère faire ces calculs dans la feuille car c'est plus 'visuel' pour moi, d'où les nombreux "Range('nomcellule').value" du code

Ce n'est peut-être pas du tout la bonne méthode!

POUR INFO : Je fais cette application pour quelqu'un qui cherche à optimiser un compresseur/moteur pneumatique à N pistons oscillants en étoile. Comme il veut faire varier N, les inclinaisons des pistons, l'excentration du vilebrequin...etc.., je me suis amusé à lui faire une simulation graphique animée avec des calculs complémentaires. Comme je l'ai dit plus haut, les calculs sont, pour la plupart, faits dans la feuille. Le VBA permet de faire tourner le système et de gérer les boîtes de dialogue.

Si tu as envie (et surtout si tu as le temps) de jeter un coup d'oeil sur l'ensemble (en diagonale, pas en détails !), laisse-moi une adresse en message privé car l'application fait 450 ko (tout est commenté, feuille et VBA). Etant expérimenté, tu verras probablement tout de suite comment tu aurais traité cela! Cela me donnerait une orientation pour d'autres applications.


Encore merci pour ton intervention.

Cordialement
 
Re : Boîte de dialogue et Scrollbar

Re,

Je ne suis pas assez matheux pour suivre ton projet, je pense...Mais je veux bien y jeter un oeil.

Par contre je peux te conseiller de faire des test simplifiés avec les scroll bar, pour essayer de voir exactement à quel moment ça pêche..

1 scrollbar, 1 valeur de cellule, des seuils et tu regardes. ensuite tu essaye de voir... 😛

Je te passe un mail MP si tu veux m'envoyer le fichier.

A+
 
Re : Boîte de dialogue et Scrollbar

Re mécano

J'ai regardé ton fichier: superbe travail. Félicitations.

Concernant le scrollbar... pas encore trouvé pourquoi. Mais j'ai déjà eu le cas sur ce genre de choses. toujours délicat à gérer l'évènement "change". Surtout qu'en debuggage, ça semble passer, mais pas en "live"...

J'essaierai de faire encore un ou 2 tests.

Bonne soirée
 
Re : Boîte de dialogue et Scrollbar

Bonjour,

J'ai essayé de modifier le mini et le maxi de la barre comme tu l'avais suggéré. Cela fonctionne bien ... mais ... on repousse le problème. Lorsque l'on ajoute le code permettant de remettre les valeurs initiales, le problème revient ! Le problème dans tous les cas, c'est qu'il n'y a aucune action effectuée (genre valider, quitter...) en dehors de celle faite sur la barre (donc dans "scrollbar_change") on ne oeut donc rien faire puisque toute action sur la barre déclenche à nouveau cette routine !

Cordialement

Je joins un nouveau fichier, plus simple avec seulement un mini. Si quelqu'un avait une idée... merci d'avance
 

Pièces jointes

Re : Boîte de dialogue et Scrollbar

Bonjour Mécano,

J'ai fait encore plusieurs tests, en vain. Et je dois dire qu'il m'est difficile de voir la cascade de changement dans son ensemble, trop de valeurs passées, soit à un contrôle, soit à une cellule, et récupération de l'info dans une autre cellule, etc. Je vois globalement qu'une valeur n'est pas recalculée au bon moment et que le test qui suit est erroné, mais.... pas avec assez de précision.

Ce que tu pourrais faire, c'est un exemple archi simplifié et minimal avec description voir même un diagramme, de qui écrit quoi et où, et qui récupère quoi et où. En nommant tes controles de façon claire ( scroll1 passe la valeur à textbox 1 et à cellule A, etc,)

Sinon....

A+

Edit: Je regarde ton exemple
 
Dernière édition:
Re : Boîte de dialogue et Scrollbar

Bonsoir le fil, mécano,

Je crois que j'ai un début de solution 🙂: en doublant l'évènement "Change" par l'évènement "Scroll" pour le scrollbar

Dans l'exemple en PJ, j'ai recopié le code "change" dans le "scroll" et ça semble fonctionner. Au moins sur l'exemple....

En prime, la valeur du text box change lors du scroll, ce qui n'était pas le cas auparavant (chinois).

Fais des essais et dis nous.

Détail😛our initialiser le Uform, tu peux utiliser "Initialize" à la place de "activate"

A+
 

Pièces jointes

Dernière édition:
Re : Boîte de dialogue et Scrollbar

Bonsoir,

J'ai essayé dans l'application complète, cela a l'air de fonctionner. Je vais essayer de voir cela de plus près pour essayer de comprendre mais je pense que cela ne doit pas être simple. Je voudrais voir s'il faut recopier tout le code ou seulement une partie. J'essaierai d'étudier ça de plus près lorsque j'aurai reçu mon bouquin sur le VBA.

Si je trouve quelque chose, je te tiens au courant.

Encore merci pour ton aide !

Cordialement
 
Re : Boîte de dialogue et Scrollbar

Bonjour,

J'ai vérifié : tout va bien. Il semble que Scrollbar_change prenne en compte les modifs par clic sur les flèches et Scrollbar_Scroll les modifs par déplacement du curseur. Cela aurait pu être dit clairement dans l'aide ! 😡

Finalement j'ai donc mis :

Sub ScrollBar2_Change() ' Cas modif par flèches
Call ScrollBar2Modif
End Sub

Sub ScrollBar2_Scroll() ' Cas modif par curseur
Call ScrollBar2Modif
End Sub

et :


Sub ScrollBar2Modif()
......
ici toutes les instructions qui étaient précédemment dans Scrollbar2_change
......
End Sub

et tout semble fonctionner parfaitement.

Encore merci.

Cordialement
 
Re : Boîte de dialogue et Scrollbar

Re, mécano, le fil

Bien vu: c'est exactement ce que je voulais te proposer !😀 mais hier soir, j'étais un peu fatigué pour finaliser!
De plus, j'ai essayé d'analyser le phénomène plus en détail et j'en conclus par l'observation que:

Il y a bien 2 évènements distincts : change et scroll.
Si aucune routine n'est affectée au scroll c'est le change qui réagit une fois le curseur relâché. Sinon, c'est la procédure Scroll qui prend la main sans déclencher l'évènement Change.

En PJ, une petite démo avec 3 Scrollbar et les différentes situations.


Bonne journée à tous 🙂
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
2
Affichages
527
Réponses
13
Affichages
1 K
Réponses
3
Affichages
439
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…