IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Remplacer enregistrement table [AC-2013]


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 40
    Points : 28
    Points
    28
    Par défaut Remplacer enregistrement table
    Bonjour à tous

    Je dispose de données dans un fichier Excel. Sur ce fichier, j'ai codé un bouton en VBA permettant de transférer les données du tableau Excel dans les champs correspondant dans ma table Access.
    Mon problème est le suivant: le tableau Excel est mis à jour régulièrement. Avec mon code actuel, quand j'appuis sur le bouton, il additionne les enregistrements dans la table.

    Sachant que la valeur "toto" ne change pas. J'aimerai lorsque qu'il détecte à partir de la 2ème fois la même valeur "toto", qu'il remplace les valeurs des autres champs dans ma table Access.


    Merci d'avance


    Voici mon code actuel pour exporter mon tableau Excel :

    Code VBA : 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
    For r = 2 To Selection.SpecialCells(xlCellTypeLastCell).Row
        ' Réalise la boucle jusqu'à la dernière cellule de la plage utilisé
     
           If Range("A" & r) & "" = "" Then
               Exit For 'Sort si la 1ère colonne est vide
           End If
     
     
              With rs
     
                .AddNew ' Crée un nouvel enregistrement
                ' Renseigne les valeurs des champs
                .Fields("toto") = Range("A" & r).Value
                .Fields("truc") = Range("C" & r).Value
                .Fields("titi") = Range("D" & r).Value
                .Fields("machin") = Range("F" & r).Value
     
     
                .Update ' MAJ du nouvel enregistrement
              End With
     
     
    Next r  'fin de la boucle For

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    À mettre avant la boucle

    À mettre dans la boucle

    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
    with rs
       critere="[Toto]=""" & Range("A" & r).Value & """" 'Suppose que Toto est un champ texte
     
       call .findfisrt(critere)
     
       if .nomatch() then
           rs.addnew
        else
           rs.update
       end if
     
       ' Renseigne les valeurs des champs
       .Fields("toto") = Range("A" & r).Value
       .Fields("truc") = Range("C" & r).Value
       .Fields("titi") = Range("D" & r).Value
       .Fields("machin") = Range("F" & r).Value
     
       .Update ' MAJ du nouvel enregistrement
    end With
    Si cela génère une erreur du genre "Trop de locks", la seule méthode simple que j'ai trouvée c'est de fermer puis de rouvrir le recordset dans la boucle, environ tous les 5000 enregistrements.
    C'est un peu dégueu mais cela marche sans presque ralentir le traitement.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Bonjour marot,

    Merci de ta réponse. Malheureusement, Je n'arrive pas à le faire fonctionner.
    Quand je l'exécute, il me met : "membre de méthode ou de données introuvable" pour cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call .findfisrt(critere)

    Après quelque cherche il faut apparemment décocher les références à DAO
    Si je décoche : Microsoft ActiveX Data Objects 2.0 Library, cette fois -ci c'est mon ADODB.Connection qui ne fonctionne pas.

    Comment faire

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Erreur de frappe ... désolé.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Oui effectivement j'avais corrigé aussi cette erreur. Mais cela ne fonctionne toujours pas

  6. #6
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 878
    Points : 4 754
    Points
    4 754
    Par défaut
    Bonjour,
    désormais il faut être explicite dans les déclarations :
    as-tu bien typé '... as DAO.database' pour la db
    et ' ... as DAO.recordset' pour le rs ?

    CDLT
    "Always look at the bright side of life." Monty Python.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Bonjour micniv,

    Voici comment j'ai déclaré mes déclarations :

    Code VBA : 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
    Dim Cn As ADODB.Connection
        Dim rs As ADODB.Recordset
        Dim r As Long
        Dim critere As String
     
        ' Connexion à la base Access
     
        Set Cn = New ADODB.Connection
     
        Cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; " & "Data Source=C:\Users\xxxxxxx.accdb"
     
        ' Ouvre un recordset
     
        Set rs = New ADODB.Recordset
     
        rs.Open "xxx", Cn, adOpenKeyset, adLockOptimistic, adCmdTable

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Pour ne pas avoir d'erreur de compilation avec ADODB, j'ai remplacé

    cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call .findfirst(critere)
    par celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rs.Find (critere), , adSearchForward

    et cette ligne : par celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If rs.BOF Or rs.EOF Then

    Quand j'appuie mon bouton, il additionne les enregistrements, mais il ne les remplace toujours pas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/10/2005, 10h28
  2. Pb lecture enregistrement table liée SQL SERVER
    Par christellel198 dans le forum Access
    Réponses: 3
    Dernier message: 25/10/2005, 09h34
  3. Enregistrer table
    Par James64 dans le forum Bases de données
    Réponses: 1
    Dernier message: 26/10/2004, 11h01
  4. [SQL] Remplacer une table
    Par rstephane dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/05/2003, 17h10
  5. [VB6] [ADO] Pb ajout enregistrement table liée
    Par fikou dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 01/10/2002, 11h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo