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

Microsoft 365 Rafraichissement Listbox

Calvus

XLDnaute Barbatruc
Bonsoir à tous,

Je me heurte à un problème qui me rend fou, et pourtant j'ai déjà eu à résoudre ce type de cas, mais je dois être trop fatigué !

J'alimente une listbox via un tableau.
Une fois la ligne sélectionnée, les données sont écrites sur une nouvelle feuille, et j'aimerais mettre à jour ma listbox avec les nouvelles données, donc une ligne à chaque fois.
Il s'agit en fait de comparer 2 tableaux, en ayant comme critère une date, et recharger la listbox avec toutes les données sauf celle qui vient d'être copiée dans la seconde feuille.
Malgré des heures de tentative 'en passant même par un dico), soit je retrouve les mêmes données, soit 2 soit ma listbox est vide. Je devient chèvre !
Un exemple figure sur le fichier joint.
Merci.
 

Pièces jointes

  • Mise à jour Listbox.xlsm
    28.7 KB · Affichages: 13

Calvus

XLDnaute Barbatruc
Bonjour,

@Gégé-45550 , @TooFatBoy ,

Merci encore.
Vos 2 solutions fonctionnent, mais je n'étais pas totalement satisfait, dans le sens où la solution de @Gégé-45550 ne rechargeait correctement la listbox que si on ne quittait pas la procédure. Il y a certainement quelque chose à adapter cependant, mais n'ai pas encore poussé davantage.
Celle de @TooFatBoy me convient partiellement dans le sens où il faut ajouter une colonne intermédiaire.

J'ai donc revu mon code et ai compris mon erreur dans l'utilisation de mon dictionnaire.
J'ai donc corrigé et obtenu le résultat souhaité.
Je vous mets le code et le fichier ci-joint.

VB:
Option Explicit
Private Sub CommandButton2_Click()
Unload Me
End Sub

Private Sub ListBox1_Click()
Dim i%, j%
Dim DerligArrivee%

Dim fDepart As Worksheet, fArrivee As Worksheet
Set fDepart = Sheets("Départ")
Set fArrivee = Sheets("Arrivée")

DerligArrivee = fArrivee.Cells(Rows.Count, 1).End(xlUp).Row
DerligArrivee = DerligArrivee + 1

ReDim a(1 To 1, 1 To 6)

For i = 0 To ListBox1.ListCount
    If ListBox1.Selected(i) = True Then
        For j = 0 To 5
            a(1, j + 1) = ListBox1.List(i, j)
        Next j
    End If
Next i

If fArrivee.Range("A2") = "" Then
    fArrivee.Cells(DerligArrivee - 1, 1).Resize(1, 6) = a
Else
    fArrivee.Cells(DerligArrivee, 1).Resize(1, 6) = a
End If

ListBox1.Clear

Call UserForm_Initialize


End Sub

Private Sub UserForm_Initialize()

Dim i%

Dim fDepart As Worksheet, fArrivee As Worksheet
Set fDepart = Sheets("Départ")
Set fArrivee = Sheets("Arrivée")

Dim TabDep(), TabArr(), tablo

TabDep = fDepart.Range("A2:G" & fDepart.Range("A" & Rows.Count).End(xlUp).Row)
TabArr = fArrivee.Range("A2:G" & fArrivee.Range("A" & Rows.Count).End(xlUp).Row)
Set tablo = fArrivee.Range("A2:G" & fArrivee.Range("A" & Rows.Count).End(xlUp).Row)

Label1.Caption = "Rendez-vous de la journée"

Dim BD(), d

BD = tablo.Value
   Set d = CreateObject("scripting.dictionary")

    d.CompareMode = vbTextCompare
        For i = LBound(BD) To UBound(BD)
            If CDate(tablo(i, 1)) = Date Then
                If Not d.exists(BD(i, 4)) Then d(BD(i, 4) & BD(i, 2)) = ""
            End If
        Next


For i = 1 To UBound(TabDep)
    If TabDep(i, 1) = Date And Not d.exists(TabDep(i, 4) & TabDep(i, 2)) Then
        ListBox1.AddItem TabDep(i, 1)
        ListBox1.List(ListBox1.ListCount - 1, 1) = FormatDateTime(TabDep(i, 2), vbShortTime)
        ListBox1.List(ListBox1.ListCount - 1, 2) = TabDep(i, 3)
        ListBox1.List(ListBox1.ListCount - 1, 3) = TabDep(i, 4)
        ListBox1.List(ListBox1.ListCount - 1, 4) = TabDep(i, 5)
        ListBox1.List(ListBox1.ListCount - 1, 5) = TabDep(i, 6)
    End If
Next i

Set tablo = Nothing
Set d = Nothing


With ListBox1
    .Visible = True
    .Left = 6
    .Top = 24
    .Width = 348
    .ColumnCount = 6
    .ColumnWidths = "60;40;40;60;70;60"
    .BackColor = RGB(0, 167, 246)
    .Height = ListBox1.Font.Size * ListBox1.ListCount + 2 * ListBox1.ListCount + (ListBox1.Font.Size + 2) / 4
End With


End Sub
Merci et bonne journée.
A plus.
 

Pièces jointes

  • Mise à jour Listbox Solution.xlsm
    33.9 KB · Affichages: 0

Calvus

XLDnaute Barbatruc
C'est une blague ???
Ah j'ai compris, il y a eu une erreur à l'enregistrement du fichier ! (ne pouvant ouvrir 2 fichiers ayant le même nom..) Pour ça que j'avais l'ancien !
Non, ça fonctionne nickel, merci ! Désolé pour l'erreur.
Eventuellement, comme pour Gégé, si on quitte la procédure, ça recharge tout au lieu des données manquantes seulement.
Mais merci, c'est nickel !

PS: et j'aurai appris une nouvelle façon de faire !
 

TooFatBoy

XLDnaute Barbatruc
si on quitte la procédure, ça recharge tout au lieu des données manquantes seulement.
Je ne comprends pas ce que tu veux dire, mais contrairement à la proposition de #10, dans la proposition de #15 je n'ai pas modifié la structure et la logique de ton code (c'est pourquoi cette proposition me paraît moins bien) ni ta macro de remplissage. Donc si le remplissage n'est pas bon...
 

Calvus

XLDnaute Barbatruc
Dans ton dernier fichier, si je n'ai pas fait d'erreur cette fois-ci, le code fonctionne parfaitement si l'usf est ouvert. Cela correspond donc en effet à ma demande. Or si on le ferme et revient, il recharge toutes les données de la date du jour, sans prendre en compte les celles qui ont été inscrites en feuille "Arrivée" (et donc ne pas les charger à nouveau). C'est le seul petit point, mais facilement modifiable je pense. Je regarderai à nouveau.
Qu'en est-il de la logique de mon code d'après toi ? Qu'est ce qui cloche ?
 

TooFatBoy

XLDnaute Barbatruc
Or si on le ferme et revient, il recharge toutes les données de la date du jour, sans prendre en compte les celles qui ont été inscrites en feuille "Arrivée" (et donc ne pas les charger à nouveau).
Sauf erreur de ma part, cela veut dire que ta macro de remplissage de la ListBox n'est pas bonne.


Qu'en est-il de la logique de mon code d'après toi ? Qu'est ce qui cloche ?
On a chacun sa propre logique.
Perso, plutôt que de mettre le code de remplissage de la ListBox directement dans la macro d'initialisation du UserForm, je préfère mettre ledit code dans une macro spécifique de remplissage de la ListBox.
Ainsi la macro de remplissage de la ListBox peut être appelée depuis la macro d'initialisation du UserForm, ou depuis la macro de sélection (ou de double-clic) d'un item de la ListBox, ou depuis n'importe quelle autre macro.
 

Calvus

XLDnaute Barbatruc
Oui, tu as raison, et c'est ce que je fais habituellement. Là, en l'occurrence, il s'agit d'une partie de code d'un projet beaucoup plus important, et j'étais en train de tâtonner, ce qui fait que j'écris les choses par étapes des fois, avant de mettre de l'ordre. J'ai copié une partie du code dans l'exemple sans me soucier de l'ordre des exécutions. Mais je devrais tenter de suivre ton conseil et essayer de structurer les choses davantage dès le départ.
 

Discussions similaires

Réponses
16
Affichages
728
Réponses
21
Affichages
2 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…