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 :

Problème aves les références selon versions


Sujet :

VBA Access

  1. #1
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 169
    Points : 68
    Points
    68
    Par défaut Problème aves les références selon versions
    Bonjour,
    J'ai répondu sur un post ancien, mais mon problème a changé alors je reformule un nouveau post.
    Ici le début de mes problèmes : http://www.developpez.net/forums/d67...d/#post4056544

    Maintenant j'ai fait cela et cela marche à peu près :
    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
    Private Sub RefInit()
    Dim i, Compte As Integer
    Dim RefName As String
    Dim rfRéférence As Reference
        Compte = 2
    LoopRef:
        On Error Resume Next
        For i = 1 To Application.References.Count
            Set rfRéférence = Application.References(i)
            RefName = rfRéférence.Name
            If RefName = "Excel" Or RefName = "Outlook" Or RefName = "ADOR" Or Err <> 0 Then
                Application.References.Remove Application.References.Item(i)
    ' Une fois sur 2 le remove sort en erreur, donc je boucle pour réexécuter
                If Err <> 0 Then
                    Compte = Compte - 1
                    If Compte = 0 Then
                        MsgBox ("Erreur lors de l'initialisation des Références. Arrêt de l'initialisation")
                    Else
                        GoTo LoopRef
                    End If
                End If
            End If
        Next
        On Error Resume Next
        Application.References.AddFromFile (gRepApp & "\_REFERENCES\excel.exe")
        Application.References.AddFromFile (gRepApp & "\_REFERENCES\msoutl.olb")
        Application.References.AddFromFile (gRepApp & "\_REFERENCES\msador15.dll")
    End Sub
    A ceci près que j'ai 2 problèmes :
    • Il me donne une erreur une fois sur 2 avec comme message "Numéro invalide" erreur 452, au moment où il supprime la référence. Comme il n'est pas possible de supprimer la référence en pas à pas, je ne sais pas d'où vient l'erreur.
      Soit je l'ai contourné, même si ce n'est pas propre ça marche.
    • 2ième problème plus grave, je perds toutes les variables globales quand j'exécute ce code. Et là mystère, je ne comprends pas.


    Quelqu'un a-t-il une explication ou mieux une solution ?

    Merci d'avance

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonsoir,
    1) Le problème vient de l'utilisation d'une boucle For.. Next. Le nombre de boucles à effectuer n'est pas réévaluer et lors d'une suppression le References.Count diminue alors que le compteur I augmente à chaque tour; Essaie avec une boucle Do... Loop Until ou Do While ... Loop, lors d'une suppression le compteur i ne doit pas être incrémenté.

    2) A priori, la condition sinequanone de fonctionnement de ton application est que les références correctes soient présentes; donc ne rien faire avant.

  3. #3
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 169
    Points : 68
    Points
    68
    Par défaut
    Merci pour cette réponse.
    Pour le point 1 ça marche mieux avec do until, plus d'erreur (enfin celle là).
    Mais je truc qui consiste à copier les fichiers en référence dans le répertoire de l'appli marche moyennement.
    C'est bizarre quelques fois oui d'autres non.
    Il n'y a pas de problème avec 2007, il s'adapte bien, mais c'est 2003 qui ne sait pas retrouver les références.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,
    si un fichier de même nom existe déjà dans la base de registre, tu n'auras pas d'ajout depuis ton fichier mais depuis le fichier inscrit dans la base de registre, (à moins que tu ne fasses un regsvr32.exe).

    Pour Excel et Outlook ajoute les références depuis le répertoire d'office que tu as dans SysCmd(AcSysCmdAccessDir) et essaie en ne supprimant que les références manquantes.

  5. #5
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 169
    Points : 68
    Points
    68
    Par défaut
    Bonjour,
    Merci pour cette réponse. Déjà ça a l'air mieux comme cela. J'ai mis la fonction dans une macro Autoexec qui enchaîne la fonction et ensuite le menu principal.
    Ca règle une partie des erreurs. Il me reste juste que le remove ne se fait pas quand je passe d'un Office2007/Vista a un Office2003/XP. Le chemin reste sur \Program Files (x86)\. Par contre il suffit de décocher et de relancer, ce qui est mieux que e demander à l'utilisateur d'aller chercher la bonne référence dans une multitude.

    Mais peut-être ai-je fait une erreur dans la commande .Remove

    J'ai fait cela :

    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
    Public Function RefInit()
    Dim i As Integer
    Dim stRequete, RefName, valeurVariable$, nmVariable, stCommonFolder As String
    Dim rfRéférence As Reference
     
    On Error Resume Next
     
        i = 0
        Do Until i > Application.References.Count
            i = i + 1
            Set rfRéférence = Application.References(i)
            RefName = rfRéférence.Name
            If RefName = "Excel" Or RefName = "Outlook" Or RefName = "ADOR" Or Err <> 0 Then
                Application.References.Remove Application.References(i)
            End If
        Loop
    ' Excel en premier pour récupérer la variable CommonProgramFiles
        Application.References.AddFromFile (SysCmd(acSysCmdAccessDir) & "excel.exe")
        If RécupèreValeurVariableEnvironnement("CommonProgramFiles", valeurVariable$) Then
            MsgBox "La variable """ & nmVariable & """ n'existe pas !"
        Else
            stCommonFolder = valeurVariable$
        End If
     
        Application.References.AddFromFile (SysCmd(acSysCmdAccessDir) & "msoutl.olb")
        Application.References.AddFromFile (stCommonFolder & "\System\ado\msador15.dll")
    End Function
    Si vous aviez une idée pour faire fonctionner le .Remove comme une décoche, je suis preneur.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Voici un code que je ne peux pas tester.
    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
    Public Sub RefInit()
     Dim I As Integer, RefName As String 
     i=1
     Do While I<= References.Count
      RefName=References(i).Name
      If References(i).IsBroken And (Left(RefName,5)="Excel" Or Left(RefName,7)="OutLook") Then
         References.Remove References(i)
         i=i-1 
    'A vérifier 
         If Left(RefName,5)="Excel" Then References.addFromFile Dir(SysCmd(AcSyscmdAccessDir) & "Excel*.olb")
    'A vérifier msoutlxx.olb où x le n° de version
         If Left(RefName,7)="Outlook" Then References.AddfFromFile Dir(SysCmd(AcSyscmdAccessDir) & "msoutl*.olb") 
      End if 
      I=I+1
     Loop
    End sub

  7. #7
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 169
    Points : 68
    Points
    68
    Par défaut
    Désolé cela ne marche pas. J'ai modifié le code pour couper en 2 la suppression et la création. Le problème c'est que quand la référence excel n'est pas là la fonction se plante d'entrée de jeu sur les fonctions de chaîne comme left() ou chr().
    Je n'ai pas de problème avec l'ajout cela marche bien. si je supprime manuellement les références marquées MANQUANT elles se réinstallent bien.
    Le problème est que la suppression s'arrête avec l'erreur 48 ("Erreur de chargement de la DLL"). Le champ Broken n'est pas valide, il renvoie :<Erreur définie par l'application ou par l'objet>.

    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
    Public Function RefInit()
    Dim i As Integer
    Dim RefName As String
    Dim rfRéférence As Reference
     
    On Error Resume Next
     
        i = 1
        Do While i <= Application.References.Count
            Set rfRéférence = Application.References(i)
            RefName = rfRéférence.Name
            If Err <> 0 And (RefName = "Excel" Or RefName = "OutLook" Or RefName = "ADOR") Then
                References.Remove References(i)
                i = i - 1
                If rfRéférence.Guid = "{00020813-0000-0000-C000-000000000046}" Then _
                                    Application.References.AddFromFile (SysCmd(acSysCmdAccessDir) & "excel.exe")
                If rfRéférence.Guid = "{00062FFF-0000-0000-C000-000000000046}" Then _
                                    Application.References.AddFromFile (SysCmd(acSysCmdAccessDir) & "msoutl.olb")
            End If
            i = i + 1
        Loop
    End Function
    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
    Public Function RefCreate()
    Dim valeurVariable$, nmVariable, stCommonFolder, stSystemDir, stOfficeCommon As String
     
    ' Dans cette partie je remets les références
        If RécupèreValeurVariableEnvironnement("CommonProgramFiles(x86)", valeurVariable$) Then
            If RécupèreValeurVariableEnvironnement("CommonProgramFiles", valeurVariable$) Then
                MsgBox "La variable """ & nmVariable & """ n'existe pas !"
            End If
        End If
        stCommonFolder = valeurVariable$
        stOfficeCommon = stCommonFolder & "\Microsoft Shared\OFFICE" & Left(SysCmd(acSysCmdAccessVer), 2)
        If RécupèreValeurVariableEnvironnement("windir", valeurVariable$) Then
            MsgBox "La variable """ & nmVariable & """ n'existe pas !"
        Else
            stSystemDir = valeurVariable$
            stSystemDir = IIf(Dir(stSystemDir & "\SysWOW64\*.dll") <> "", stSystemDir & "\SysWOW64", stSystemDir & "\system32")
        End If
     
        On Error Resume Next
        Application.References.AddFromFile (stOfficeCommon & "\MSO.DLL")
        Application.References.AddFromFile (SysCmd(acSysCmdAccessDir) & "msoutl.olb")
        Application.References.AddFromFile (stSystemDir & "\stdole32.tlb")
        Application.References.AddFromFile (stCommonFolder & "\System\ado\msador15.dll")
        Application.References.AddFromFile (stCommonFolder & "\Microsoft Shared\DAO\dao360.dll")
    End Function

  8. #8
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 183
    Points : 1 362
    Points
    1 362
    Par défaut
    A mon avis, ça va coincer, parce que l'application a besoin des références pour se lancer et installer les références manquantes.
    Ca tourne en rond.

    Faudrait faire une autre appli, qui n'a pas besoin des références et qui ne fait qu'installer les références nécessaires à l'autre appli.
    [Access] Les bases du débogage => ici

  9. #9
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 169
    Points : 68
    Points
    68
    Par défaut
    C'est pour cela que j'ai coupé en 2. La réinit minimum dont j'ai besoin pour continuer c'est de Excel.
    J'ai essayé de réduire à uniquement les fonctions Refinit et RefCreate, mais cela plante pareil.

  10. #10
    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
    en général une boucle For est possible pour des suppressions mais en décrémentant
    soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    For i = 1 To Application.References.Count
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    For i = Application.References.Count To 1 Step -1
    la suppression n'intervient pas sur l'index des références

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 197
    Points : 300
    Points
    300
    Par défaut
    Bonjour,

    Confronté au même problème, j'ai beaucoup galéré, avant de trouver une solution un peu bancale mais satisfaisante et fonctionnelle.

    Tout d'abord un petit état des lieux.
    Le problème avec les références manquantes est qu'elles sont... manquantes c'est à dire qu'on ne peut déjà plus les supprimer, puisque la méthode .Remove de la collection References à besoin non pas d'un indice ou d'un nom pour fonctionner mais de l'objet Reference lui-même; un comble : on ne peut enlever que les références présentes (!! sic) sinon on se heurte à l'erreur 48 si l'on tente d'accéder à un objet Reference manquant.

    Donc si j'ouvre dans Access 2003 une base comportant une référence vers excel 2007 par exemple je ne peux pas l'enlever.

    Un autre souci est que l'on ne peut avoir deux références ayant le même nom même s'il s'agit de fichiers différents, stockés dans des endroits différents. Impossible donc d'avoir des références vers les 2 objets Excel 2003 et 2007, et cela peut se comprendre.

    Mon approche, en deux passes, a été la suivante :
    1) Systématiquement enlever la référence vers Excel lorsqu'on quitte la base de données.
    2) Systématiquement ajouter la référence vers Excel au démarrage de la base

    Malheureusement, Microsoft a décidé de ne pas nous faciliter la tâche, puisqu'on ne peux pas "trapper" d'évènements sur l'objet Application (Cela aurait été trop beau!!!).
    La ruse est d'avoir un formulaire de menu général, qui appelle tous les formulaires et états de l'application, et sur lequel on appelle les fonctions pour enregistrer la référence sur Ouverture et la libérer sur Fermeture avec des procédures isolées dans un module à part (pour ne pas avoir de problèmes d'erreur sur les Left, Right et autre Mid...)

    Par exemple, dans un module SysFunctions.Bas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Option Compare Database
    Option Explicit
     
    Public Sub LibererExcel()
        On Error Resume Next
        References.Remove References("Excel")
        On Error GoTo 0
    End Sub
     
    Public Sub ReferencerExcel()
        On Error Resume Next
        References.AddFromFile SysCmd(acSysCmdAccessDir) & "EXCEL.EXE"
        On Error GoTo 0
    End Sub
    Puis dans le formulaire frmMenuGénéral :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Form_Open(Cancel As Integer)
        ReferencerExcel
    End Sub
     
    Private Sub Form_Unload(Cancel As Integer)
        LibererExcel
    End Sub
    Bon, d'accord, c'est peu élégant et un peu bourrin... mais ça fonctionne.

  12. #12
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 169
    Points : 68
    Points
    68
    Par défaut
    ah rusé ! J'essaye et fais un retour.

    Merci pour les explications (limpide) et le tuyau

  13. #13
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 169
    Points : 68
    Points
    68
    Par défaut
    Je n'ai qu'un mot à dire....Bravo. Ca marche nickel
    Merci beaucoup, ça fait plusieurs jours que je tourne en rond avec ce problème.

    J'ai fait cela :
    Dans une macro Autoexec qui enchaîne RefInit et le menu principal
    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
    Public Function RefInit()
    On Error Resume Next
     
    ' Office 2003
        Application.References.AddFromGuid "{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}", 2, 3 ' Office 2003
        Application.References.AddFromGuid "{00020813-0000-0000-C000-000000000046}", 1, 5 ' Excel 2003
        Application.References.AddFromGuid "{00062FFF-0000-0000-C000-000000000046}", 9, 2 ' Outlook 2003
        Application.References.AddFromGuid "{00000300-0000-0010-8000-00AA006D2EA4}", 2, 8 ' ADOR 2003
    ' Office 2007
        Application.References.AddFromGuid "{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}", 2, 4 ' Office 2007
        Application.References.AddFromGuid "{00020813-0000-0000-C000-000000000046}", 1, 6 ' Excel 2007
        Application.References.AddFromGuid "{00062FFF-0000-0000-C000-000000000046}", 9, 3 ' Outlook 2007
        Application.References.AddFromGuid "{00000300-0000-0010-8000-00AA006D2EA4}", 6, 0 ' ADOR 2007
    ' Commun
        Application.References.AddFromGuid "{00025E01-0000-0000-C000-000000000046}", 5, 0 ' DAO
        Application.References.AddFromGuid "{00020430-0000-0000-C000-000000000046}", 1, 0 ' OLE2 ActiveX
     
    End Function
    Avec le bouton de sortie de l'application
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Sub RefDelete()
    ' Cette routine va être appelée à chaque évènement Form_Close()
    On Error Resume Next
     
        Application.References.Remove Application.References("Excel")
        Application.References.Remove Application.References("Outlook")
        Application.References.Remove Application.References("ADOR")
     
    End Sub

  14. #14
    Membre habitué Avatar de foste
    Inscrit en
    Octobre 2002
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 145
    Points : 127
    Points
    127
    Par défaut
    Bonjour,

    Je suis confrontée au meme probleme, et grace a vous, je l'ai solutionné.
    Enfin, jusqu'a ce que je veuille compiler ma base en mde.
    Access refuse car je pense, il trouve une erreur de compilation puisque au depart il manque la reference Excel.

    Avez-vous ce probleme aussi ou ai-je m....er quelque part?

    Merci

  15. #15
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Bonjour,

    Je pense que c'est surtout dû au fait que le fichier .mde est compilé et n'est plus modifiable.

    De fait, l'ajout d'une référence n'est plus possible.

    Domi2
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 197
    Points : 300
    Points
    300
    Par défaut
    Bonjour,

    il faut ajouter les références à la main avant de faire le mde c'est tout...

    Attention il faut faire le mde avec Access 2003 sinon c'est mort : on ne peux pas lancer un mde fait sous Access 2007 avec Access 2003...

  17. #17
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 169
    Points : 68
    Points
    68
    Par défaut
    Bonjour,
    avec un peu de retard,
    Je n'ai pas le problème car je sépare les data dans un .mde et les écrans requetes (...) dans une interface dans un .mdb.
    C'est d'autant plus important de faire comme cela que les tables temporaires ne peuvent pas se partager, de même que des requetes créées live.

    A+

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 21/11/2014, 09h10
  2. Problème aves les Cours php
    Par glooping dans le forum Langage
    Réponses: 16
    Dernier message: 15/02/2010, 18h34
  3. Changer les Références en fonction de la version Excel
    Par mpereg dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/04/2008, 13h53
  4. Problème raccourcis clavier selon version OS visual
    Par laville dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 07/02/2008, 14h24
  5. Réponses: 14
    Dernier message: 02/11/2006, 19h17

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