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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 169
    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 Expert
    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
    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 confirmé
    Inscrit en
    Mars 2008
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 169
    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 Expert
    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
    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 confirmé
    Inscrit en
    Mars 2008
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 169
    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 Expert
    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
    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

+ 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