XL 2016 Compatibilité de comportement Listbox entre 2016 et 365

mikachu

XLDnaute Occasionnel
Bonjour,

J'ai créé une macro VBA excel pour pouvoir faire un choix multiple sur une listbox et remplir automatiquement la cellule sélectionnée, et inversement, cocher les informations remplies dans la listbox. (voir fichier joint expurgé des données confidentielles, pour le principe de fonctionnement)

En gros, lorsque je sélectionne une cellule de la colonne C:
- Je vérifie que la cellule correspondante de la colonne A n'est pas vide
- Si c'est le cas, j'affiche la listbox remplie avec les sonnées dans la feuille de calcul Feuil2
- Si la case de la colonne C contient déjà des informations, je les récupère pour cocher les cases de la listbox correspondantes
- Lorsque je coche/décoche les cases de la listbox, je mets à jour la cellule sélectionnée

Tout fonctionne nickel, même si j'imagine que l'écriture de la macro pourrait être améliorée. Le problème est sur le positionnement de la listbox. J'utilise les propriétés Listbox1.Top et Listbox1.left pour positionner la listbox juste à droite de la cellule sélectionnée, et cela fonctionne nickel sauf sous office 365.

Je suis sous office 2016, et tout fonctionne correctement, mais lorsqu'une personne avec office 365 utilise le fichier, un décalage de la listbox se fait peu à peu au fur et à mesure qu'on descend dans le tableau, si bien qu'au bout d'un moment elle est carrément hors de l'écran.

Je n'arrive pas à identifier la cause de ce décalage, pouvez-vous m'aider à résoudre ce problème ? J'ai fouillé sur le forum mais je n'arrive pas à trouver de sujet correspondant.

Je joins également deux images pour expliquer le problème

Voilà ce qui se passe
erreur.GIF


voilà comment ça devrait être
correct.GIF



Merci d'avance :)
 

Pièces jointes

  • test macro selection multiple.xlsm
    46.5 KB · Affichages: 10
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonjour @fanch55
et donc la liste ne se place pas sur la ligne sélectionnée
de plus pourquoi repeter a chaque click la mise en forme de la listbox

je propose non seulement de simplifier tout ça mais de procéder différemment
quand on sélectionne une cellule en "C" qui est vide la liste est vierge de toute sélection mais quand on sélectionne une ligne ou l'on a déjà sélectionner des cases la liste s'affiche avec ceux qui ont déjà été sélectionne
je fait ca à la vas vite c'est a perfectionner ou a enjoliver le code comme vous voulez
VB:
Option Explicit
Dim stemp As String
Dim i As Long
Dim a
Dim btest As Boolean


Private Sub ListBox1_Change()
    If btest Then Exit Sub
    stemp = ""
    For i = 0 To Me.ListBox1.ListCount - 1
        If Me.ListBox1.Selected(i) Then
            stemp = stemp & Me.ListBox1.List(i) & "-"
        End If

    Next
    If stemp = "" Then
    Else
        stemp = VBA.Left(stemp, VBA.Len(stemp) - 1)
    End If

    ActiveCell = stemp


End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim a, b, i&, x&
    If ActiveCell.Row = 1 Or ActiveCell.Column <> 3 Then ListBox1.Visible = False: Exit Sub
    ListBox1.List = Feuil2.Range("A1", Feuil2.Cells(Rows.Count, 1).End(xlUp)).Value

    If ActiveCell.Column = 3 And Feuil1.Cells(ActiveCell.Row, 1) <> "" Then
        ListBox1.Visible = True: ListBox1.Top = ActiveCell.Top
        If ActiveCell <> "" Then
            a = VBA.Split(ActiveCell, "-")
            b = ListBox1.List
                For i = 0 To UBound(a)
                    x = Application.IfError(Application.Match(a(i), b, 0), "")
                    If x >= 1 Then ListBox1.Selected(x - 1) = True
                Next
            
        End If

    End If

End Sub
resultat
demo.gif
 

mikachu

XLDnaute Occasionnel
Bonjour @fanch55
et donc la liste ne se place pas sur la ligne sélectionnée
de plus pourquoi repeter a chaque click la mise en forme de la listbox

je propose non seulement de simplifier tout ça mais de procéder différemment
quand on sélectionne une cellule en "C" qui est vide la liste est vierge de toute sélection mais quand on sélectionne une ligne ou l'on a déjà sélectionner des cases la liste s'affiche avec ceux qui ont déjà été sélectionne
je fait ca à la vas vite c'est a perfectionner ou a enjoliver le code comme vous voulez
VB:
Option Explicit
Dim stemp As String
Dim i As Long
Dim a
Dim btest As Boolean


Private Sub ListBox1_Change()
    If btest Then Exit Sub
    stemp = ""
    For i = 0 To Me.ListBox1.ListCount - 1
        If Me.ListBox1.Selected(i) Then
            stemp = stemp & Me.ListBox1.List(i) & "-"
        End If

    Next
    If stemp = "" Then
    Else
        stemp = VBA.Left(stemp, VBA.Len(stemp) - 1)
    End If

    ActiveCell = stemp


End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim a, b, i&, x&
    If ActiveCell.Row = 1 Or ActiveCell.Column <> 3 Then ListBox1.Visible = False: Exit Sub
    ListBox1.List = Feuil2.Range("A1", Feuil2.Cells(Rows.Count, 1).End(xlUp)).Value

    If ActiveCell.Column = 3 And Feuil1.Cells(ActiveCell.Row, 1) <> "" Then
        ListBox1.Visible = True: ListBox1.Top = ActiveCell.Top
        If ActiveCell <> "" Then
            a = VBA.Split(ActiveCell, "-")
            b = ListBox1.List
                For i = 0 To UBound(a)
                    x = Application.IfError(Application.Match(a(i), b, 0), "")
                    If x >= 1 Then ListBox1.Selected(x - 1) = True
                Next
           
        End If

    End If

End Sub
resultat
Regarde la pièce jointe 1127577
Bonjour et désolé du retard, j'étais en congés et vu que c'est pour le boulot j'avoue que je n'y avais pas regardé.

Merci, en effet c'est déjà plus simple, par contre j'ai toujours le problème:
Quand j'utilise le fichier sur mon PC (sous office 2016) il n'y a aucun souci
Quand j'utilise le fichier sur un pc avec office 365, il se produit un décalage que je n'arrive pas à expliquer, et quand on arrive aux alentours de la ligne 500 il y a tellement de décalage que la listbox sort de l'écran.
Le problème est que je n'arrive pas à comprendre pourquoi ça merde... Des fois tout va bien, et sur un autre pc portable, tout va bien sur l'écran principal mais pas sur les écrans déportés, et sur un autre, c'est l'inverse, on a un décalage sur l'écran principal mais tout va bien sur les écrans déportés...

Pour moi le problème vient de cette instruction
VB:
ListBox1.Top = ActiveCell.Top
Il y a peut-être un problème avec le fait que l'on travaille avec deux écrans qui ont deux résolutions différentes?

Je pensais pouvoir adapter la solution proposée ici pour les userform à ma listbox mais je n'y arrive pas...

VBA Challenge - Positionner un UserForm sur Objet feuille dans une feuille fractionnée
 

Discussions similaires

Réponses
25
Affichages
644
Réponses
21
Affichages
1 K
Réponses
18
Affichages
601

Statistiques des forums

Discussions
312 104
Messages
2 085 349
Membres
102 869
dernier inscrit
radyreth