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 :

[AC-2007] Import d'une table Access - Erreur 3709 Fonction TransferDatabase


Sujet :

VBA Access

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mai 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 58
    Points : 72
    Points
    72
    Par défaut [AC-2007] Import d'une table Access - Erreur 3709 Fonction TransferDatabase
    Bonjour à tous,

    j'effectue un import d'une table d'une base Access à partir d'une autre base à l'aide de la fonction TransferDatabase.
    La table que j'importe fait 245000 lignes, l'import fonctionne les 4-5 premières fois et ensuite ça ne marche plus, j'ai le message d'erreur suivant:

    Erreur d'exécution '3709': La clé de recherche n'a été trouvée dans aucun enregistrement.

    Dans l'aide Microsoft, il parle d'une erreur sur un champs Mémo:http://support.microsoft.com/kb/302525/fr
    Or, je n'ai aucun champs mémo dans la table que j'importe.

    Dans l'aide Access VBA, j'ai trouvé ceci:
    "Cette erreur se produit lorsque la fonction ISAM SEEK est exécutée et qu'il n'y a aucune valeur correspondante dans l'index."
    Mais aucune solution n'est proposée.

    Ce qui est bizarre c'est que l'import fonctionne les premières fois et ensuite le message apparaît, il faut alors relancer la base et la compacter pour que ça remarche, puis réapparition du message et ainsi de suite.

    Je n'ai pas trouvé de solutions dans les forums, cela fait 3 jours que je cherche.

    Avez-vous une solution à mon problème qui me torture l'esprit et me faire perdre du temps dans la gestion de ce projet professionnel.

    Merci à tous.

  2. #2
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 127
    Points : 105
    Points
    105
    Par défaut
    Bonjour,

    Pourrais tu nous montrer ton code s'il te plait?

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mai 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 58
    Points : 72
    Points
    72
    Par défaut
    Salut,

    pas de soucis:

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    Option Compare Database
    Option Explicit
     
    'Import de la table [TableAcopier]
    Private Sub Import_Table_Click()
     
    Dim chemin_complet As String
    Dim chemin_base As String
     
    Dim db As DAO.Database
     
    'chemin du fichier de la [TableAcopier]
    chemin_complet = "C:\..........."
     
    Set db = CurrentDb
     
    'Chemin du fichier de la [TableCopie]
    chemin_base = db.Name
     
        'Test de la présence de la table [TableAcopier] dans la base sélectionnée
        If PresenceTable(chemin_complet, "TableACopier") = False Then
     
            MsgBox "La Table [TableACopier] n'existe pas dans le fichier."
            Exit Sub
     
        'Si les tables sont bien présentes
        ElseIf PresenceTable(chemin_complet, "TableAcopier") = True Then
     
            If PresenceTable(chemin_base, "TableCopie") = True Then
                Call Suppression_Table("TableCopie", db)
                Call MAJ_Table(chemin_complet, "TableAcopier", "TableCopie")
            ElseIf PresenceTable(chemin_base, "TableCopie") = False Then
                Call MAJ_Table(chemin_complet, "TableAcopier", "TableCopie")
            End If
     
        End If
     
        MsgBox "La table a été importée."
     
    End Sub
    '*******************************************************************************************************
    '*******************************************************************************************************
    'Test l'existence d'une table dans la base rentrée en paramètre
    Public Function PresenceTable(chemin As String, ByVal strTable As String) As Boolean
     
        Dim dbInitiale As DAO.Database
        Set dbInitiale = DBEngine.OpenDatabase(chemin, False)
        Dim tdf As DAO.TableDef
     
    ' Parcourir toutes les tables de la base
    For Each tdf In dbInitiale.TableDefs
      If tdf.Name = strTable Then
        ' La table a été trouvée...
        PresenceTable = True
        dbInitiale.Close
        Exit Function
      End If
    Next
     
    ' La table n'existe pas...
    PresenceTable = False
    dbInitiale.Close
    End Function
    '*******************************************************************************************************
    '*******************************************************************************************************
    'Supprime la table de la base rentrée en paramètre
    Public Sub Suppression_Table(NomTable As String, dbC As DAO.Database)
    dbC.TableDefs.Delete NomTable
    End Sub
    '*******************************************************************************************************
    '*******************************************************************************************************
    'Met à jour la table en important la table à copier dans la base
    Public Sub MAJ_Table(chemin As String, TabSource As String, TabDest As String)
        Dim dbInitiale As DAO.Database
        Set dbInitiale = DBEngine.OpenDatabase(chemin, False)
        DoCmd.TransferDatabase acImport, "Microsoft Access", chemin, acTable, TabSource, TabDest, False, False
        dbInitiale.Close
    End Sub

  4. #4
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 127
    Points : 105
    Points
    105
    Par défaut
    Je t'ai rajouté les Set XXXX = nothing qui vont bien, en espérant que cela règle le problème.

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    Option Compare Database
    Option Explicit
     
    'Import de la table [TableAcopier]
    Private Sub Import_Table_Click()
     
    Dim chemin_complet As String
    Dim chemin_base As String
     
    Dim db As DAO.Database
     
    'chemin du fichier de la [TableAcopier]
    chemin_complet = "C:\..........."
     
    Set db = CurrentDb
     
    'Chemin du fichier de la [TableCopie]
    chemin_base = db.Name
     
        'Test de la présence de la table [TableAcopier] dans la base sélectionnée
        If PresenceTable(chemin_complet, "TableACopier") = False Then
     
            MsgBox "La Table [TableACopier] n'existe pas dans le fichier."
            Set db = Nothing 'remise à zéro
            Exit Sub
     
        'Si les tables sont bien présentes
        Else ' Si PresenceTable n'est pas false il est forcément true => test inutile
     
            If PresenceTable(chemin_base, "TableCopie") = True Then
                Call Suppression_Table("TableCopie", db)
                Call MAJ_Table(chemin_complet, "TableAcopier", "TableCopie")
            ElseIf PresenceTable(chemin_base, "TableCopie") = False Then
                Call MAJ_Table(chemin_complet, "TableAcopier", "TableCopie")
            End If
     
        End If
     
        MsgBox "La table a été importée."
     
    Set db = Nothing 'remise à zéro
     
    End Sub
    'Test l'existence d'une table dans la base rentrée en paramètre
    Public Function PresenceTable(chemin As String, ByVal strTable As String) As Boolean
     
        Dim dbInitiale As DAO.Database
        Set dbInitiale = DBEngine.OpenDatabase(chemin, False)
        Dim tdf As DAO.TableDef
     
    ' Parcourir toutes les tables de la base
    For Each tdf In dbInitiale.TableDefs
      If tdf.Name = strTable Then
        ' La table a été trouvée...
        PresenceTable = True
     
        dbInitiale.Close
        Set dbInitiale = Nothing 'remise à zéro
     
        Exit Function
      End If
    Next
     
    ' La table n'existe pas...
    PresenceTable = False
    dbInitiale.Close
    Set dbInitiale = Nothing 'remise à zéro
    End Function
    'Supprime la table de la base rentrée en paramètre
    Public Sub Suppression_Table(NomTable As String, dbC As DAO.Database)
    dbC.TableDefs.Delete NomTable
    End Sub
    'Met à jour la table en important la table à copier dans la base
    Public Sub MAJ_Table(chemin As String, TabSource As String, TabDest As String)
        Dim dbInitiale As DAO.Database
        Set dbInitiale = DBEngine.OpenDatabase(chemin, False)
        DoCmd.TransferDatabase acImport, "Microsoft Access", chemin, acTable, TabSource, TabDest, False, False
        dbInitiale.Close
        Set dbInitiale = Nothing 'remise à zéro
    End Sub

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mai 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 58
    Points : 72
    Points
    72
    Par défaut
    Merci, bonne rectification.

    En revanche ça ne règle pas le problème, j'ai toujours le message d'erreur au bout de 3-4 imports

    Help Please

  6. #6
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 127
    Points : 105
    Points
    105
    Par défaut
    A quelle ligne de code l'erreur apparait?

  7. #7
    Membre régulier
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mai 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 58
    Points : 72
    Points
    72
    Par défaut
    Le message apparaît pour la Ligne 77:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.TransferDatabase acImport, "Microsoft Access", chemin, acTable, TabSource, TabDest, False, False

  8. #8
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 127
    Points : 105
    Points
    105
    Par défaut
    Est tu sur que lorsque le message d'erreur se produit, la table que tu veux ajouter à bien été supprimée?

    Essaye ceci:

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    Option Compare Database
    Option Explicit
     
    'Import de la table [TableAcopier]
    Private Sub Import_Table_Click()
     
    Dim chemin_complet As String
    Dim chemin_base As String
     
    Dim db As DAO.Database
     
    'chemin du fichier de la [TableAcopier]
    chemin_complet = "C:\..........."
     
    Set db = CurrentDb
     
    'Chemin du fichier de la [TableCopie]
    chemin_base = db.Name
     
        'Test de la présence de la table [TableAcopier] dans la base sélectionnée
        If PresenceTable(chemin_complet, "TableACopier") = False Then
     
            MsgBox "La Table [TableACopier] n'existe pas dans le fichier."
            Set db = Nothing 'remise à zéro
            Exit Sub
     
        'Si les tables sont bien présentes
        Else ' Si PresenceTable n'est pas false il est forcément true => test inutile
     
                Call Suppression_Table("TableCopie", db)
                Call MAJ_Table(chemin_complet, "TableAcopier", "TableCopie")
     
        End If
     
        MsgBox "La table a été importée."
     
    Set db = Nothing 'remise à zéro
     
    End Sub
    'Test l'existence d'une table dans la base rentrée en paramètre
    Public Function PresenceTable(chemin As String, ByVal strTable As String) As Boolean
     
        Dim dbInitiale As DAO.Database
        Set dbInitiale = DBEngine.OpenDatabase(chemin, False)
        Dim tdf As DAO.TableDef
     
    ' Parcourir toutes les tables de la base
    For Each tdf In dbInitiale.TableDefs
      If tdf.Name = strTable Then
        ' La table a été trouvée...
        PresenceTable = True
     
        dbInitiale.Close
        Set dbInitiale = Nothing 'remise à zéro
     
        Exit Function
      End If
    Next
     
    ' La table n'existe pas...
    PresenceTable = False
    dbInitiale.Close
    Set dbInitiale = Nothing 'remise à zéro
    End Function
    'Supprime la table de la base rentrée en paramètre
    Public Sub Suppression_Table(NomTable As String, dbC As DAO.Database)
    On Error Resume Next
    dbC.TableDefs.Delete NomTable
    End Sub
    'Met à jour la table en important la table à copier dans la base
    Public Sub MAJ_Table(chemin As String, TabSource As String, TabDest As String)
        Dim dbInitiale As DAO.Database
        Set dbInitiale = DBEngine.OpenDatabase(chemin, False)
        DoCmd.TransferDatabase acImport, "Microsoft Access", chemin, acTable, TabSource, TabDest, False, False
        dbInitiale.Close
        Set dbInitiale = Nothing 'remise à zéro
    End Sub

  9. #9
    Membre régulier
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mai 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 58
    Points : 72
    Points
    72
    Par défaut
    Puisque je teste avec la fonction PresenceTable, je suis sûr qu'elle est supprimée.

    J'ai testé ta suggestion mais ça donne le même résultat

  10. #10
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 127
    Points : 105
    Points
    105
    Par défaut
    Je ne sais pas si ça peut aider mais tu déclares une variable "dbInitiale" dans PresenceTable et aussi dans MAJ_Table. Peut être peux tu essayer de la différemment (ex: "dbInitiale" et "dbInitiale2")

  11. #11
    Membre régulier
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mai 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 58
    Points : 72
    Points
    72
    Par défaut
    Salut,

    ça ne marche pas non plus.

    Je ne sais pas si l'erreur vient du code mais j'ai tout essayé...

    Si quelqu'un a une idée à tester, je suis preneur.


    Le problème peut aussi venir de la table que j'importe mais je ne comprends pas pourquoi le message d'erreur vient au bout de 3,4 ou 5 imports, sachant que j'ai essayé avec différentes tables de 100000 ou 200000 lignes et que l'erreur survient au même moment.

  12. #12
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 127
    Points : 105
    Points
    105
    Par défaut
    Es tu obligé de supprimer la table pour la recréer après?
    Une requête de mise à jour ne suffirait elle pas?

  13. #13
    Membre régulier
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mai 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 58
    Points : 72
    Points
    72
    Par défaut
    Non je ne suis pas obligé de la supprimer.

    As-tu une suggestion de code pour supprimer les enregistrements de la [TableCopier] et mettre à jour avec les enregistrements de la [TableAcopier] du chemin du fichier?

    Merci d'avance

  14. #14
    Membre régulier
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mai 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 58
    Points : 72
    Points
    72
    Par défaut
    Est- ce que quelqu'un peut m'aider SVP.

    Je ne trouve aucune solution à ce problème sur le net, ni dans les aides

  15. #15
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 127
    Points : 105
    Points
    105
    Par défaut
    Pour utiliser une simple mise a jour il te faut deux tables, ca tombe bien vu que tu les as. Il faut cependant que les champs entre les deux tables soient strictement identiques, c est a dire le meme type de donnees. Ensuite je te conseil de lier ta table source a ton fichier access contenant ta table de destination. (j imagine que tu lances ton code a partir de ce fichier la)
    Ensuite il te suffit de faire une requete de mise a jour, je ne connais pas exactement le code mais ca soit etre un truc comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sql="update tabledest set * from tablesource"
    Docmd.runsql(sql)

  16. #16
    Membre régulier
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mai 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 58
    Points : 72
    Points
    72
    Par défaut
    ok merci beaucoup pour ton aide

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

Discussions similaires

  1. Importation d'une table access dans excel avec Macro
    Par wamkey dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 28/01/2014, 22h44
  2. Réponses: 7
    Dernier message: 20/08/2012, 08h11
  3. [OL-2003] Importation d'une table access dans le calendrier outlook
    Par ls8ls8 dans le forum VBA Outlook
    Réponses: 0
    Dernier message: 09/07/2009, 19h22
  4. import d'une table access ds mysql
    Par nogood1 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 26/05/2006, 14h12
  5. Réponses: 7
    Dernier message: 04/10/2005, 18h21

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