Transfert de données Excel vers acces création de Doublons

Signaler
Messages postés
5
Date d'inscription
samedi 11 avril 2009
Statut
Membre
Dernière intervention
16 juillet 2012
-
Messages postés
5
Date d'inscription
samedi 11 avril 2009
Statut
Membre
Dernière intervention
16 juillet 2012
-
Bonjour à tous!

Toutes mes excuses si je ne poste pas sur le bon forum.

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 qui est très lourd.

Voici mon code.
  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


Merci d'avance.
Sans la pratique, la maîtrise aura toujours chaud aux fesses.....

5 réponses

Messages postés
5
Date d'inscription
samedi 11 avril 2009
Statut
Membre
Dernière intervention
16 juillet 2012

Ma question Y aurait-il une manière d'éviter les doublons?

Merci d'avance.

Sans la pratique, la maîtrise aura toujours chaud aux fesses.....
Messages postés
5
Date d'inscription
samedi 11 avril 2009
Statut
Membre
Dernière intervention
16 juillet 2012

A force de me creuser à lire des fichiers pdf téléchargés 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

Dim cnE As ADODB.Connection, rsE As ADODB.Recordset, chemin2 As Variant, source2 As Variant ' r As Long
    chemin2 = ActiveWorkbook.Path
    source2 = "C:\GMAA" & "\JMFJCA1.mdb"
    Set cnE = New ADODB.Connection
    cnE.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & source2 & ";"      'C:\GMAA\JMFJCA1.mdb;"
    ' 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.

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

Merci d'avance.

Sans la pratique, la maîtrise aura toujours chaud aux fesses.....

BVonsoir,

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.
Ton système est bien compliqué.
On ne peut pas saisir directement dans access via un formulaire de saisie ?
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Bonsoir,

Avant même de commencer à réinsèrer,c' est sûr que tu risque un plantage ici :
While Not rsE.EOF
            rsE.Delete 
            'quand c' est le dernier, 
            'le moveNext provoque une erreur.
            'c' est pourquoi il faut retester.
            If rsE.Bof And rsE.Eof Then Exit Do
            rsE.MoveNext
    Wend


Ceci dit je ne t' encourage pas à réinitialiser ton fichier.
Comme dit banana32, insères depuis ton formulaire, dans la table, de la même façon que tu le fais pour la listview.


[] Ce qui va sans dire. va mieux en le disant.
Messages postés
5
Date d'inscription
samedi 11 avril 2009
Statut
Membre
Dernière intervention
16 juillet 2012

Merci pour ces deux réponses rapides banana32 et LIBRE_MAX.

banana32 donc comment pourrai-je adapter mon code à ce que les données soient automatiquement envoyées à partir du formulaire vers base de données Access

Sinon j'ai lu quelque part qu'il ya une possibilité de mettre des Flag comment on peut-on faire cela.

merci.

Sans la pratique, la maîtrise aura toujours chaud aux fesses.....