Contrôle du slider dans un scrollbar

Bonjour à tous,

J'ai un petit problème sur un contrôle de scrollbar et plus spécifiquement sur le slider.

Mon problème provient du fait que j'utilise un scrollbar pour scanner des valeurs dans un tableau et tant que mes valeurs s'incrémentaient de 1, pas de problème, ça fonctionne à merveille. Le scrollbar est contrôlé par une autre macro nommée "Scrollbar_control"

J'ai maintenant des tableaux où l'incrément entre les lignes est de 2: 250, 252, 254 etc... (par exemple, ça peut être impair également)

J'arrive à bien contrôler l'incrément de 2 avec le "SmallChange" que je calcule dans un integer appelé Increment:

Increment = Abs(Range("CircularDichroism").Cells(3, 1).Value - Range("CircularDichroism").Cells(4, 1).Value)

     sh2.ScrollBars.Add(510, 30, 300, 18).Select
        With Selection
          .Min = lambda_min
          .Max = lambda_max
          .SmallChange = Increment
          .LargeChange = Increment * 5
          .Value = lambda_min
          .LinkedCell = "$K$2"
          .Display3DShading = True
          .OnAction = "Scrollbar_control"
        End With

Malheureusement cet incrément de 2 ne fonctionne qu'avec les fléches externes du contrôle du scrollbar. Lorsque j'utilise le slider, il incrémente de 1 et donc ne trouve pas les valeurs. Ça ne fait pas planter le code mais ça me met que les valeurs ne sont pas trouvées (ce qui est parfaitement normal!) ce qui est assez agaçant.

Quelqu'un aurait-il une solution simple à mon problème ?

Un grand merci d'avance pour vos lumières.

Bonjour,

Il n'y a pas moyen de régler l'incrément quand on clique directement sur la barre, par contre avec la molette de la souris vous aurez le même effet que le clic sur les flèches ce qui peut être une bonne solution.

Autrement, il faut, dans votre fonction qui utilise la valeur de la scrollbar, redéfinir la .Value de la scrollbar sur l'incrément le plus proche. On peut utiliser les fonctions Excel d'arrondi pour cela, elles sont parfaites.

On pourrait faire ça aussi directement dans le ScrollBar1_Change() event.

Merci pour la réponse. Au moins je ne perdrai pas de temps à essayer de contrôler le slider avec du code.

Sur mon excel (2013), la molette ne permet par contre pas de contrôler la valeur du scrollbar, ça me fait juste défiler ma feuille excel normalement, même si je suis dessus. Je peux par contre changer les valeurs du scrollbar en cliquant à droite ou à gauche du slider avec cette fois comme valeur d'incrément la valeur de la variable "LargeChange".

Merci pour la solution d'arrondi: est il possible de faire passer une valeur 251 à 252 (par exemple) avec cette fonction? Il me semblait que cela ne pouvait marcher qu'avec des décimaux.

Bonjour,

Bien sûr, on peut arrondir à n'importe quel entier assez facilement. Sur Excel 2016+ on a la fonction ARRONDI.AU.MULTIPLE assez équivoque. Sur 2013 et inférieur, on peut s'y retrouver à l'aide des mathématiques :

Un arrondi de n'importe quel nombre x à l'entier k est : k * round(x/k), avec round la fonction VBA.

Donc dans votre cas, pour réaligner n'importe quelle valeur sur l'incrément, ça donnerait

.Value = Increment * Round(.Value / Increment)

Bonsoir,

Un retour un peu tardif et un grand merci saboh12617 pour les pistes fort intéressantes pour calculer l'arrondi. Après réflexion et une bonne prise de tête, j'ai finalement trouvé une solution à mon problème qui marche très bien!

Je n'essaye plus d'attribuer la valeur du scrollbar à ma valeur de 200 à 350 (par exemple) qui peuvent changer par pas quelconque suivant l'expérience.

Du coup, j'ai créé un array avec toutes ces valeurs que je retrouve dans une colonne d'un range déjà nommé donc très facile à récupérer.

Après une transposition, je récupère un tableau à 1D avec toutes mes valeurs dans un array. Je peux ensuite naviguer dans mes valeurs assez simplement. En effet, les valeurs de mon scrollbar qui vont de 1 à ma dernière valeur (que je récupère facilement en comptant mon nombre de lignes de mon range nommé) correspondent justement à l'indice de mes valeurs dans mon array! Je n'ai qu'à faire un offset de la valeur du scrollbar pour les récupérer.

Bout de code expurgé;

'Création de l'array de valeurs de lambda pour le scrollbar

        Dim rnglambda As Range

        sh1.Range("CircularDichroism").Columns(1).Cells(2).Select
        Set rnglambda = Range(Selection, Selection.End(xlDown))

         Dim r As Long
         arrlambda = Application.WorksheetFunction.Transpose(rnglambda)
           ' For r = 1 To UBound(arrlambda)

        'calcul nombre de données dans l'array
Dim ScanPoints As Long
    ScanPoints = Range("CircularDichroism").Rows.Count - 1

sh6.Select     'retour sur feuille graphe

'définition du range pour les valeurs d'ordonnées à refraichir
Dim lambdA, ValeurScroll_lue, ligneLambda As Double  'valeur lue = valeur du scrollbar lue en D37
 'lambdA sera la valeur de lambda pour recherche et affichage en D40 pour le scrollbar
                                        'ligneLambda= ligne relative où se trouve les valeurs d'ordonnées pour lambda dans array CircularDichroism
ValeurScroll_lue = sh6.Range("D37").Value

Dim valeursY_CD As Range

            ligneLambda = ValeurScroll_lue

            lambdA = arrlambda(ValeurScroll_lue)
            Set valeursY_CD = Range("CircularDichroism").Rows(ligneLambda + 1).Cells(, 2).Resize(, nbCol - 1)
          

Encore merci saboh12617 pour votre aide

Bonjour,

Merci pour votre retour. Effectivement votre nouvelle méthode me semble beaucoup plus pratique, vous avez eu raison de reprendre à zéro. Merci pour votre partage de la nouvelle solution, bonne journée.

Rechercher des sujets similaires à "controle slider scrollbar"