Manoeuvre listBox et modification d'un enregistrement

Bonjour les compatriotes :) J'espère que vous allez bien.

Je rencontre un problème dans une manoeuvre ListBox et modification d’un enregistrement.

Je vais essayer de simplifier mon énoncé :

- J’ai une Feuil « F1 » contenant 3 colonnes A, B et C.

- J’ai créé un userForm1 contenant une ListBox1 ayant pour origine ces trois colonnes.

- Sur le même UserForm1, j’ai créé 3 textbox : textbox1, texbox2 et textbox3.

- Quand je clique sur une ligne de ma Listbox1, les valeurs de la ligne se copient dans les trois textbox du userform1.

Maintenant je voudrais modifier les valeurs dans ces trois textbox (notemment corriger si besoin y est).

Je voudrais alors voir s’actualiser la ligne concernée dans la listeBox1 en appuyant sur le bouton « Modifier ».

Voici le code que j’ai essayé de faire fonctionner :

Private Sub Modifier_Click()
Dim i As Integer, DerLig As Integer, row As Integer, j As Integer
DerLig = Sheets("F1").Range("A" & Rows.Count).End(xlUp).row
row = Me.ListBox1.ListIndex

With ListBox1
For i = 2 To DerLig
For j = 1 To 3
If Sheets("F1").Cells(i, 1) = .List(row, 0) And 
Sheets("F1").Cells(i, 2) = .List(row, 1) And 
Sheets("F1").Cells(i, 3) = .List(row, 2) Then
Sheets("F1").Cells(i, j) = Controls("TextBox" & j)
Next j
Next i
End With
End Sub

Il me dit toujours : Erreur de compilation : Next sans For. De 1

De 2 comme je suis encore débutant, je ne maitrise pas bien les listbox notamment comment renseigner une colonne dans une listBox ainsi que l’isage de Me.Listbox et de Listindex.

Pouvez vous me corriger mon code s’il vous plait avec des commentaires si possibles ?

Merci

Bonjour,

Il manquait le "End If" ...

Il manquait des "_" pour changer de ligne ...

La variable row a été modifiée pour iRow ...

Réponse modifiée ...

Private Sub Modifier_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  
            For j = 1 To 3
                If Sheets("F1").Cells(i, 1) = .List(iRow, 0) And _
                    Sheets("F1").Cells(i, 2) = .List(iRow, 1) And _
                    Sheets("F1").Cells(i, 3) = .List(iRow, 2) Then
                    Sheets("F1").Cells(i, j) = Controls("TextBox" & j).value
                    Exit For
                End If ' ............................................. ICI
            Next j
        Next i
    End With
End Sub

En indentant ton code correctement, c'est révélateur ...

ric

Bonjour Camelleon1881

L'instruction est If... Then... Else... End If si elle est scindée càd avec un retour à la ligne après "Then'

Ce qui semble être le cas dans le code

Pensez à indenter votre code, comme le fait ric pour y voir plus clair, vous avez ceci pour le faire

A+

Edit : Salut ric

Bonjour à tous,

Il y a aussi la variable row qui m'inquiète ... ne serait-ce pas préférable irow ?

ric

Édit : Salut BrunoM45

@Ric, tu as raison

@Cameleon1981, ne jamais utiliser en variable des propriété VBA

Il faut donc utiliser iRow comme l'a indiqué Ric

Bah non les amis, les modif ne se sont pas reproduit dans la feuil "F1" ...

Bonjour cameleon1881,

Peut-on avoir un fichier avec des données non sensibles (quelques lignes suffisent) afin de dépanner cela ...

Il serait bon également que tu nous décrives le raisonnement que tu désires élaborer ...

On attend ton fichier afin de bien comprendre.

ric

Bonjour à tous,

J'ai changé le code modifié que j'ai fourni dans ma première réponse ...

Ce changement devrait améliorer un peu la chose ...

ric

Salut Ric, Lequel ? le code modifié ?

Bonjour Cameleon1881, le forum,

Oui ... j'ai modifié le code de ma première réponse ...

Dis moi si cela convient ...

ric

Non en fait ... le code ne marche pas chez moi.

Les Sheets("F1").Cells(i, j) ne prennent pas les valeurs des Controls("TextBox" & j).Value du Userform ...

Ca peut être quoi la cause à ton avis ?

Bonjour,

S.t.p. fourni un fichier représentatif, ce sera beaucoup plus facile à dépanner ...

ric

Le voici M.Ric :)

Tu peux tester sur la ligne colorée en jaune

A plus

Bonjour cameleon1881,

Ton code n'est-il pas dans un formulaire ?

Il manque le formulaire ... car, un fichier à extension .xlsx ne contient pas de macro ni de formulaire ...

Il faut enregistrer avec l'extension .xlsm.

Est-ce possible d'avoir le formulaire aussi ?

ric

Bonjour cameleon1881,

En fin de compte, j'ai créé un formulaire pour dépanner ton code ...

Si c'est bien une date en colonne 2 ...

Ceci fonctionne ...

Private Sub Modifier_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      ' trouve la ligne dans la listbox
            If Sheets("F1").Cells(i, 1) = .List(iRow, 0) And _
                Sheets("F1").Cells(i, 2) = .List(iRow, 1) And _
                Sheets("F1").Cells(i, 3) = .List(iRow, 2) Then

                For j = 1 To 4  ' boucle sur les colonnes à écrire
                    If j = 2 Then   ' si colonne 2, lire le textbox et convertir en numérique pour la date
                        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  ' sort de la boucle i car la ligne a été trouvée et traitée
            End If
        Next i
    End With
End Sub

ric

il est perdu le formulaire ... pourtant je l'ai travaillé de bout en bout !!!

Si je n'enregistre pas sous xlsm il se perd ? c'est ça ?

Le re voila :)

Bonjour cameleon1881,

Quand on a des macros et des formulaires, il faut enregistrer avec l'extension .xlxm m = macro.

En enregistrant avec l'extension .xlsx, l'on perd macro et formulaire.

Basé sur ton fichier ... j'ai composé une ébauche de formulaire ... un essai ...

ric

Cher Ric,

Je te remercie beaucoup pour ton coup de main :)

Il y a une petite correction que j'ai faite. Voici le code final pour ce problème :

Private Sub Modifier_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      ' trouve la ligne dans la listbox
            If Sheets("F1").Cells(i, 1) = .List(iRow, 0) And _
                Sheets("F1").Cells(i, 2) = CDate(.List(iRow, 1)) And _
                Sheets("F1").Cells(i, 3) = .List(iRow, 2) Then

                For j = 1 To 4  ' boucle sur les colonnes à écrire
                    If j = 2 Then   ' si colonne 2, lire le textbox et convertir en numérique pour la date
                        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  ' sort de la boucle i car la ligne a été trouvée et traitée
            End If
        Next i
    End With
End Sub

ça concerne ce bloc :

For i = 2 To DerLig ' trouve la ligne dans la listbox
If Sheets("F1").Cells(i, 1) = .List(iRow, 0) And _
Sheets("F1").Cells(i, 2) = CDate(.List(iRow, 1)) And _
Sheets("F1").Cells(i, 3) = .List(iRow, 2) Then

Là où j'ai rajouté CDate(.List(iRow, 1)).

Merci encore Sujet clos :)

Non non pas encore clos ! :)

Mais comment alors voir la listbox Raffraichi ?

faudra faire le ListBox.Clear puis quoi ? ou autre moyen ?

Rechercher des sujets similaires à "manoeuvre listbox modification enregistrement"