Eviter doublons dans Combobox

Bonjour

Donc une fois la combobox2 matériel, remplie vous n'avez plus besoin du fichier gestion-loc et on peut donc le fermer ?

Ce fichier ne sert qu'à récupérer les infos pour la combobox3 et 2. Juste ?

Oui c'est exactement ça!

Votre fichier en retour pour test sur les checkbox1 et 2 (Autre n'est pas opérationnel) et sur les deux combobox3 et 2

La combobox3 est par défaut triée de plus petit au plus grand sur base du tri effectué dans le fichier Gestion-loc_materiel.

Pour l'instant le fichier gestion-loc restera ouvert jusqu'à ce que vous cliquiez sur Valider. J'ai opté pour cette solution car si par hasard vous changez de BL dans la combobox3 (suite à une erreur de choix par exemple , il faut pourvoir à nouveau avoir les bonnes infos dans la combobox2

Dans de votre retour avant de poursuivre si nécessaire

D'accord, le souci c'est qu'il ne faudrait pas modifier le fichier "gestion loc matériel". Or là les lignes sont en sens inverse ..

Est ce qu'on pourrait pas laisser l'ordre des ligne comme c'est, rentrer les BL dans "tablo" et ensuite trié en sens inverse tablo ? De manière à pas touché au fichier de base?

Lors du click sur Valider le fichier gestion-loc sera fermé sans être sauvé (le code ne vous demande rien sur ce fichier). Il restera donc identique à ce qu'il était à l'ouverture de l'userform et donc non modifié. Donc pas de souci l'ordre des lignes restera tel quel

Sinon que voyiez vous comme problème à ce niveau ?

D'accord parfait !

Petit problème supplémentaire : Si on coche en premier la case IJINUS, et qu'on coche ensuite la case Hydreka, une boîte de dialogue s'ouvre en disant " le fichier est déjà ouvert... patati patata .." on clique sur Oui continué, et là un message d'erreur apparait: "Erreur 1004 la méthode 'Range de l'objet' _Worsheet' à échoué". En cliquant sur débogage ça me désigne la ligne de code qui permet de trier le fichier en ordre inverse.

Donc l'idéal serait d'ouvrir le fichier quand on coche "Matériel externe", et non IJINUS ou HYDREKA. Et je pense que ça devrait régler le problème.

Petit problème supplémentaire : Si on coche en premier la case IJINUS, et qu'on coche ensuite la case Hydreka, une boîte de dialogue s'ouvre en disant " le fichier est déjà ouvert... patati patata .." on clique sur Oui continué, et là un message d'erreur apparait: "Erreur 1004 la méthode 'Range de l'objet' _Worsheet' à échoué".

Oui c'est normal parce que le tri ne peut se faire que sur la feuille active et que la feuille HYDREKA ne contient qu'une ligne. Pour régler ce souci, remplacez ces lignes dans la macro liste_BL

With OS
    .Range("Tableau" & i).Sort Key1:=.Range("tableau" & i & "[N°BL]"), Header:=xlYes, Order1:=xlDescending
End With

Par celle-ci

With OS
    .Select
    On Error Resume Next
    .Range("Tableau" & i).Sort Key1:=.Range("Tableau" & i & "[N°BL]"), Header:=xlYes, Order1:=xlDescending
    On Error GoTo 0
End With

refaite un test

Edit:

Donc l'idéal serait d'ouvrir le fichier quand on coche "Matériel externe", et non IJINUS ou HYDREKA. Et je pense que ça devrait régler le problème.

Non parce que la combobox est remplie sur base de la feuille active et là en cliquant sur matériel externe, on ne sait pas quelle feuille est concernée pour compléter la Combobox 3

D'accord ! ça marche bien comme ça ! Merci !

ah non effectivement il y a un autre souci. il faudrait rajouter une condition à la fermeture du fichier "gestion loc matériel". Parce que si je n'ai que du matériel interne à rentrer, le fichier ne s'ouvre pas, or en cliquant sur le bouton valider il y à la commande de fermer de fichier !

il faudrait le fermer que s'il est déjà ouvert. Est ce qu'il y a une fonction pour ça ?

ah non effectivement il y a un autre souci. il faudrait rajouter une condition à la fermeture du fichier "gestion loc matériel". Parce que si je n'ai que du matériel interne à rentrer, le fichier ne s'ouvre pas, or en cliquant sur le bouton valider il y à la commande de fermer de fichier !

Juste ! Désolé mais je n'ai toute la vue actuellement de ce que vous faites

C'est assez facile. A la fin de la macro Valider, juste avant l'instruction CS.CLOSE FALSE, mettez --> ON ERROR RESUME NEXT

Mais en principe il ne devrait pas être ouvert puisque vous ne cochez pas une des cases IJINUS ou HYDREKA. Peut être que l'on pourrait rendre actives les trois cases à cocher IJINUS HYDREKA et AUTRES si vous avez cliqué avant sur Materiel externe. Votre avis ?

Pas de soucis! C'est compréhensible !

Si je comprend bien, il s'agirait de verrouiller les cases pour que l'on puisse les cocher uniquement si "matériel externe" est coché? Effectivement ça serait super bien de faire ça ! ça permet de limiter les erreurs

Si je comprend bien, il s'agirait de verrouiller les cases pour que l'on puisse les cocher uniquement si "matériel externe" est coché? Effectivement ça serait super bien de faire ça ! ça permet de limiter les erreurs

Exact !. Je vous fait cela.

Merci!

revoici votre fichier pour test

A l'ouverture de l'userform, les cases à cocher IJINUS, AUTRE, .... sont indisponibles tant que vous ne sélectionnez pas Materiel externe.
Si vous sélectionnez matériel Interne, cela désactive la case à cocher Matériel externe et les 3 cases à cocher IJINUS, AUTRE...

Les modifications dont nous avons parlées avant sont incorporées.
J'ai aussi ajouté le cas AUTRES pour tenir compte de la feuille Autres Loueurs dans la macro Liste_BL

Ok merci c'est parfait !

J'ai rajouté dans l'useform un calendar, plus simple pour rentrer les dates. Est-ce qu'il y a possibilité de sélectionner une plage de jours ? C'est à dire que la première sélection définie la date de départ, et la deuxième définie la date de fin ? avec les dates entre les deux en surbrillance ?

Pour l'instant je suis partie sur deux calendar différents, mais clairement 1 seul ça peut être pas mal si c'est faisable.

De manière à renseigner ensuite les dates sélectionnées dans mon onglet "historique réservation" en colonne H et I ?

J'ai apporté des modifications au fichier, alors je vous le transmet de manière à repartir sur de bonne bases

Bonjour

Non j'ai un gros souci avec votre fichier. L'option Calendar ne fonctionne pas et cela buggue à l'ouverture. Je perds les 2 textbox dates

Si vous voulez un calendrier, vous pouvez regarder le fil suivant dans lequel il y a une userform et code que j'ai proposé --> https://forum.excel-pratique.com/excel/menu-deroulant-vba-pour-les-mois-de-l-annee-151368#p934396

De plus il y a des liaisons avec un autre fichier à l'ouverture... souci également là

reprenez cette version dans laquelle j'ai modifié deux ou trois choses car en utilisation j'ai remarqué deux ou trois erreurs par rapport au fichier gestion-loc quand il était ouvert et que vous passiez d'une case à cocher à l'autre.
L'ouverture du fichier (votre idée d'ailleurs) se fait lorsque vous cocher la case Matériel externe et se ferme lorsque vous cochez la case Matériel Interne

