Manoeuvre listBox et modification d'un enregistrement

Bonjour,

Excellent ...

Je travaillais à adapter ton fichier avec le code ...

La difficulté que j'avais, c'était la date, mon Windows n'avait pas le même format que le format européen ...

En changeant le format sur ma machine, le CDate donne le même format lors de la comparaison cellule/listbox et là ça fonctionne.

C'est toujours préférable de fournir un fichier dans la demande. L'on sauve du temps.

Mais il est vrai aussi que piochant, l'on découvre les tenants et aboutissants ... Par contre, c'est plus long.

A+

ric

J'ai passé une nuit blanche avant de tombé sur l'astuce de CDate avec les formats dates moi !!!

Bonjour,

Oui, mais maintenant ... tu vas t'en souvenir longtemps ...

L'apprentissage par soi-même est quand même parfois un peu long ...

ric

Bonjour,

ric

hey Ric :)

comment la listbo soit elle actualisé ?

la Feuille F1 l'a été par notre code mais pas la listbox ? Le problème n'est pas encore résolu

Bonjour,

Il faut vider la listbox et la relire ...

J'ai déplacé le code de l'alimentation de Private Sub UserForm_Initialize() vers Private Sub AlimenterLaListbox() ... puis utilisé des appels de la macro servant à alimenter la listbox ...

Private Sub CommandButton1_Click()
    Dim i As Integer, DerLig As Integer, iRow As Integer, j As Integer

    DerLig = Sheets("F1").Range("A" & Rows.Count).End(xlUp).row
    iRow = Me.ListBox1.ListIndex

    With ListBox1
        For i = 2 To DerLig
            If Sheets("F1").Cells(i, 1).Value = .List(iRow, 0) And _
                Format(Sheets("F1").Cells(i, 2).Value, "dd-mm-yyyy") = Format(.List(iRow, 1), "dd-mm-yyyy") And _
                Sheets("F1").Cells(i, 3).Value = .List(iRow, 2) Then

                For j = 1 To 4
                    If j = 2 Then
                        Sheets("F1").Cells(i, j) = CDate(Controls("TextBox" & j).Value)
                    Else
                        Sheets("F1").Cells(i, j) = Controls("TextBox" & j).Value
                    End If
                Next j
                Exit For
            End If
        Next i
    End With

    Me.ListBox1.Clear           ' vider la listbox
    Call AlimenterLaListbox    ' la réalimenter
End Sub

Private Sub UserForm_Initialize()
    Call AlimenterLaListbox  ' alimenter la listbox 
End Sub

Private Sub AlimenterLaListbox()
    DerLig = Sheets("F1").Range("A" & Rows.Count).End(xlUp).row

    'Nombre de colonnes dans la ListBox
    ListBox1.ColumnCount = 4

    'Largeur des colonnes de la ListBox
    ListBox1.ColumnWidths = "120;60;60;60"
    For i = 2 To DerLig
        ListBox1.AddItem Sheets("F1").Range("A" & i)
        ListBox1.List(ListBox1.ListCount - 1, 1) = Sheets("F1").Range("B" & i)
        ListBox1.List(ListBox1.ListCount - 1, 2) = Sheets("F1").Range("C" & i)
        ListBox1.List(ListBox1.ListCount - 1, 3) = Sheets("F1").Range("D" & i)
    Next i
End Sub

ric

Là La listbox se met à jour sans que le userform ne se ferme et se reouvre ?

Bonjour,

Exact ...

ric

Merci beaucoup mon ami :)

Il me reste une petite chose à demander s'il te plait.

Quand la Listbox s'actualise, je voudrait me placer (sélectionner) de nouveau la même ligne de la listbox cad elle reste sélectionnée.

Alors dans mon cas puisque il y a une seule ligne dans la listBox, j'ai pu le faire en mettant à la suite du code :

ListBox1.ListIndex = 0

Mais si il y a plusieurs lignes dans la listBox, il faudra pour reselectionner la même ligne, la mettre en relation avec les quatre texbox qui sont à la suite ... je ne sais pas si tu vois ce que je veux dire ?

Bonjour membres du forum,

Essai d'adaptation

Dans ce code, un message est survenu:

userform 25

Comment déclarer la variable manquante ?

Bonjour cameleon,

La variable "MaLig" va faire le travail ...

3 lignes ont été ajoutées ...

(1) déclarer la variable, (2) la renseigner du no de la ligne traitée, (3) enfin, repositionner après avoir actualiser la listbox

Private Sub CommandButton1_Click()
    Dim i As Integer, DerLig As Integer, iRow As Integer, j As Integer
    Dim MaLig As Integer   ' variable pour mémoriser le numéro de la ligne traitée

    DerLig = Sheets("F1").Range("A" & Rows.Count).End(xlUp).row
    iRow = Me.ListBox1.ListIndex

    With ListBox1
        For i = 2 To DerLig
                If Sheets("F1").Cells(i, 1).Value = .List(iRow, 0) And _
                Format(Sheets("F1").Cells(i, 2).Value, "dd-mm-yyyy") = Format(.List(iRow, 1), "dd-mm-yyyy") And _
                Sheets("F1").Cells(i, 3).Value = .List(iRow, 2) Then

                For j = 1 To 4
                    If j = 2 Then
                        Sheets("F1").Cells(i, j) = CDate(Controls("TextBox" & j).Value)
                    Else
                        Sheets("F1").Cells(i, j) = Controls("TextBox" & j).Value
                    End If
                Next j

                MaLig = iRow     ' mémoriser le numéro de la ligne traitée
                Exit For
            End If
        Next i
    End With

    Me.ListBox1.Clear
    Call AlimenterLaListbox

    Me.ListBox1.ListIndex = MaLig  ' sélectionner la ligne précédemment traitée

End Sub

ric

C'est fabuleux Ric :)

Agréable journée

Cher Ric j'ai publié une question sur "se placer sur la dernière valeur en cliquant sur combobox d'un userform" mais je n'ai pas encore eu de réponse... tu peux me dépanner stp ?

j'ai eu pour réponse :

Private Sub UserForm_Initialize()
Me.ComboBox1.ListIndex = Me.ComboBox1.ListCount - 1
End Sub

sauf que ça n'a pas marché pour moi. En fait dans initialize j'ai mis combobox.rowsource=.....

puis je veux qu'en ouvrant la liste je me place directement sur la dernière ligne. Donc l'événement déclencheur ce n'est pas initialize userform mais ouverture de la liste en appuyant sur la flèche déroulante... :)

Bonjour,

Essai de mettre le code au bas ( avant End Sub ) dans la macro de la flèche déroulante ...

ric

Re bonjour Ric,

je n'arrive pas à me dépanner :(

J'ai rajouté le combobox dans le formulaire. Voici le fichier

Stp pourrais tu me travailler ce code ? se placer sur la dernière valeur quand on ouvre la liste déroulante.

Merci pour ton appui tout ce week-end

Bonjour cameleon1881, le forum,

J'ai créé une nouvelle macro AlimenterEtPositionnerDerligCombobox1 au cas où tu aurais besoin d'actualiser le contenu du combobox1 ... il n'y aura qu'à l'appeler à nouveau : call AlimenterEtPositionnerDerligCombobox1

C'est dans cette dernière que le code positionne le dernier item de la liste .ListIndex = .ListCount - 1

Au lieu d'utiliser RowSource, je crois qu'il est préférable d'utiliser AddItem ... m'enfin, c'est mon avis personnel et confidentiel ...

Itou ... il y a UserForm_Initialize() et UserForm_Activate() , il y a une différence ... la 1re s'exécute à la 1re ouverture du formulaire ... la 2e s'exécute après un Unload lorsque l'on remet le formulaire à l'écran .Show

Si tu as d'autres questions ... n'hésite pas ...

Note : mon vilain ... tu as fournis un vieux fichier où la ListBox ne s'actualise pas ... j'ai cherché un bout avant de comprendre ...

ric

Ce fichier n'a pas la listbox qui l'actualise ... bin ...

Cher AMI merci pour ta sympathie et modestie :)

Pour ça :

Note : mon vilain ... tu as fournis un vieux fichier où la ListBox ne s'actualise pas ... j'ai cherché un bout avant de comprendre ...

Je n'ai pas fait attention mais pour le bien des lecteurs du forum je mettrai de nouveau le fichier complet. Promis :)

Bonjour cameleon1881,

J'espère que je peux te taquiner à l'occasion ...

Tout cela m'a fait oublier le Combobox1.Clear pour vider le combobox1 avant de le réalimenter ...

Private Sub AlimenterEtPositionnerDerligCombobox1()
Dim DerLig As Integer, i As Integer

    DerLig = Sheets("F1").Range("A" & Rows.Count).End(xlUp).row
    ComboBox1.Clear
    With ComboBox1
        For i = 2 To DerLig
            .AddItem Sheets("F1").Range("B" & i).Value
        Next i
        .ListIndex = .ListCount - 1
    End With
End Sub

ric

Bonjour Ric,

J'ai pensé à améliorer le code de telle sorte que si une date existe déja ne se rajoute pas dans la combobox ...

J'ai pensé à ajouté un compteur de cette façon là (Mais qui ne marche pas, parfois j'essaie des choses qui me dépassent !):

Private Sub AlimenterEtPositionnerDerligCombobox1()
Dim DerLig As Integer, i As Integer, compteur As Integer, j As Integer

DerLig = Sheets("F1").Range("A" & Rows.Count).End(xlUp).row

compteur = 0
For j = 2 To DerLig
If Sheets("F1").Range("B" & DerLig) = Sheets("F1").Range("B" & j) Then compteur = 1
Next j

ComboBox1.Clear

With ComboBox1

        For i = 2 To DerLig
            If compteur = 0 Then .AddItem Sheets("F1").Range("B" & i).Value
        Next i
        ''''''ComboBox1.RowSource = "F1!B2:F1!B7"
        .ListIndex = .ListCount - 1
    End With

End Sub

Un coup de pousse pour moi encore une fois stp :)

Rechercher des sujets similaires à "manoeuvre listbox modification enregistrement"