Excel VBA - Naviguer dans un très grand userform [Résolu]

Signaler
-
 TonyLucky -
Bonjour à tous,

Je travaille sur un jeu de course de voitures. J'ai "dessiné" un circuit sur un USF qui est plus grand que mon écran.
Ce que je souhaite, c'est à faire en sorte que mon USF "se déplace" en fonction de la position de la voiture, afin que celle-ci soit toujours visible. J'ai mis des scrollbars, et j'arrive à générer deux déplacements d'écran. Puis, rien ne se passe.
Hauteur du USF : 1500. Largeur : 2000
Voilà le code que j'utilise pour me positionner dans l'USF, en fonction de la position de la voiture (définie par la variable i, du label qui sert de case route - oui, je sais, un case select serait mieux dans ce cas, et c'est ce que je ferai quand j'aurai, grâce à vous, résolu le présent problème !) :

If i = 5 Then
    Me.ScrollTop = 0
    Me.ScrollLeft = 2000
    ElseIf i = 9 Then
    Me.ScrollTop = 2000
    Me.ScrollLeft = 2000
    ElseIf i = 12 Then
    ScrollLeft = 5000
    Me.ScrollTop = 2000
    ElseIf i = 15 Then
    ScrollLeft = 5000
    Me.ScrollTop = 5000
    End If



J'ai essayé avec différentes valeurs gauche et haute, sans succès. D'après ce que je comprends, les valeurs x et y sont les positions par rapport à l'écran, ce qui expliquerait peut-être pourquoi il ne se passe rien au delà de ces valeurs. Comment faire, alors ?
J'avoue n'avoir rien trouvé sur le net.
Je joins mon fichier ; il est pour l'instant très simple et très léger.
https://www.cjoint.com/c/KFzjl6qoola


PS : je suis en 64bits


Merci par avance de vos suggestions
Jean

Configuration: Windows / Firefox 89.0

5 réponses

Messages postés
7439
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
24 juillet 2021
643
Bonjour,
Merci d'avoir pris le temps de me lire.
J'ai testé le code que vous me proposiez sur mon USF. Cela fonctionne avec la souris, mais incomplètement, même avec l'exemple donné, puisqu'on ne peut pas "sortir" de l'écran par le haut.
De plus, il faut que le déplacement de l'USF se fasse automatiquement, en fonction de la position de la voiture.
Je vais essayé d'adapter ce code pour l'automatiser, mais je ne suis pas sûr que cette approche soit la bonne.
Pour info, j'ai dans d'autres applis des USF très hauts dans lesquels je peux monter et descendre sans problème avec la souris ou le curseur du scroll bar. Je suppose donc que c'est possible.
Messages postés
16435
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 juillet 2021
880
bonjour,
Tu n'as pas essayé avec de bonnes valeurs gauche et haute. Essaie avec des valeurs beaucoup plus petites.
As-tu affiché, à chaque étape, les valeurs de Me.ScrollTop & Me.ScrollLeft, par exemple via msgbox?
Cela t'éclairera.
Messages postés
16435
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 juillet 2021
880
suggestion, pour tester:
Private Sub CommandButton1_Click() 'lancer la voiture

Debug.Print "scroll " & Me.ScrollHeight & " " & Me.ScrollWidth
Debug.Print "Me " & Me.Height & " " & Me.Width; ""
If Application.Width < Me.Width Then    'Test si la fenètre Horizontale < le formulaire
      Me.ScrollWidth = Me.Width            'Taille du scrollbar horizontal
      Me.Width = Application.Width
End If
If Application.Height < Me.Height Then  'Test si la fenètre Verticale < le formulaire
      Me.ScrollHeight = Me.Height          'Taille du scrollbar horizontal
      Me.Height = Application.Height
End If
Debug.Print "scroll " & Me.ScrollHeight & " " & Me.ScrollWidth
Debug.Print "Me " & Me.Height & " " & Me.Width
Dim oldtop As Single, oldleft As Single
Me.ScrollLeft = 0
Me.ScrollTop = 0
Do
    oldtop = Me.ScrollTop
    Me.ScrollTop = Me.ScrollTop + 1
    oldleft = Me.ScrollLeft
    Me.ScrollLeft = Me.ScrollLeft + 1
    DoEvents
Loop Until oldtop = Me.ScrollTop And oldleft = Me.ScrollLeft
Debug.Print oldtop
Debug.Print oldleft
End Sub
Merci de cette réponse et de cette piste. J'ai essayé des tas de valeurs différentes, grandes ou petites, mais je bloque toujours sur le même point. En fait, il semblerait que le formulaire ne remonte pas au-delà d'une certaine valeur, pareil pour le déplacement vers la droite. La position maxi indiquée par le msgbox est 216, pour le haut, comme pour le côté.
J'ai essayé avec toutes les positions de l'userform (manuel, center,...).
Je me demande si le problème ne viendrait pas de la déclaration des scrollbars du formulaire, pourtant cela ressemble à ce que j'ai fait dans d'autres applis, sauf que là, j'ai les deux barres (horizontales et verticales).
Me.Height = 1300: Me.Width = 2000
Me.ScrollHeight = Me.Height + 100: Me.ScrollWidth = Me.Width + 100

Une idée ?
Bonjour,
En fait, comme toujours, il faut rechercher la simplicité... surtout en informatique !
J'ai trouvé la solution en me passant des scrollbars et en positionnant simplement le USF avec me.top et me.left. Cela marche parfaitement.
Merci à tous les deux pour vos suggestions ; elles m'ont aidées dans mon cheminement.
Bon week-end
Messages postés
16435
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 juillet 2021
880
peux-tu alors marquer la discussion comme résolue?
>
Messages postés
16435
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 juillet 2021

En tant que visiteur libre, je n'ai pas accès à la fonction résolue.
Sans vouloir abuser, pouvez-vous avoir la gentillesse de le faire si vous pouvez.
Merci et bon week-end