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

Access Discussion :

[Fait]ouvrir une DB par OpenCurrentDatabase sans activer l'Autoexec [FAQ]


Sujet :

Access

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 74
    Points : 88
    Points
    88
    Par défaut [Fait]ouvrir une DB par OpenCurrentDatabase sans activer l'Autoexec
    Voilà mon problème. Je termine le développement d'une application de documentation automatique de DB ACCESS. Je reste avec un problème sur les bras, c'est celui de l'ouverture de la DB à traiter.

    Je dois l'ouvrir de deux manières différentes :
    - la première par OpenDatabase pour récupérer la structure générale des données (là pas de problèmes)
    - la seconde par OpenCurrentDatabase pour accéder au contenu et aux propriétés des formulaires, des rapports , des modules et des macros .

    Tout se passe sans problèmes pour une DB qui n'a pas de macro Autoexec.
    Par contre dans le cas contraire, cette macro est activée.

    Il va sans dire que je ne peux pas modifier manuellement le contenu de la macro Autoexec , il s'agit de DB du client et rien ne doit changer dedans (du moins de manière permanente). De plus, l'application sera étendue pour fonctionner en mode batch sur toutes les DB sélectionnées dans le disque.


    Donc ma question précise est la suivante :

    Est-il possible d'ouvrir une DB par l'instruction OpenCurrentDatabase en inhibant l'action de la macro Autoexec de la DB cible.

    Voici l'extrait du code correspondant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Public §ACCS_CURT§ As Application
     
    ....
     
    Dim DBAS_FILE as string
     
    ....
     
    If §ACCS_CURT§ Is Nothing = True Then
    Set §ACCS_CURT§ = New Access.Application
    End If
     
    §ACCS_CURT§.OpenCurrentDatabase DBAS_FILE
    Donc merci à vous pour toute réponse ou suggestion qui seront les bienvenues.

  2. #2
    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
    Question intéressante

    Une idée, je ne sais pas ce qu'elle vaut

    Ouvrir un objet database avec opendatabase, renommer la macro autoexec avec l'objet document et le container Macros. Fermer l'objet database et ouvrir l'instance Access comme tu le fais déjà. A la fin, renommer la macro en autoexec. Je sais c'est un peu moyen en cas de plantage au milieu mais pour l'instant, je ne vois que ça

    Peut être une autre possibilité, je ne sais pas : simuler l'appui de la touche shift avec l'api windows.

    Je n'ai pas d'autre piste pour l'instant

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 74
    Points : 88
    Points
    88
    Par défaut
    Merci pour ta réponse, et désolé si je pose des questions un peu tordues, mais d'habitude, en cherchant un peu, je finis toujours par trouver par moi-même.

    Pourtant, ce cas-ci (et le précédent) m'ont déjà donné pas mal de cheveux gris, alors je me disais que "faire appel à l'équipe" une fois de temps en temps, ce n'est pas superfu.

    Merci encore.

    PS, j'en ai une autre en préparation, mais je vais encore un peu chercher avant de soumettre mon problème sur le forum.

    En tout cas, je tire mon chapeau à tous les responsables de ce site pour la courtoisie et la disponibilité dont vous faites preuve.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 74
    Points : 88
    Points
    88
    Par défaut
    Bonjour Tofalu,

    Ton idée était bonne, mais je ne vois pas très bien comment parvenir à renommer la macro Autoexec sans ouvrir une instance de la DB.

    Voici l'extrait du code par lequel j'ai tenté d'appliquer ta méthode.

    (je précise que le chargement de tous les containers et de tous les documents a été effectué et les données stockées dans la table tbl_CONT_DBAS_MAIN). Le code est exécuté après le chargement.

    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
     
      Set WORK_SPCE = CreateWorkspace("", "admin", "", dbUseJet)
      Set EXTE_DBAS = WORK_SPCE.OpenDatabase(DBAS_FILE)
      Set CURT_DBAS = CurrentDb
    ... 
     
    ' (chargement de la table)
    ...
     
      STRG_AUTO = "SELECT * FROM tbl_CONT_DBAS_MAIN " & _
                  "WHERE CONT_NAME = 'Scripts' " & _
                  "AND ITEM_NAME = 'Autoexec'"
      Set RECS_AUTO = CURT_DBAS.OpenRecordset(STRG_AUTO)
     
      If Not RECS_AUTO.EOF Then
        Set OBJT_CONT = EXTE_DBAS.Containers("Scripts")
        Set OBJT_ITEM = OBJT_CONT.Documents("Autoexec")
        OBJT_ITEM.Properties("NAME").Value = "Auto_exec"
      End If
    La ligne "OBJT_ITEM.Properties("NAME").Value = "Auto_exec" me revoit une erreur 3001 Invalid Argument.

    J'imagine que c'est du fait que je ne peux pas modifier le nom de la macro.

    Je pourrais utiliser DoCmd pour effectuer le changement de nom, mais pour ça il faut ouvrir la DB et naturellement, lorsque je vais l'ouvrir, la macro Autoexec va s'exécuter. Donc je ne suis pas plus avancé.

    Peut-être existe-t-il une autre possibilité de renommer la macro ?

  5. #5
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut
    Bonjour,

    Je ne suis guère surpris que tu obtiennes une erreur car il me semble que la propriété Name des objets Document n'est modifiable que si l'on vient de créer le document par code et avant qu'il ne soit ajouté à la collection.


    A tout hasard, tu peux peut-être essayer de simuler la touche Shift comme le suggère Tofalu, à l'aide de l'API keybd_event.

    Je viens de faire un petit essai qui semble prometteur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    Dim db As Database
    Dim appAccess As Access.Application
    Const csts = "D:\Mes documents\BaseTests.mdb"
     
     
       keybd_event vbKeyShift, 0, 0, 0 'Enfonce la touche SHift
        Set appAccess = New Access.Application
        appAccess.Visible = True
        appAccess.OpenCurrentDatabase csts
        appAccess.DoCmd.OpenForm "MonForm"
        keybd_event vbKeyShift, 0, 2, 0
    'libère la touche SHift
    ............................................................................................

    Dans l'intérêt de tous, ne posez pas de questions techniques par messages privés.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 74
    Points : 88
    Points
    88
    Par défaut
    Merci Mout1234, t'as mis en plein dans le mille. Ca fonctionne correctement.
    Grand merci à toi.

  7. #7
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut
    Citation Envoyé par NOODLE02
    Merci Mout1234, t'as mis en plein dans le mille. Ca fonctionne correctement.
    Grand merci à toi.
    Dis surtout merci à Tofalu... à qui revient l'idée initiale
    ............................................................................................

    Dans l'intérêt de tous, ne posez pas de questions techniques par messages privés.

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

Discussions similaires

  1. [Débutant] Est-ce possible d'ouvrir une form par animation flash
    Par jeremyvb11 dans le forum VB.NET
    Réponses: 0
    Dernier message: 02/07/2012, 01h50
  2. [XL-2010] Ajouter une macro par macro sans activer de référence?
    Par EmmanuelleC dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 10/05/2012, 14h38
  3. Réponses: 12
    Dernier message: 14/03/2012, 20h02
  4. impossible d'ouvrir une fiche par utilisateur
    Par delfinition dans le forum Bases de données
    Réponses: 10
    Dernier message: 21/03/2010, 08h05
  5. ouvrir une application en vba sans perdre le focus ?
    Par biosoundsystem dans le forum VBA Access
    Réponses: 4
    Dernier message: 11/03/2009, 12h30

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