Bonjour à tous!

Toutes mes excuses si le cas ait déjà été traité, je vous avoue que google ne m'a pas servi grand-chose sur mon problème.

Je suis nouveau dans le milieu de la programmation et je travaille sur un petit projet. Voilà j'explique mon problème.

J'ai créé un Userform qui contient des TextBox et Une Listview.
Je commence à saisir mes données dans les TextBox, qui sont envoyées dans la Listiview. A l'aide d'un bouton commande le tout est envoyé dans une feuille excel puis transféré dans une base de données access.

Le tout semble fonctionner à mon goût jusqu'après le transfert de données dans access, dont ce dernier à chaque nouvel enregistrement crée des doublons des opérations déjà enregistrées.

Je m'excuse si l'explication n'est pas aussi claire. Je ne pourrai pas poster le fichier car il est très lourd. Voici mon code

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Dim cn As ADODB.Connection, rs As ADODB.Recordset, chemin As Variant, source As Variant
 
    chemin = ActiveWorkbook.Path
    source = "C:\GMAA" & "\JMFJCA1.mdb"
    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & source & ";"      
    ' open a recordset
    Set rs = New ADODB.Recordset
    rs.Open "[JOURNAL DE CAISSE 1]", cn, adOpenKeyset, adLockOptimistic, adCmdTable  ' all records in a table
    r = 2 ' the start row in the worksheet
    Do While Len(Range("A" & r).Formula) > 0 ' repeat until first empty cell in column A
        With rs
            .AddNew ' create a new record
            ' add values to each field in the record
            .Fields("N° ECRITURE") = Sheets(21).Range("A" & r).Value
            .Fields("N° LOT") = Sheets(21).Range("B" & r).Value
            .Fields("DATE  ENRG") = Sheets(21).Range("C" & r).Value
            .Fields("DATE  OPER") = Sheets(21).Range("D" & r).Value
            .Fields("DATE VALEUR") = Sheets(21).Range("E" & r).Value
            .Fields("N° PIECE OPER") = Sheets(21).Range("F" & r).Value
            .Fields("CPTE DEBIT") = Sheets(21).Range("G" & r).Value
            .Fields("CPTE CREDIT") = Sheets(21).Range("H" & r).Value
            .Fields("LIBELLE DE L'ECRITURE") = Sheets(21).Range("I" & r).Value
            .Fields("MONTANT DEBIT") = Sheets(21).Range("J" & r).Value
            .Fields("MONTANT CREDIT") = Sheets(21).Range("K" & r).Value
            .Fields("NOUVEAU SOLDE") = Sheets(21).Range("L" & r).Value
 
            .Update ' stores the new record
        End With
        r = r + 1 ' next row
    Loop
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
Ma question est Y aurait-il une manière d'éviter les doublons?

Sinon à force de me creuser les méninges en lisant des fichiers pdf sur ADO j'ai trouvé une première approche du problème mais un peu dangereuse je le pense.

Il s'agit de réinscrire les données à chaque nouvel enregistrement avec ce code:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Dim cnE As ADODB.Connection, rsE As ADODB.Recordset, chemin2 As Variant, source2 As Variant 
    chemin2 = ActiveWorkbook.Path
    source2 = "C:\GMAA" & "\JMFJCA1.mdb"
    Set cnE = New ADODB.Connection
    cnE.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & source2 & ";"      
    ' open a recordset
    Set rsE = New ADODB.Recordset
    rsE.Open "[JOURNAL DE CAISSE 1]", cnE, adOpenKeyset, adLockOptimistic, adCmdTable  ' all records in a table
 
    While Not rsE.EOF
            rsE.Delete ' stores the new record
            rsE.MoveNext
 
    Wend
 
    rsE.Close
    Set rsE = Nothing
    cnE.Close
    Set cnE = Nothing
Mais le problème est en cas de plantage de mon programme lors de la validation de données je risquerai peut être de perde les anciennes données avant envoi dans ma base.

Si vous voyez d'autres approches, j'attends patiemment votre aide.

Merci d'avance.