IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[VBA-E] Une ScrollBar pour deux TextBox


Sujet :

Macros et VBA Excel

  1. #1
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 106
    Points : 66
    Points
    66
    Par défaut [VBA-E] Une ScrollBar pour deux TextBox
    Bonjour,

    J'ai deux textbox multilignes (qui n'ont rien à voir avec mes précédents messages )
    J'ai aussi inséré un ScrollBar.
    Comment dois-je faire pour faire défiler le texte des deux textbox à partir de la ScrollBar ?

    Je ne sais pas si ça peut servir, mais il y a autant de lignes dans chaque TextBox.

    Merci

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Faudrait simuler les flèches hautes et basses dans ton textbox (!)

    Pour chaque déplacement de l'ascenseur, parcourir les lignes jusqu'au bon N°
    Avec Sendkey, peut-être ???

    Ou un tableau de tes lignes de texte, en connaître le nombre (= Ubound(LeTableau) et n'afficher que la donnée correspondant à l'index du tableau fourni par le scollbar

    Juste des idées

  3. #3
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Une fois n'est pas coutume et je dois aller faire ma sieste

    Alors, et en saluant Ousk car le Sendkeys est ici la socution, mais en évitant l'analyse des flêches, pour ne me consacrer qu'à la scrollbar :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub VScroll1_Change()
     Text1.SetFocus
     Text1.SelStart = 0
     For i = 1 To VScroll1.Value
       SendKeys "{DOWN}"
       DoEvents
     Next
     Text2.SetFocus
     Text2.SelStart = 0
     For i = 1 To VScroll1.Value
       SendKeys "{DOWN}"
       DoEvents
     Next
    End Sub
    Précision : ne marche qu'en cliquant sur les petites flêches de la scrollbar.

    Si vous voulez la "totale" .... je vous laisse deviner ce qu'il convient d'ajouter.

    Bonne sieste à ceux qui, comme moi, auront la chance de la faire

  4. #4
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    merci pour le code, jmfmarques.
    par contre le raffraichissement est pas top
    Peut-être est-ce du au fait que les textbox récupèrent le focus, puis le perdent, etc....

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    le raffraichissement est pas top
    C'est à dire ?

  6. #6
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    Les Textbox clignotent (enfin, si on appuie rapidement sur les flèches de la ScrollBar)
    Et puis, j'ai essayé de changer le point de départ de selStart. jmfmarques l'a mis à 0.
    Le problème, c'est que mon Textbox peut afficher 14 lignes. Ce qui veut dire que si je veux voir la 15è, il faut cliquer 15 fois sur la flèche du bas. Ensuite, c'est bon, mais bon...
    Donc comme j'ai 48 caractères par ligne dans le Textbox, et qu'on peut voir 14 lignes, j'ai mis selStart à 672 (14*48).
    Bien m'en a pris, le PC a ramé comme un fou, j'ai eu du mal à stopper la macro, et quand ce fut fait, tout mon code a défilé, enfin, c'était un bor... sans nom (excusez moi )

  7. #7
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Hé bien, mes aieux !....
    Je reviens de la sieste pour découvrir qu'on peut faire confiance à votre esprit créatif !

    OK, ender, tu n'aimes pas revenir en haut, hein ?

    Alors voilà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim coucou As Integer
    Private Sub VScroll1_Change()
      If VScroll1.Value >= coucou Then
       vers = "{DOWN}"
      Else
        vers = "{UP}"
      End If
      Text1.SetFocus
      SendKeys vers
      DoEvents
      Text2.SetFocus
      SendKeys vers
      coucou = VScroll1.Value
    End Sub
    C'est tout !

  8. #8
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    Hé bien, mes aieux !....
    Je reviens de la sieste pour découvrir qu'on peut faire confiance à votre esprit créatif !

    OK, ender, tu n'aimes pas revenir en haut, hein ?


    C'est sympa d'avoir proposé une variante de ton code mais (désolé) j'ai pas compris la différence et la macro non plus.

    Par contre, y'a un truc qui cloche, c'est que si je "joue" trop avec la ScrollBar, le PC se met à ramer, la souris avance à 2 à l'heure (c'est pas mal mais bon...) et surtout si je veux m'en sortir avec le gestionnaire des tâches, histoire d'arrêter Excel, ben la fenêtre du gestionnaire va se cacher tout en bas de l'écran. Et c'est Javel la Croix et la bannière pour s'en sortir (rebooter le PC)
    Le SendKeys est surpuissant, non seulement il me fait descendre (ou monter) mes textbox mais en plus il agit sur tout ce qui bouge et qui est extérieur à la macro.

    J'ai un peu modifié ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub ScrollBar1_Change()
     TextBox1.SetFocus
     TextBox1.SelStart = 0
     For i = 1 To ScrollBar1.Value
       SendKeys "{DOWN}"
       DoEvents
     Next
     TextBox2.SetFocus
     TextBox2.SelStart = 0
     For i = 1 To ScrollBar1.Value
       SendKeys "{DOWN}"
       DoEvents
     Next
    End Sub
    Parce que il ne connait ni Text, ni VScroll.

    Et petite question, ne faut-il pas déclarer un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub ...... lib "Kernel32".....
    vu que je fais appel à la toute puissante API Windaube ?

    Merci

  9. #9
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Non, pas d'API


    Par ailleurs, regarde ce que j'avais précisé plus haut :

    J'avais bien dit :

    Précision : ne marche qu'avec des clics sur les 2 petites fkêches... et ajouté : "je vous laisse deviner ce qu'il faut faire pour "la totale" (le scroll)

    C'est toujours le cas ! A vous de jouer un peu avec vos méninges .... juste pour voir ...

  10. #10
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Alors, Ender ?

    A part renommer "glorieusement" les choses pour qu'elles correspondent à VBA (que je n'ai pas)... on ne sait pas faire, hein ?
    J'attends, moi... je suis prêt depuis belle lurette , et je veux voir ton agilité ...

    Un conseil : au lieu d'aller chercher des "trucs miracles" à la

    Et petite question, ne faut-il pas déclarer un truc du genre :

    Code :
    Private Sub ...... lib "Kernel32"..... (oh.... en voilà, une démonstration de connaissance des formes de déclaration d'une dll )
    vu que je fais appel à la toute puissante API Windaube
    ? (je vois, je vois...)
    fais donc une bonne et simple gymnastique de l'esprit (moi c'est fait) et montre ta puissance de réflexion.

  11. #11
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    Précision : ne marche qu'avec des clics sur les 2 petites fkêches... et ajouté : "je vous laisse deviner ce qu'il faut faire pour "la totale" (le scroll)
    Alors là je croyais avoir compris mais je suis totelement perdu. Les "2 petites flèches" en question sont bien celles du Scrollbar ? Si c'est le cas, j'avais bien compris qu'en appuyant dans la zone entre l'ascenseur et la flèche ne fonctionnerait pas. Et j'étais même prêt à n'utiliser que les "2 petites flèches".

    A part renommer "glorieusement" les choses pour qu'elles correspondent à VBA
    Désolé VScroll ne me dit rien en VBA. Alors j'ai remplacé par ScrollBar.

    on ne sait pas faire, hein ?
    Euh... non .
    Un truc que j'ai compris c'est que le SendKeys simule l'appui de la flèche du bas (ou du haut) du clavier.
    Par contre j'ai besoin d'une petite précision : pourquoi n'avoir fait qu'un et pas de ?
    C'était ça la totale dont tu parlais ? Dans ce cas, il faut placer un écouteur d'événement sur chaque flèche de la ScrollBar.

    Bon suis un peu perdu, désolé de pas avoir montré toute mon agilité

  12. #12
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Ouais...

    Bon, je m'étais un peu amusé avec les sendkeys, pour rigoler....(je suis assez taquin, parfois)

    regarde comme tout peut être simple
    Dans le code qui suit, rebaptise les choses à la VBA (Userform pour form, etc...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Private Sub Form_Initialize()
      If Len(Text1.Text) >= Len(Text2.Text) Then
        VScroll1.Max = Len(Text1.Text)
      Else
        VScroll2.Max = Len(Text1.Text)
      End If
      VScroll1.SmallChange = Text1.Height / 10
    End Sub
     
    Private Sub Text1_Change()
      If Len(Text1.Text) > VScroll1.Value Then VScroll1.Max = Len(Text1.Text)
    End Sub
     
    Private Sub Text2_Change()
      If Len(Text1.Text) > VScroll1.Value Then VScroll1.Max = Len(Text1.Text)
    End Sub
     
    Private Sub VScroll1_Change()
      Text1.SelStart = VScroll1.Value
      Text2.SelStart = VScroll1.Value
    End Sub
     
    Private Sub VScroll1_Scroll()
     VScroll1_Change
    End Sub
    Pas de UP - pas de DOWN - Aucun sendkeys - Pas de FOCUS à déplacer sans cesse - Tes 2 textboxes peuvent avoir un nombre de lignes différent l'une de l'autre - Elles doivent bien évidemment être multilignes -

    Tu peux utiliser à ton gré l'avancement lent (les petites flêches) ou rapide (l'ascenseur).

    Tu peux également écrire dans l'une ou l'autre (ou les 2) textbox (donc modifier la longueur du texte) et tout s'adaptera automatiquement ...

    Voilà tout Ender et c'est à la fois facile à imaginer et facile à comprendre. Il suffit de se concentrer un peu...
    Bonne chance

    PS : Je précise ici que je pourrais faire beaucoup plus élégant et précis encore si (je n'ai pas VBA) tu me disais que VBA connait l'objet Font et la propriété textheight qui s'applique à une variable de type string. A toi de me dire, donc...

  13. #13
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    Ok, merci jmfmarques.
    J'ai rebaptisé les objets à la sauce VBA et ça fonctionne. (et j'avoue que je préfère nettement ça aux SendKeys parce que je les comprends peut-être moins bien).

    En tout cas, merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub VScroll1_Change()
      TextBox1.SetFocus
      TextBox1.SelStart = ScrollBar1.Value
      TextBox2.SetFocus
      TextBox2.SelStart = ScrollBar1.Value
    End Sub
    Sinon, s'ils n'ont pas le focus, ça ne marche pas.
    Font existe bien pour changer la police et la taille du texte. Par contre textheight ne me dit rien.

    Merci encore

  14. #14
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Il n'y a pas de quoi, Ender.
    La seule façon de me remercier et de me faire plaisir (si tu y tiens) est sans aucun doute de commencer à regarder le développement informatique comme un simple jeu de bûchettes. Le mot "informatique" ne doit pas égarer... il est pompeux pour bien peu...
    Je l'ai dit mille fois : le mécanisme de la pensée vaut beaucoup mieux que tous les "trucs" et toutes les syntaxes du monde .
    Bonne chance à toi.

  15. #15
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    Comme je l'ai dit, le code me satisfait mais je pense qu'il va falloir l'améliorer.
    Je l'ai dit mille fois : le mécanisme de la pensée vaut beaucoup mieux que tous les "trucs" et toutes les syntaxes du monde .
    Je suis totalement d'accord avec toi et je vais faire fonctionner mon cerveau pour résoudre ceci :
    En effet, le fait de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TextBox1.selStart =ScrollBar1.Value
    place le curseur après le ScrollBar1.Value ème caractère.
    Ce code a ses limites (je sais, ce n'est pas bien de dire ça mais ce n'est pas une critique négative mais plutôt constructive), parce que s'il y a par exemple 10 caractères par ligne dans TextBox1 et seulement 5 dans TextBox2, l'un des deux va défiler plus vite que l'autre. Or ce qu'il faudrait, c'est que les lignes correspondent.
    Pour illustrer ce problème, remplissez TextBox1 avec les lettres de l'alphabet en sautant une ligne entre chaque lettre. Remplissez TextBox2 avec les chiffres de 1 à 26 en sautant une ligne entre chaque.
    On voit qu'à partir de j (10è lettre), il y a un décalage.

    Il faut donc remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TextBox1.SelStart=Scrollbar1.Value
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TextBox1.SelStart=InStr(----, TextBox1, vbCrLf)
    Je réfléchis pour trouver ce qu'il faut mettre à la place de ----.

  16. #16
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    parce que s'il y a par exemple 10 caractères par ligne dans TextBox1 et seulement 5 dans TextBox2, l'un des deux va défiler plus vite que l'autre. Or ce qu'il faudrait, c'est que les lignes correspondent.
    Tu ne pourras jamais rien pour remédier à celà, hélàs, sauf si chaque ligne de chacune de tes 2 textboxes est, d'une part, de longueur inférieure ou égale à celle de la largeur de la textbox et que, d'autre part, chaque ligne est séparée de l'autre par un retour à la ligne "physique" (chr(13), vbcrlf,...)

    J'ai déjà eu l'occasion d'en parler, notamment à propos d'un sujet relatif au numéro d'une ligne d'une textbox.... hé hé ! (ce qui était présenté comme une astuce, ne pouvait pas être fiable, hélàs... mais bon ....)

    S'il s'agit maintenant de faire avancer ensemble, dans les 2 textboxes, des lignes réellement séparées par des vrais retours à la ligne, la solution est encore plus simple que celle déjà donnée.

    PS : ne surtout jamais confondre, dans les textboxes, les vrais retours à la ligne avec ceux qui n'en sont pas (juste un affichage géré par VB, mais sans insertion d'un caractère spécial )

  17. #17
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    Il y a bien un vbCrLf entre chaque ligne J'en suis sûr

  18. #18
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Et chaque ligne "réelle" (donc entre 2 retours à la ligne) est affichable entièrement sur une seule ligne de la textbox (sans jamais de débordement) ?
    Si tu en es sur, celà va être réglé à la vitesse Grand V !

  19. #19
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    ben c'est bien emm...dant ça.
    Il y a bien un vbCrLf entre chaque ligne de TextBox2
    Par contre ce n'est pas le cas pour TextBox1, puisque VBA gère le retour à la ligne en cas de débordement.
    MAIS, ça peut peut-être servir, la police utilisée pour TextBox1 est CourrierNew. En d'autres termes, le nombre de pixels pour chaque caractère est le même que l'on ait affaire à un "i" ou à un "m".
    Donc, dans TextBox1, j'ai très exactement 48 caractères par ligne.
    On peut en tirer quelque chose ?

    Merci

  20. #20
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    1) :
    puisque VBA gère le retour à la ligne en cas de débordement.
    Non ! relis ce que j'ai écrit : ne pas confondre retour à la ligne "réel" avec gestion d'affichage.
    2)
    MAIS, ça peut peut-être servir, la police utilisée pour TextBox1 est CourrierNew. En d'autres termes, le nombre de pixels pour chaque caractère est le même que l'on ait affaire à un "i" ou à un "m".
    Donc, dans TextBox1, j'ai très exactement 48 caractères par ligne
    celà n'apportera rien car (voir ci-dessus) ne pas confondre ligne réelle et ligne affichée.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2003] Signer une macro pour deux développeurs
    Par soazig dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/05/2009, 10h26
  2. [Perl/Tk] scrollbar pour deux champs textes
    Par VinnieMc dans le forum Modules
    Réponses: 2
    Dernier message: 10/03/2007, 16h48
  3. Une session pour deux hébergement
    Par hugo69 dans le forum Langage
    Réponses: 5
    Dernier message: 11/12/2006, 16h53
  4. [VBA excel] une variable pour 2 classeurs
    Par totoche dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/01/2006, 09h42
  5. [FLASH MX] Une scrollbar pour plusieurs champs texte
    Par ffmlgraphics dans le forum Flash
    Réponses: 1
    Dernier message: 08/08/2005, 16h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo