Microsoft 365 Supprimer de la liste d'une Combo les données déjà présentes dans une colonne d'un TS

NONO14

XLDnaute Impliqué
Bonjour le forum,
J'alimente une comboActiveX (Cmb_Code) qui se trouve dans la feuille "CalculHS" avec les données d'un TS (t_Noms) qui se trouve dans la feuille "Liste_agents".
Ma Combo s'alimente à l'activation de la feuille "CalculHS". Je souhaiterai que les codes déjà présent dans la colonne "Code agent" du TS "t-Heures" de la feuille "CalculHS" soient supprimés de la liste.
Voici mon début de code mais je n'arrive pas à insérer cette information. Pouvez-vous m'aider s'il vous plaît ?
Merci par avance
VB:
Sub AlimenterComboBox()
    Dim WsCalculHS As Worksheet
    Dim WsListe As Worksheet
    Dim Tbl As ListObject
    Dim Cell As Range
    Dim Cbx As ComboBox

    ' Définir les feuilles de calcul
    Set WsCalculHS = ThisWorkbook.Sheets("CalculHS") ' Feuille de calcul contenant la ComboBox
    Set WsListe = ThisWorkbook.Sheets("Liste_agents") ' Feuille de calcul contenant le tableau structuré

    ' Définir le tableau structuré
    Set Tbl = WsListe.ListObjects("t_Noms") ' Nom du tableau structuré

    ' Définir la ComboBox en utilisant OLEObjects
    Set Cbx = WsCalculHS.OLEObjects("Cmb_Code").Object

    ' Vider la ComboBox avant de la remplir
    Cbx.Clear
    Cbx.AddItem ""
    
    ' Parcourir chaque cellule de la colonne "Code agent" du tableau structuré et ajouter les valeurs à la ComboBox
    For Each Cell In Tbl.ListColumns("Code agent").DataBodyRange
        Cbx.AddItem Cell.Value
    Next Cell

End Sub
 
Solution
essaie ca

VB:
Private Sub Cmb_Code_Change()
    Static isBusy As Boolean
    
    If isBusy Then Exit Sub
    isBusy = True

    Dim WsCalculHS As Worksheet
    Dim WsListe As Worksheet
    Dim TblNoms As ListObject
    Dim tblHeures As ListObject
    Dim codeAgent As String
    Dim Cell As Range
    Dim NewRow As ListRow
    Dim i As Integer
    
    ' Définir les feuilles de calcul
    Set WsCalculHS = Sheets("CalculHS") ' Feuille de calcul contenant la ComboBox et le tableau structuré t_Heures
    Set WsListe = Sheets("Liste_agents") ' Feuille de calcul contenant le tableau structuré t_Noms

    ' Définir les tableaux structurés
    Set TblNoms = WsListe.ListObjects("t_Noms")
    Set tblHeures = WsCalculHS.ListObjects("t_Heures")...

vgendron

XLDnaute Barbatruc
Bonjour

Vu que le code commence par vider le combo (Cbx.clear)
je ne vois pas à quel moment tu as des infos déjà présentes...
à moins que la TS contienne des doublons.. dans ce cas.. il suffit de remplir le combo SANS doublon
 

NONO14

XLDnaute Impliqué
Bonjour vgendron,
A chaque clic dans la combo ce code s'active et j'aimerai faire la même chose à l'activation de la feuille parce qu'à chaque fois elle reprend la liste des noms de la feuille "Liste_agents".
VB:
    ' Supprimer les codes présents dans la colonne "Code agent" de la ComboBox
    For Each Cell In tblHeures.ListColumns("Code agent").DataBodyRange
        For i = 1 To Me.Cmb_Code.ListCount - 1
            If Me.Cmb_Code.List(i) = Cell.Value Then
                Me.Cmb_Code.RemoveItem i
                Exit For
            End If
        Next i
    Next Cell
 

vgendron

XLDnaute Barbatruc
Ce dernier code est farfelu...
il supprime du combo les items qui sont dans la table...

si le combo est alimenté uniquement par le contenu de la table.. alors;. au final, il ne restera rien
==> Strictement équivalent à combo.clear (beaucoup plus rapide)

si le combo est alimenté par autre chose de plus que le contenu de la table==> au final, il restera les items qui ne viennent pas de la table (mais donc;. d'où viennent ils??)
 

NONO14

XLDnaute Impliqué
Ce dernier code est farfelu...
il supprime du combo les items qui sont dans la table...

si le combo est alimenté uniquement par le contenu de la table.. alors;. au final, il ne restera rien
==> Strictement équivalent à combo.clear (beaucoup plus rapide)

si le combo est alimenté par autre chose de plus que le contenu de la table==> au final, il restera les items qui ne viennent pas de la table (mais donc;. d'où viennent ils??)
J'ai fait ce code pour éviter que l'on clique 2 fois sur le même code et que le tableau ne s'alimente 2 fois des mêmes informations. De cette façon, l'administrateur ne peut cliquer sur les codes qui ne sont pas déjà saisis dans le tableau.
Voici mon fichier, la Combo est dans la feuille "CalculHS"
 

Pièces jointes

  • GestPersonnnel (5).xlsm
    568.5 KB · Affichages: 3

vgendron

XLDnaute Barbatruc
essaie ca

VB:
Private Sub Cmb_Code_Change()
    Static isBusy As Boolean
    
    If isBusy Then Exit Sub
    isBusy = True

    Dim WsCalculHS As Worksheet
    Dim WsListe As Worksheet
    Dim TblNoms As ListObject
    Dim tblHeures As ListObject
    Dim codeAgent As String
    Dim Cell As Range
    Dim NewRow As ListRow
    Dim i As Integer
    
    ' Définir les feuilles de calcul
    Set WsCalculHS = Sheets("CalculHS") ' Feuille de calcul contenant la ComboBox et le tableau structuré t_Heures
    Set WsListe = Sheets("Liste_agents") ' Feuille de calcul contenant le tableau structuré t_Noms

    ' Définir les tableaux structurés
    Set TblNoms = WsListe.ListObjects("t_Noms")
    Set tblHeures = WsCalculHS.ListObjects("t_Heures")

    ' Récupérer la valeur sélectionnée dans la ComboBox
    codeAgent = Me.Cmb_Code.Value

    ' Parcourir chaque cellule de la colonne "Code agent" du tableau structuré t_Noms
    For Each Cell In TblNoms.ListColumns("Code agent").DataBodyRange
        If Cell.Value = codeAgent Then
            ' Ajouter une nouvelle ligne au tableau structuré t_Heures
            Set NewRow = tblHeures.ListRows.Add
            
            ' Alimenter les colonnes de t_Heures avec les données de t_Noms
            NewRow.Range(1, 1).Value = codeAgent ' Ajouter le code agent dans la première colonne de t_Heures
            NewRow.Range(1, 2).Value = Cell.Offset(0, 1).Value ' Colonne C de t_Noms dans la colonne C de t_Heures
            NewRow.Range(1, 3).Value = Cell.Offset(0, 2).Value ' Colonne D de t_Noms dans la colonne D de t_Heures
            NewRow.Range(1, 5).Value = Cell.Offset(0, 3).Value ' Colonne E de t_Noms dans la colonne F de t_Heures
        End If
    Next Cell

    ' Supprimer les codes présents dans la colonne "Code agent" de la ComboBox
    For Each Cell In tblHeures.ListColumns("Code agent").DataBodyRange
        Me.Cmb_Code = Cell 'on place la valeur dans le combo
        If Me.Cmb_Code.ListIndex <> -1 Then 'si ca correspond à un listindex ==> ca veut dire que le code est listé dans le combo
            Me.Cmb_Code.RemoveItem Me.Cmb_Code.ListIndex 'on supprime l'élement du combo
        End If

    Next Cell
    Me.Cmb_Code.ListIndex = -1 'on déselectionne

    isBusy = False
    SommeHeure
    CalculHeuresSup
End Sub
 

NONO14

XLDnaute Impliqué
essaie ca

VB:
Private Sub Cmb_Code_Change()
    Static isBusy As Boolean
  
    If isBusy Then Exit Sub
    isBusy = True

    Dim WsCalculHS As Worksheet
    Dim WsListe As Worksheet
    Dim TblNoms As ListObject
    Dim tblHeures As ListObject
    Dim codeAgent As String
    Dim Cell As Range
    Dim NewRow As ListRow
    Dim i As Integer
  
    ' Définir les feuilles de calcul
    Set WsCalculHS = Sheets("CalculHS") ' Feuille de calcul contenant la ComboBox et le tableau structuré t_Heures
    Set WsListe = Sheets("Liste_agents") ' Feuille de calcul contenant le tableau structuré t_Noms

    ' Définir les tableaux structurés
    Set TblNoms = WsListe.ListObjects("t_Noms")
    Set tblHeures = WsCalculHS.ListObjects("t_Heures")

    ' Récupérer la valeur sélectionnée dans la ComboBox
    codeAgent = Me.Cmb_Code.Value

    ' Parcourir chaque cellule de la colonne "Code agent" du tableau structuré t_Noms
    For Each Cell In TblNoms.ListColumns("Code agent").DataBodyRange
        If Cell.Value = codeAgent Then
            ' Ajouter une nouvelle ligne au tableau structuré t_Heures
            Set NewRow = tblHeures.ListRows.Add
          
            ' Alimenter les colonnes de t_Heures avec les données de t_Noms
            NewRow.Range(1, 1).Value = codeAgent ' Ajouter le code agent dans la première colonne de t_Heures
            NewRow.Range(1, 2).Value = Cell.Offset(0, 1).Value ' Colonne C de t_Noms dans la colonne C de t_Heures
            NewRow.Range(1, 3).Value = Cell.Offset(0, 2).Value ' Colonne D de t_Noms dans la colonne D de t_Heures
            NewRow.Range(1, 5).Value = Cell.Offset(0, 3).Value ' Colonne E de t_Noms dans la colonne F de t_Heures
        End If
    Next Cell

    ' Supprimer les codes présents dans la colonne "Code agent" de la ComboBox
    For Each Cell In tblHeures.ListColumns("Code agent").DataBodyRange
        Me.Cmb_Code = Cell 'on place la valeur dans le combo
        If Me.Cmb_Code.ListIndex <> -1 Then 'si ca correspond à un listindex ==> ca veut dire que le code est listé dans le combo
            Me.Cmb_Code.RemoveItem Me.Cmb_Code.ListIndex 'on supprime l'élement du combo
        End If

    Next Cell
    Me.Cmb_Code.ListIndex = -1 'on déselectionne

    isBusy = False
    SommeHeure
    CalculHeuresSup
End Sub
J'ai un message d'erreur si le tableau t_Heures est vide "Objet requis" sur la 1ère ligne de ce code, je pense qu'il faut lui ajouter une condition si vide.
VB:
    ' Supprimer les codes présents dans la colonne "Code agent" de la ComboBox
    For Each Cell In tblHeures.ListColumns("Code agent").DataBodyRange
        Me.Cmb_Code = Cell 'on place la valeur dans le combo
        If Me.Cmb_Code.ListIndex <> -1 Then 'si ca correspond à un listindex ==> ca veut dire que le code est listé dans le combo
            Me.Cmb_Code.RemoveItem Me.Cmb_Code.ListIndex 'on supprime l'élement du combo
        End If
 

TooFatBoy

XLDnaute Barbatruc
Bonjour,

Je souhaiterai que les codes déjà présent dans la colonne "Code agent" du TS "t-Heures" de la feuille "CalculHS" soient supprimés de la liste.
Voici mon début de code mais je n'arrive pas à insérer cette information. Pouvez-vous m'aider s'il vous plaît ?
Vu que tu as une boucle pour remplir ta ComboBox, au lieu de systématiquement ajouter un item, il te suffit de tester si le code agent à ajouter existe dans ton TS "t-Heures" et dans ce cas ne pas l'ajouter à la ComboBox et passer au tour suivant de ta boucle.
 

NONO14

XLDnaute Impliqué
Bonjour,


Vu que tu as une boucle pour remplir ta ComboBox, au lieu de systématiquement ajouter un item, il te suffit de tester si le code agent à ajouter existe dans ton TS "t-Heures" et dans ce cas ne pas l'ajouter à la ComboBox et passer au tour suivant de ta boucle.
Bonjour TooFatBoy,
Désolé, mais je ne comprends pas...Il doit me manquer une lumière à un étage
 

vgendron

XLDnaute Barbatruc
faut faire un effort quand meme..
quand tu vois la ligne jaune.. et que je te dis qu'il faut tester si tu as bien des données à rentrer..
il faut ajouter le test

et si tu as à nouveau le meme message d'erreur mais sur une autre ligne de code (dans une autre macro).. bah. peut etre qu'il faut AUSSI ajouter le test ici..
 

Pièces jointes

  • GestPersonnnel (5).xlsm
    509.1 KB · Affichages: 1

NONO14

XLDnaute Impliqué
faut faire un effort quand meme..
quand tu vois la ligne jaune.. et que je te dis qu'il faut tester si tu as bien des données à rentrer..
il faut ajouter le test

et si tu as à nouveau le meme message d'erreur mais sur une autre ligne de code (dans une autre macro).. bah. peut etre qu'il faut AUSSI ajouter le test ici..
Même avec ton fichier j'ai toujours le même message. Cela survient lorsque l'on active la feuille "CalculHS" et que le tableau est vide.
Clique sur l'onglet de la feuille "CalculHS" et tu verras le message apparaître. J'ai beau faire des efforts mais je ne comprends pas.
J'ai nommé ton fichier (5b) pour ne pas écraser le mien
 

Pièces jointes

  • GestPersonnnel (5b).xlsm
    508.4 KB · Affichages: 2

Discussions similaires

Statistiques des forums

Discussions
314 426
Messages
2 109 473
Membres
110 488
dernier inscrit
glossaire