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 :

Travailler sur une autre base de données que celle où se trouve le code


Sujet :

VBA Access

  1. #1
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut Travailler sur une autre base de données que celle où se trouve le code
    Bonjour à tous,

    Alors j'ai juste un petit problème.
    J'utilise actuellement un code qui permet de transférer à partir d'access des données de classeurs excel.
    En fait le problème est que je voudrais avoir mon code dans un fichier access et mes bases de données à modifier dans une autre.
    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
    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    Sub tranfertFeuilleClasseursFermes_VersAccess1()
    Dim Cn As New ADODB.Connection
    Dim oProdRS As New ADODB.Recordset, oRS As ADODB.Recordset
    Dim oConn As ADODB.Connection
    Dim j As Integer
    Dim Fichier As String, Repertoire As String
    Dim Tbl As TableDef
    Dim Fich As String
     
    'Boucle sur les classeurs Excel du répertoire cible
    Repertoire = "C:\Users\name\Desktop\Work\Données\Folder"
    Fichier = Dir(Repertoire & "\*.xls")
     
    'Connection à la Base Access
    Set oConn = CurrentProject.Connection
    Set oRS = New ADODB.Recordset
     
    Do While Fichier <> ""
        'Connection au classeur Excel
        Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & Repertoire & "\" & Fichier & ";" & _
        "Extended Properties=""Excel 8.0;"""
     
        TableExiste = False
     
        'Parcours du nom des tables de la base pour le fichier
        For Each Tbl In CurrentDb.TableDefs
            Fich = Left(Fichier, Len(Fichier) - 4)
            TableName = Tbl.Name
     
            If Fich = TableName Then
                TableExiste = True
                'requête pour extraire les données de la Feuil1
                oProdRS.Open "SELECT * FROM [Sheet1$]", Cn, adOpenStatic
                oRS.Open "Select * from " & TableName & "", oConn, adOpenKeyset, adLockOptimistic
     
                ' --- Transfert des données dans la base ---
                Do While Not (oProdRS.EOF)
                    oRS.AddNew
                    For j = 0 To oRS.Fields.Count - 1
                        oRS.Fields(j) = oProdRS.Fields(j).Value
                    Next j
                    oRS.Update
                    oProdRS.MoveNext
                Loop
            oProdRS.Close
            oRS.Close
     
            ElseIf Left(Fichier, 3) = "NAV" Then
                TableExiste = True
                'requête pour extraire les données de la Feuil1
                oProdRS.Open "SELECT * FROM [Sheet1$]", Cn, adOpenStatic
                oRS.Open "Select * from " & HISTO_FUND & "", oConn, adOpenKeyset, adLockOptimistic
     
                ' --- Transfert des données dans la base ---
                Do While Not (oProdRS.EOF)
                    oRS.AddNew
                        For j = 0 To oRS.Fields.Count - 1
                        oRS.Fields(j) = oProdRS.Fields(j).Value
                        Next j
                    oRS.Update
                    oProdRS.MoveNext
                Loop
            oProdRS.Close
            oRS.Close
            End If
        Next Tbl
     
        'Si pas de table du nom du fichier, créer une table
        If TableExiste = False Then
            CurrentDb.Execute "SELECT * INTO [" & Fich & "] FROM 6112Bis;"
            CurrentDb.Execute "CREATE INDEX NewIndex ON " & Fich & "(Numero, Date_Nav) WITH PRIMARY"
            'requête pour extraire les données de la Feuil1
            oProdRS.Open "SELECT * FROM [Sheet1$]", Cn, adOpenStatic
            oRS.Open "Select * from " & Fich & "", oConn, adOpenKeyset, adLockOptimistic
     
            ' --- Transfert des données dans la base ---
            Do While Not (oProdRS.EOF)
                oRS.AddNew
                For j = 0 To oRS.Fields.Count - 1
                    oRS.Fields(j) = oProdRS.Fields(j).Value
                Next j
                oRS.Update
                oProdRS.MoveNext
            Loop
            oProdRS.Close
            oRS.Close
        End If
     
        'Fermeture de la connection au classeur Excel
        Cn.Close
    Fichier = Dir
     
    Loop
     
    oConn.Close
    Set oRS = Nothing
    'Fermeture de la connection Access
    Set oConn = Nothing
    End Sub
    Alors, je sais comment faire pour ouvrir un autre fichier access à partir de celui-ci, je remplace simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set oConn = CurrentProject.Connection
    Par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    oConn.Open "Provider='Microsoft.Jet.OLEDB.4.0';" & _
    "Data Source= 'C:\maBase.mdb';"
    Ou bien pour un fichier plus récent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    oConn.Open "Provider='Microsoft.ACE.OLEDB.12.0';" & _
    "Data Source= 'C:\maBase.accdb';"
    Donc en fait je voudrais pouvoir remplacer toutes mes lignes où j'ai un CurrentDB par quelque chose qui me permette de travailler sur une autre base de donnée, en l'occurence ici : maBase.accdb.

    Merci d'avance pour vos réponses.
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Bonjour,

    CurrentDb et CurrentProject travaille sur la base ouverte. Même si le code est dans une bibliothèque.

    CodeDB et CodeProject travaille sur la base où est contenu le code. Une base principale ou une bibliothèque.

    Si tu souhaites utiliser une db particulière tu as tout intéret à la mettre en variable globale dans la base principale.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  3. #3
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Je ne suis pas sûr de comprendre...

    J'ai 2 base de données :
    - code.accdb où se trouve uniquement un module avec mon code dedans.
    - maBase.accdb où se trouve plusieurs tables sur lesquels j'aimerais importer des données excel.

    Que mettre à la place de currentDB.execute, currentDB.TableDefs, etc...?

    J'explique pourquoi j'ai besoin de cela :
    J'utilise un fichier batch qui fait appel à ma base de données. Lorsqu'elle s'ouvre un autoexec se lance et lance le programme.
    J'aimerais séparer les 2, DB et code, pour ne pas, à chaque fois que j'ouvre ma DB, lancer le programme.

    Comment puis-je faire ?
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Attache simplement tes tables ACCESS dans ton fichier Code.
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  5. #5
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    C'est déjà le cas...Et j'essaye justement de les séparer...
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

  6. #6
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Citation Envoyé par Nitromard Voir le message
    J'utilise un fichier batch qui fait appel à ma base de données. Lorsqu'elle s'ouvre un autoexec se lance et lance le programme.
    J'aimerais séparer les 2, DB et code, pour ne pas, à chaque fois que j'ouvre ma DB, lancer le programme.

    Comment puis-je faire ?
    C'est le fonctionnement classique d'une base séparée du programme. D'un coté tu as les données et de l'autre le programme avec les liens (attaches) de tes tables.
    Cela n'empêche pas le fichier contenant les tables de contenir du code. Pour ton fichier programme (qui contient les attaches) cela reste transparent (pas d'exécution, pas de visibilité de celui-ci).

    C'est plus souple de travailler avec des attaches.

    Si tu ne souhaites pas exécuter ton autoexec, utilise la touche shift au démarrage ou envoie lui un paramètre via le cmd dans la ligne de commande (voir mon tuto sur les options de la ligne de commande).

    Est-ce que cela répond à ta question ?
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  7. #7
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Ok je pense que j'ai compris.
    Je résume au cas où ^^ :
    J'ai un fichier code dans lequel, j'ai des attaches aux tables du fichier base ainsi que le code d'origine(celui que j'ai dans mon premier post).
    La macro autoexec se trouve dans le fichier code ou dans le fichier base? J'imagine dans le code, puisque je voudrais justement l'avoir dedans.
    Je viens de regarder ce lien pour les attaches :
    http://office.microsoft.com/fr-ch/ac...27658.aspx#BM3

    Le problème est qu'il faut attacher des tables apparemment déja existante.
    Dans ma base de données j'ai en fait une série de tables ayant comme nom des numéro à 4 chiffres (ayant toute la mm structure, cad : noms des champs, nombre de champs et clé primaire), 3 tables spécifiques de structures toutes différentes, une table source.
    La table source est juste une table ayant la mm structure que les tables numéros, mais qui me permet de créer de nouvelles tables.
    En effet, je copie la structure de la table source pour créer une nouvelle table numéro si le nom du classeur excel à importer n'existe pas encore dans ma DB.
    Est-ce que si je met ma table source en attache, les autres tables crées seront aussi en attache, ou dois-je le faire manuellement ?
    Et du coup est-ce que les données seront importées correctement si mon code n'est pas dans mon fichier base?
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

  8. #8
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Bonjour,
    Non si tu crées une table elle le sera dans le fichier contenant le code. Il faut explicitement la créer dans la base distante.

    • Tu peux créer la structure dans la base distante via DAO, puis l'attacher ensuite la remplir.
    • Tu peux également choisir de la créer puis de l'exporter dans la base distante et l'attacher.


    Une table attachée a les mêmes propriétés qu'une table locale. La seule chose qu'on ne peut pas faire c'est les relations d'intégrités.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  9. #9
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Bonjour,

    J'ai fait quelques tests pour voir ce que je préfèrerais faire.
    Je pense donc mettre mon code avec ma tablesource dans le fichier de mes attaches.

    Je pense plutôt créer mes tables dans ma base d'attache et ensuite les exporter vers ma base, puis créer une attache.
    Je vais voir si tout ceci exsite en code VBA access, sinon une petite (ou une grosse ^^) aide serait la bienvenue.

    Merci déjà pour vos réponses et pour votre aide.
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

  10. #10
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Rebonjour,

    J'ai trouvé une méthode plutôt efficace pour faire ce que je veux, je la met ici, et j'attends votre avis pour mettre la discussion en résolu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DoCmd.TransferDatabase acExport, "Microsoft Access", "C:\Users\qdeutschle\Desktop\Database1.accdb", acTable, Fich, Fich
            DoCmd.DeleteObject acTable, Fich
            DoCmd.TransferDatabase acLink, "Microsoft Access", "C:\Users\qdeutschle\Desktop\Database1.accdb", acTable, Fich, Fich
    Encore merci pour tout ^^
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

  11. #11
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Parfait !
    Il ne manque plus qu'à mettre les chemins en variable et d'inclure le code d'une fenêtre Ouvrir fichier (dispo dans la faq) pour que ton appli soit pratique.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

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

Discussions similaires

  1. mise a jour de table sur une autre base de donnée
    Par didinedz dans le forum Réplications
    Réponses: 2
    Dernier message: 07/06/2012, 17h06
  2. OPENROWSET sur une autre base de données
    Par elsuket dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 29/05/2007, 16h19
  3. [SQL]Select dans une table d'une autre base de données
    Par Didouille dans le forum Access
    Réponses: 3
    Dernier message: 21/12/2005, 09h00
  4. Réponses: 2
    Dernier message: 16/11/2005, 13h41
  5. copier une table vers une autre base de données
    Par Herveg dans le forum Oracle
    Réponses: 3
    Dernier message: 11/01/2005, 14h20

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