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 :

ne conserver que les tables dans une base externe [AC-2003]


Sujet :

VBA Access

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 681
    Points : 214
    Points
    214
    Par défaut ne conserver que les tables dans une base externe
    Bonjour,
    Je souhaiterais pouvoir supprimer formulaires, requêtes, états et macros dans une base externe pour n'y conserver que les tables.
    Exemple pour les formulaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      Dim MaBd As DAO.Database
      Dim strNomBase As String
      Dim MonFrm As DAO.Document
      Set MaBd = DBEngine.Workspace.OpenDatabase(strNomBase)
     
    With MaBd
      For Each MonFrm In .Containers("Forms").Documents
         DoCmd.DeleteObject acForm, MonFrm.Name
      Next
    End With
    Aucune erreur n'est signalée, mais aucun formulaire n'est supprimé !
    Auriez-vous une explication?
    Merci
    Amitiés

  2. #2
    Membre chevronné
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Points : 2 178
    Points
    2 178
    Par défaut
    Bonjour,
    et avec AllForms ?

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 681
    Points : 214
    Points
    214
    Par défaut
    @ helas
    Merci de cette piste, mais, d'après l'aide en ligned'Access
    Vous ne pouvez ni ajouter, ni supprimer un objet AccessObject dans la collection AllForms
    On peut lister les noms des forms, mais pas les supprimer.
    Idem avec AllQueries ou AllReports.
    Je cherche...

    Amitiés

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2010
    Messages : 47
    Points : 60
    Points
    60
    Par défaut
    Bonjour

    Contribution à la résolution de votre problème ; elle est non satisfaisante car elle nécessite de connaître le nom des objets mais ...

    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
    '  DETRUIRE OBJET DANS UNE BASE EXTERNE
    '  ENTREES
    '           BaseExterne   Base externe avec chemin complet et suffixe
    '           intT  Type d'objet
    '                            0 pour table, 1 pour requête, 2 pour formulaire, 3 pour état, 4 pour macro et 5 pour module
    '           strNom  Nom de l'objet
    '  SORTIE  Vrai si tout est OK   Faux si problème rencontré
    '
    Function DetruireObjetExterne(BaseExterne As String, intT As Integer, strN As String) As Boolean
        'On Error GoTo ErrDetruireObjetExterne
        Dim Obj As Object
        Set Obj = CreateObject("Access.Application")
        With Obj
            .OpenCurrentDatabase BaseExterne, True
            .DoCmd.DeleteObject intT, strN
            .CloseCurrentDatabase
        End With
        Obj.Quit
        Set Obj = Nothing
        DetruireObjetExterne = True
    ExDetruireObjetExterne:
        Exit Function
    ErrDetruireObjetExterne:
        MsgBox Err.Number & " " & Err.Description, vbExclamation, "Détruire objet base externe"
        DetruireObjetExterne = False
        Resume ExDetruireObjetExterne
    End Function
    Je n'arrive à trouver la solution au problème Lister les objets et les détruire à mesure (Pour détruire ses objets la base doit être ouverte en mode exclusif).
    Solution à tester : mettre les noms des objets à détruire dans une table temporaire interne puis les détruire.

    Merci de me tenir au courant si vous trouvez une solution ; je travaille en ce moment sur les bases externes (lire objets, propriétés, code ...)
    A+
    Nourson

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 681
    Points : 214
    Points
    214
    Par défaut
    @Nourson
    J'en suis au même point et avais pensé aussi à passer par une récupération des noms des objets à supprimer, puis de procéder à la suppression.

    C'est moins élégant que de faire tout à la fois, mais comme vous le dites
    (Pour détruire ses objets la base doit être ouverte en mode exclusif).
    et cela nécessite une manipulation supplémentaire.
    Donc je teste liste, puis suppression.

    Amitiés

  6. #6
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Une boucle for each ne permet pas une suppression de plusieurs objets. Il faut faire une boucle For sur les items de la collection en parcourant celle-ci à l'envers. For i = collection.count to 1 step -1 (ou count-1 to 0 suivant la collection)

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 681
    Points : 214
    Points
    214
    Par défaut
    Bonsoir,
    L'établissement de la table regroupant les noms des objets à supprimer ne pose pas de problèmes.
    Par contre la seconde partie (suppression dans la base externe) ne fonctionne pas, la fonction échoue à chaque fois.
    Impossible de récupérer les valeurs de intT et strN,
    "Références incorrectes ou non qualifuée"

    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
    Public sub Vide
    Dim WS  As Workspace
    Set WS = DBEngine.Workspaces(0)
    Dim BdExt As DAO.Database
    Set BdExt = WS.OpenDatabase(BaseExt)
    Dim MaBd As DAO.Database
    Set MaBd = DBEngine.Workspaces(0).Databases(0)
    Set rst = MaBd.OpenRecordset("tabObjSupp")
    '=============
    Dim MonDoc As DAO.Document
    With BdExt
      'Inscrit les formulaires dans tabObjSupp
      For Each MonDoc In .Containers("Forms").Documents
        With rst
          .AddNew
          .typeObj = 2 '"acform"
          .NomObj = MonDoc.Name
          .Update
        End With
      Next
      'Inscrit les états
      For Each MonDoc In .Containers("Reports").Documents
        With rst
          .AddNew
          .typeObj = 3 '"acReport"
          .NomObj = MonDoc.Name
          .Update
        End With
      Next
      'Inscrit les requêtes
      Dim qry As QueryDef
      For Each qry In .QueryDefs
      'si la requête n'est pas sytème (commence par ~)
        If left(qry.Name, 1) <> "~" Then
          With rst
            .AddNew
            .typeObj = 1 '"acQuery"
            .NomObj = qry.Name
            .Update
          End With
        End If
      Next
    End With
     
    'Supprime les objets listés dans tabObjSupp
      rst.MoveFirst
     Do While Not rst.EOF    
          intT = ![typeObj]
          strN = !NomObj
          Call DetruireObjetExterne(BaseExt, intT,strN)       
          rst.MoveNext Loop     
    loop
    End sub 
     
    Function DetruireObjetExterne(BaseExterne As String, intT As Integer, strN As String) As Boolean
        On Error GoTo ErrDetruireObjetExterne
        Dim Obj As Object
        Set Obj = CreateObject("Access.Application")
        With Obj
            .OpenCurrentDatabase BaseExterne, True
            .DoCmd.DeleteObject intT, strN
            .CloseCurrentDatabase
        End With
        Obj.Quit
        Set Obj = Nothing
        DetruireObjetExterne = True
    ExDetruireObjetExterne:
        Exit Function
     
    ErrDetruireObjetExterne:
        MsgBox err.Number & " " & err.Description, vbExclamation, "Détruire objet base externe"
        DetruireObjetExterne = False
        Resume ExDetruireObjetExterne
    End Function
    A suivre !
    Amitiés

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2010
    Messages : 47
    Points : 60
    Points
    60
    Par défaut
    Bonjour

    Il est nécessaire de faire l'opération en 2 étapes distinctes (voir ma remarque sur l'ouverture en mode exclusif)
    - 1ère étape : récupérer les noms d'objets avec leur type (attention : format numérique) puis fermer la base externe.
    - 2ème étape : lire la table et détruire les objets avec la routine fournie.

    Il est nécessaire de faire 2 subs distinctes en fermant bien les objets ouverts avec 'set' avant de quitter. Je viens de tester ; celà fonctionne.

    A+
    Nourson

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 681
    Points : 214
    Points
    214
    Par défaut
    Bonsoir,
    J'ai bien fait les 2 étapes en séparant la création de la table et la suppression dans la base externe.
    Ca fonctionne en effet, mais seulement pour les requêtes.
    Pour les états et formulaires, on aboutit à une erreur "action annulée", la fonction "DetruireObjetExterne" prend la valeur fausse.

    J'ai cru que ça pouvait provenir de valeurs d'attribut erronnées(1 pour requête, etc), mais non.

    Si vous avez une idée ...
    Amitiés.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2010
    Messages : 47
    Points : 60
    Points
    60
    Par défaut
    Bonjour
    Voici le code (avec exemple d'une base 'Données')

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim NomBaseExterne As String
        NomBaseExterne = left(CurrentDb.Name, Len(CurrentDb.Name) - Len(Dir(CurrentDb.Name))) & "Donnees.accdb"
     
        Dim BD As DAO.Database
        Dim rst As DAO.Recordset
        Set BD = CurrentDb
        Set rst = BD.OpenRecordset("tabObjSupp", dbOpenDynaset)
        Do Until rst.EOF
            DetruireObjetExterne NomBaseExterne, rst!typeObj, rst!NomObj
            rst.MoveNext
        Loop
        Set rst = Nothing
        Set BD = Nothing
    J'espère que cel vous convient
    Ne pas oublier de faire 2 routines, l'une pour capturer les types et noms d'objet, l'autre pour supprimer. Dans la 1ère bien fermer la base externe.

    Nourson

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 681
    Points : 214
    Points
    214
    Par défaut
    @Nourson
    Merci : tout va bien !
    J'ai simplement remplacé ma sub par la vôtre en l'adaptant.

    C'est un peu lent : 3 sec pour supprimer 3 objets, car à chaque objet il faut ouvrir et refermer la base externe, mais c'est efficace et c'est l'essentiel.

    Amitiés

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/08/2008, 17h50
  2. Renommer une table dans une base externe
    Par AndréPe dans le forum VBA Access
    Réponses: 2
    Dernier message: 11/05/2007, 08h01
  3. [Access2000] Lister les tables d'une base externe
    Par AndréPe dans le forum Access
    Réponses: 5
    Dernier message: 07/05/2007, 17h21
  4. Suppression de toutes les tables dans une base de données
    Par GDMINFO dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/04/2007, 08h24
  5. Réponses: 2
    Dernier message: 07/03/2006, 15h27

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