Repartez surtout de ce fichier. (je l'ai mis en version 6 vu que vous avez créé une version 5)

D'accord merci je vais regarder ça !

J'ai un petit problème supplémentaire.

Finalement la combobox 2 ne va se remplir que si le matériel est interne. Dans le cas ou le matériel est externe on va copier l'intégralité de la liste matériel correspondent au numéros de BL. Donc le code correspondent au bouton validation n'est pas le même. J'ai fais le code suivant:

Private Sub CommandButton1_Click() 'validation
Dim OS As Worksheet
Dim CS As Workbook

Fichier = "Gestion loc materiel externe 21_LSA.xlsx"
Chemin = ThisWorkbook.Path & "\Loc externe\"

Set CS = Workbooks(Fichier)

    'If Not IsDate(TextBox3) Then
        'MsgBox "Format incorrect date départ"
        'TextBox3 = ""
        'Exit Sub
        ''Else
        ''MsgBox "Format correct"
        ''...la suite de la procédure
    'End If
   ' If Not IsDate(TextBox4) Then
       ' MsgBox "Format incorrect date retour"
       ' TextBox4 = ""
        'Exit Sub
        ''Else
        ''MsgBox "Format correct"
        ''...la suite de la procédure
    'End If

    'If DateDiff("ww", TextBox3, TextBox4) < 0 Then
       ' MsgBox "Date retour inférieure à date de départ"
       ' Exit Sub
   ' End If

    For i = 3 To 500
        If InStr(ComboBox2.Text, Sheets("Inventaire").Range("C" & i).Value) > 0 Then
            Sheets("Inventaire").Range("J" & i).Value = TextBox3
            Sheets("Inventaire").Range("K" & i).Value = TextBox4
            Sheets("Inventaire").Range("I" & i).Value = "Non"
            Sheets("Inventaire").Range("L" & i).Value = TextBox2
         End If
    Next

    If CheckBox1 = True Then 'Si Matériel interne
        DerniereLigne = Sheets("Historique reservations").Range("A" & Rows.Count).End(xlUp).Row + 1
        Sheets("Historique reservations").Range("A" & DerniereLigne).Value = TextBox1
        Sheets("Historique reservations").Range("B" & DerniereLigne).Value = TextBox2
        Sheets("Historique reservations").Range("D" & DerniereLigne).Value = ComboBox2
        Sheets("Historique reservations").Range("H" & DerniereLigne).Value = TextBox3
        Sheets("Historique reservations").Range("I" & DerniereLigne).Value = TextBox4
        Sheets("Historique reservations").Range("J" & DerniereLigne).Value = DateDiff("d", TextBox3, TextBox4)
        Sheets("Historique reservations").Range("C" & DerniereLigne).Value = "Interne"
        Sheets("Historique reservations").Range("D" & DerniereLigne).Value = "-"
        Sheets("Historique reservations").Range("E" & DerniereLigne).Value = ComboBox2
        For i = 3 To 500
            If Sheets("Inventaire").Range("C" & i).Value = ComboBox2 Then
                Sheets("Historique reservations").Range("F" & DerniereLigne).Value = Sheets("Inventaire").Range("D" & i).Value
                Sheets("Historique reservations").Range("G" & DerniereLigne).Value = Sheets("Inventaire").Range("E" & i).Value
            End If
        Next
    End If

    If CheckBox2 = True Then 'Si matériel externe

        If CheckBox3 = True Then 'si IJINUS
            Set OS = CS.Worksheets("IJINUS")
            For Each i In OS.Range("B3:B" & OS.Range("B" & OS.Rows.Count).End(xlUp).Row)
                DerniereLigne = Sheets("Historique reservations").Range("A" & Rows.Count).End(xlUp).Row + 1
                If i.Value = ComboBox3 Then
                    Sheets("Historique reservations").Range("A" & DerniereLigne).Value = TextBox1
                    Sheets("Historique reservations").Range("B" & DerniereLigne).Value = TextBox2
                    Sheets("Historique reservations").Range("D" & DerniereLigne).Value = ComboBox2
                    Sheets("Historique reservations").Range("H" & DerniereLigne).Value = TextBox3
                    Sheets("Historique reservations").Range("I" & DerniereLigne).Value = TextBox4
                    Sheets("Historique reservations").Range("J" & DerniereLigne).Value = DateDiff("d", TextBox3, TextBox4)
                    Sheets("Historique reservations").Range("C" & DerniereLigne).Value = "Externe"
                    Sheets("Historique reservations").Range("D" & DerniereLigne).Value = ComboBox3
                    Sheets("Historique reservations").Range("E" & DerniereLigne).Value = "-"
                    Sheets("Historique reservations").Range("F" & DerniereLigne).Value = OS.Range("C" & i.Row).Value
                    Sheets("Historique reservations").Range("G" & DerniereLigne).Value = OS.Range("E" & i.Row).Value
                End If
            Next
        End If

        If CheckBox4 = True Then 'si HYDREKA
            Set OS = CS.Worksheets("HYDREKA")
            For Each i In OS.Range("B3:B" & OS.Range("B" & OS.Rows.Count).End(xlUp).Row)
                DerniereLigne = Sheets("Historique reservations").Range("A" & Rows.Count).End(xlUp).Row + 1
                If i.Value = ComboBox3 Then
                    Sheets("Historique reservations").Range("A" & DerniereLigne).Value = TextBox1
                    Sheets("Historique reservations").Range("B" & DerniereLigne).Value = TextBox2
                    Sheets("Historique reservations").Range("D" & DerniereLigne).Value = ComboBox2
                    Sheets("Historique reservations").Range("H" & DerniereLigne).Value = TextBox3
                    Sheets("Historique reservations").Range("I" & DerniereLigne).Value = TextBox4
                    Sheets("Historique reservations").Range("J" & DerniereLigne).Value = DateDiff("d", TextBox3, TextBox4)
                    Sheets("Historique reservations").Range("C" & DerniereLigne).Value = "Externe"
                    Sheets("Historique reservations").Range("D" & DerniereLigne).Value = ComboBox3
                    Sheets("Historique reservations").Range("E" & DerniereLigne).Value = "-"
                    Sheets("Historique reservations").Range("F" & DerniereLigne).Value = OS.Range("D" & i.Row).Value
                    Sheets("Historique reservations").Range("G" & DerniereLigne).Value = OS.Range("F" & i.Row).Value
                End If
            Next
        End If
''''''''''''''''''''''''''''''''''''''''''''''''''Problème dans cette boucle
        If CheckBox5 = True Then 'si AUTRES LOUEURS
            Set OS = CS.Worksheets("AUTRES LOUEURS")
            For Each i In OS.Range("B3:B" & OS.Range("B" & OS.Rows.Count).End(xlUp).Row)
                DerniereLigne = Sheets("Historique reservations").Range("A" & Rows.Count).End(xlUp).Row + 1
                MsgBox (i.Value & " " & ComboBox3)

                If i.Value = ComboBox3 Then '''''''''' la boucle ne se lance pas si le n° de BL ne contient pas de Lettre
                    MsgBox "ok"
                    Sheets("Historique reservations").Range("A" & DerniereLigne).Value = TextBox1
                    Sheets("Historique reservations").Range("B" & DerniereLigne).Value = TextBox2
                    Sheets("Historique reservations").Range("D" & DerniereLigne).Value = ComboBox2
                    Sheets("Historique reservations").Range("H" & DerniereLigne).Value = TextBox3
                    Sheets("Historique reservations").Range("I" & DerniereLigne).Value = TextBox4
                    Sheets("Historique reservations").Range("J" & DerniereLigne).Value = DateDiff("d", TextBox3, TextBox4)
                    Sheets("Historique reservations").Range("C" & DerniereLigne).Value = "Externe"
                    Sheets("Historique reservations").Range("D" & DerniereLigne).Value = ComboBox3
                    Sheets("Historique reservations").Range("E" & DerniereLigne).Value = "-"
                    Sheets("Historique reservations").Range("F" & DerniereLigne).Value = OS.Range("C" & i.Row).Value
                    Sheets("Historique reservations").Range("G" & DerniereLigne).Value = OS.Range("E" & i.Row).Value
                End If
            Next
        End If
    End If
    ComboBox2.Clear
    For i = 2 To 500
        If Sheets("Inventaire").Range("I" & i).Value = "Oui" And Sheets("Inventaire").Range("F" & i).Value = ComboBox1 Then ComboBox2.AddItem Sheets("Inventaire").Range("D" & i)
    Next

On Error Resume Next 'pour eviter un erreur si le fichier n'est pas ouvert
CheckBox2CS.Close False 'fermeture du fichier Gestion-Loc
End Sub

Pas de soucis pour le matériel interne, ni pour le matériel externe concernant les feuilles ijinus et hydreka, cependant, la deuxieme boucle if si la checkbox5 est activée ne se lance pas si les BL sont composés de chiffre uniquement. Par contre, si on rajoute un lettre au BL le code marche bien.

Est ce qu'il y a une syntaxe différente permettant de d'éviter ce problème ? De manière à pouvoir avoir une bonne comparaison des valeurs de BL du fichier, et de la combobox3?

Pas de soucis pour le matériel interne, ni pour le matériel externe concernant les feuilles ijinus et hydreka, cependant, la deuxieme boucle if si la checkbox5 est activée ne se lance pas si les BL sont composés de chiffre uniquement. Par contre, si on rajoute un lettre au BL le code marche bien.

Votre commentaire est par rapport au bouton Validation ?

Finalement la combobox 2 ne va se remplir que si le matériel est interne. Dans le cas ou le matériel est externe on va copier l'intégralité de la liste matériel correspondent au numéros de BL.

Heu pas sur d'avoir bien compris.Vous aurez une liste déroulante Combobo2 avec des doublons alors ?

Ou alors vous voulez uniquement dire que si la case matériel interne est cochée on reprend la liste dans la feuille inventaire

Sinon, ce que je vous ai proposé jusqu'à présent est bon ou pas ?

Oui c'est par rapport au bouton validation effectivement. Je vous transmet mon fichier pour que vous puissiez voir les modifications que j'y ai apporté. Ce sera plus simple je pense.

Du coup c'est normal qu'il n'y ai plus les deux textbox date. Je l'ai mis en stand by pour le moment.

Oui les modifications apportées au codes concernant l'ouverture du fichier sont nickel!

Heu pas sur d'avoir bien compris.Vous aurez une liste déroulante Combobo2 avec des doublons alors ?

Ou alors vous voulez uniquement dire que si la case matériel interne est cochée on reprend la liste dans la feuille inventaire

Alors non! Dans le cas ou le matériel est interne on ne modifie rien, le code tourne comme avant.

C'est s'il s'agit de matériel externe que j'ai un peu modifié la chose. La combobox2 ne sera pas utilisée, on importera quand la feuille "historique réservation" l'ensemble du matos correspondant au n° de BL dans l'autre fichier.

Rechercher des sujets similaires à "eviter doublons combobox"