Compatibilité macro vba excel 2003 vers 2010

debutVBAEXCEL Messages postés 32 Date d'inscription lundi 16 janvier 2012 Statut Membre Dernière intervention 6 février 2012 - 16 janv. 2012 à 13:31
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 17 janv. 2012 à 10:37
Bonjour à tous et à toutes.



Donc je tente d'accèder aux données d'un fichier excel nommé "monClasseur.xls" qui sous Excel 2010 à un message demandant le mot de passe de ce fichier Excel.


La même manipulation via la fonction ci -dessous établie sous excel 2003 ouvre le fichier sans demander le mot de passe.
c'est donc une macro qui, normalement, ouvre le fichier "mpnClasseur.xls" et renseigne le mot de passe automatiquement(en parametre) par consequent cette macro bug sous Excel 2010.

Que faudrait-il changer dans le code pour régler cela??

On Error Resume Next
    Workbooks(monClasseur).Activate
    If Err.Number <> 0 Then
        Err.Clear
        rep= False
        Application.StatusBar = "Ouverture de la base Hibiscus choisie"
        Workbooks.Open Filename:=Chemin_serveur & monClasseur, Password:=motdepasse
        If Err.Number <> 0 Then
          Affiche = "il y a un probleme avec  " &monClasseur& Chr(10) & Chr(10) 
                         MsgBox( Affiche )
            Application.StatusBar = False
            End
        End If
    Else
        rep = True
    End If




Merci à tous et à toutes

19 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 228
16 janv. 2012 à 14:54
Bonjour,

commence par enlever ce "on error resume next" et dis-nous le message d'erreur reçu ensuite, éventuellement !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
16 janv. 2012 à 15:01
Salut

Pas de modif notoire dans la méthode d'ouverture de classeur entre les versions 2003 et 2010.
Essayes-tu d'ouvrir un classeur au format 2003 sous 2010 ?
Le classeur que tu appelles contient-il des macros ?
Penser à regarder le niveau de sécurité des macros.

Sans vouloir trahir des informations personnelles, as-tu vérifié que Chemin_serveur et monClasseur étaient correctement orthographiés.
Y a t-il bien un / de séparation entre ces deux variables ?
Qu'aucune de ces variables ne comporte de virgule ?
Je te conseille d'utiliser des " pour encadrer le chamin et le nom du fichier :
Workbooks.Open Filename:="""" & Chemin_serveur & monClasseur & """", _
               Password:=motdepasse

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
debutVBAEXCEL Messages postés 32 Date d'inscription lundi 16 janvier 2012 Statut Membre Dernière intervention 6 février 2012
16 janv. 2012 à 15:25
Bonjour ucfoutu,Bonjour Jack et salut à tous et à toutes

Pour ucfoutu :
Lorsque je retire le On error Resume Next , Erreur d'execution 9 il m'affiche l'indice n'appartient pas à la selection.


Pour Jack :
Essayes-tu d'ouvrir un classeur au format 2003 sous 2010 ?
Oui tout à fait.
Oui,j'ai bien verifie et l'orthographe est Ok vu que sous 2003 cela fonctionne sans probleme

En fait sous 2003 ,lorsqu'on appelle la fonction codé ci dessous,cela s'ouvre directement car le mot de passe est renseigné automatiquement(passé en paramètre)

Mais sous 2010,on demande de saisir un mot de passe,d'ou le bug..

Donc quand j'execute la fonction sous 2010 il rentre dans ce if

If Err.Number <> 0 Then
Affiche = "il y a un probleme avec " &monClasseur& Chr(10) & Chr(10)

msgbox Affiche
et m'affiche donc le message Affiche .

Mais des que j'enleve Workbooks(monClasseur).Activate ,il rentre plus dans le If et tout semble etre OK

j'avouerai que je comprends pas trop comment se fait -il qu'en enlevant cela Workbooks(monClasseur).Activate,tout semble etre OK...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 228
16 janv. 2012 à 15:58
Déjà, de toutes manières :
ton erreur 9 est inévitablement générée par cette ligne,
Workbooks(monClasseur).Activate

puisque monClasseur, non encore ouvert, n'appartient pas encore à la collection WorkBooks !
Supprime donc cette ligne également, relance et dis-nous si autre erreur !
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
16 janv. 2012 à 16:02
... et mets des " devant et derrière ton chemin-fichier
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
16 janv. 2012 à 16:11
ucfoutu : c'est justement fait pour cela : Si erreur, alors il ouvre le classeur.
Méthode peu orthodoxe, mais ça fonctionne ... à condition de ne pas laisser le On Error Resume Next actif ensuite.

La véritable méthode consiste à appeler un chat, un chat :
Dim oClasseur As WorkBook
Set oClasseur = Workbooks(monClasseur)
If oClasseur Is Nothing Then
    ' Ouverture 
    ' (tu noteras l'utilisation de parenthèses dans ce cas)
    Set oClasseur = Workbooks.Open (Filename:= ...)
End If
et ensuite, travailler avec l'objet oClasseur et pas le ActiveWorkbook qui peut toujours être un problème au cas où l'utilisateur joue de la souris pendant l'exécution de la macro.
Dans ce cas, il vaut mieux définir oClasseur dans la partie déclarations de la page de code (en Private ou Public selon l'étendue souhaitée) afin que les autres macros y aient accès.
0
debutVBAEXCEL Messages postés 32 Date d'inscription lundi 16 janvier 2012 Statut Membre Dernière intervention 6 février 2012
16 janv. 2012 à 16:15
Re ucfoutu ,

En retirant la ligne Workbooks(monClasseur).Activate ,il n' y a plus d'erreur effectivement.


Mais par contre Dans ce If

 If Err.Number <> 0 Then
        Err.Clear
        rep= False
        Application.StatusBar = "Ouverture de la base Hibiscus choisie"
        Workbooks.Open Filename:=Chemin_serveur & monClasseur, Password:=motdepasse


j'ai ajouté apres le WorkBooks.open

cette ligne MsgBox "Ceci est un message test pour indiquer que le classeur est ouvert " qui ne s'affiche pas,cela implique la qu'il n'ouvre pas du tout le classeur ??

On y est presque mais moi je vois pas snif..
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 228
16 janv. 2012 à 16:23
il est clair que si tu subordonnes l'ouverture de ton classeur monClasseur à l'existence d'une erreur qui n'est plus là, l'ouverture ne sera même pas demandée !
supprime donc cette condition If !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
16 janv. 2012 à 16:31
Pour la 3ème fois, je te dis qu'il faut mettre des " pour encadrer le nom de ton fichier.
As-tu fait l'essai ?
0
debutVBAEXCEL Messages postés 32 Date d'inscription lundi 16 janvier 2012 Statut Membre Dernière intervention 6 février 2012
16 janv. 2012 à 16:44
Re,

En Changeant la condition If Err.Number <> 0 Then par
If Err.Number = 0,il rentre dans le If et affiche apres le WorksBooks.open
MsgBox "le classeur est ouvert"

Et en ajoutant un ON error Resume next apres la 2 eme condition
On Error Resume Next
If Err.Number <> 0 Then
Il ne rentre plus dedans...


c'est du bricollage mais j'ai l'impression que ca marche sans vraiment y comprendre quelque chose

On Error GoTo 0
 On Error Resume Next
   'Workbooks(monClasseur).Activate 'cette ligne de code est en commentaire

   Application.DisplayAlerts = False
    

    If Err.Number = 0 Then
       MsgBox "On est dans le IF "
       
      Err.Clear
        rep= False
        Application.StatusBar = "Ouverture de la base Hibiscus choisie"
        Workbooks.Open Filename:=Chemin_serveur & monClasseur, Password:=motdepasse
           Application.DisplayAlerts = True
        MsgBox "le classeur est ouvert"
    
     
         On Error Resume Next
        If Err.Number <> 0 Then
            msg = "ATTENTION : problème avec la base " & Base_Hibiscus_reelle & Chr(10) & Chr(10) _
                    & "Merci de contacter le SVP en lui précisant le contexte où vous vous trouvez"
            Style = vbOKOnly + vbCritical + vbDefaultButton1
            Title = "       Message d'erreur"
            reponse = MsgBox(msg, Style, Title)
            Application.StatusBar = False
          
        End If
        
        
    Else
        flag_base_en_ligne = True
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 228
16 janv. 2012 à 16:46
Oui, c'est du bricolage.
Jack t'a donné plus haut une solution bien plus élégante, non ?

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 228
16 janv. 2012 à 17:02
ceci étant dit, tant la solution de jack que l'éventuelle utilisation de la fonction GetObject (les deux méthodes) obligent à une gestion d'erreur également.
Si tu veux éviter toute gestion de l'espèce, voilà un petit exemple bâclé (que je viens de tester)

Dim monclasseur As String, déja As Boolean, el As Workbook
  monclasseur = "saisie4.xlsm"
  For Each el In Workbooks
    If el.Name monclasseur Then deja True
  Next
  If deja Then
    MsgBox "déjà ouvert"
  Else
    MsgBox "pas ouvert"
    ' tes instructions d'ouverture ici
  End If



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
debutVBAEXCEL Messages postés 32 Date d'inscription lundi 16 janvier 2012 Statut Membre Dernière intervention 6 février 2012
16 janv. 2012 à 17:05
Re Jack,

Oups désolé je suis passé deux fois au travers de ta proposition...oui lieu de le mettre en parametre je viens de tester la meme chose en mettant les cotes,mais visiblement c'est la meme chose...

Que penses tu du petit bricolage que j'ai testé

Merci à toi en tout cas
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 228
16 janv. 2012 à 17:47
jack semble être occupé ailleurs, debutVBAEXCEL

1) Le code que tu montres là ne me plait personnellement pas. As-tu lu mon dernier message à ce sujet ?
La méthode qu'il te propose fonctionne. Elle a un tout petit inconvénient, toutefois (si par malheur un autre classeur de ce nom d'un autre répertoire était ouvert). Si tu risques d'être dans ce cas, je te proposerai (je voulais l'éviter car tu débutes) une autre méthode encore (utilisant une fonction de l'API de windows) qui, elle, examine le chemin complet.
2) ton code m'inquiète par ailleurs car j'y lis, dès sa première ligne, un "on error goto 0" qui donne à penser que tu as également géré une erreur plus haut et que ton code est truffé de ce genre de traitement, rarement tout-à-fait justifié.



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
debutVBAEXCEL Messages postés 32 Date d'inscription lundi 16 janvier 2012 Statut Membre Dernière intervention 6 février 2012
17 janv. 2012 à 10:17
Bonjour,

J'ai testé la méthode de Jack mais visiblement cela ne change rien ..

Par contre ,j'ai testé ceci ci dessous en affichant les valeurs des variables locales:
et j'ai trouvé a la fin de l'execution de la fonction
monClasseur.xls = Vide
mot de passe = vide
chemin = vide

c'est à n'y rien comprendre sous 2003 tout est ok
et sous 2010 les 3 valeurs sont a vides c'est pour ca que le classeur s'ouvre pas...

Mais je n'ai aucune idée comment solutionner ce probleme?

Quelqu'un aurait une idée??


Sub testDeLaMacro()


 On Error Resume Next
    Workbooks("monClasseur.xls").Activate
    If Err.Number <> 0 Then
        Err.Clear
        flag_base_en_ligne = False
        Application.StatusBar = "Ouverture de la base Hibiscus choisie"
        Workbooks.Open Filename:="Chemin" & "" & "monClasseur.xls", Password:=motdepasse   

        'Message test     
        MsgBox "Ceci est un message test pour indiquer que le classeur est ouvert "
        
        If Err.Number <> 0 Then
            msg = "ATTENTION : problème avec la base " & Base_Hibiscus_reelle & Chr(10) & Chr(10) _
                    & "Merci de contacter le SVP en lui précisant le contexte où vous vous trouvez"
            Style = vbOKOnly + vbCritical + vbDefaultButton1
            Title = "       Message d'erreur"
            reponse = MsgBox(msg, Style, Title)
            Application.StatusBar = False
            End
        End If
    Else
        flag_base_en_ligne = True
    End If


End Sub
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 228
17 janv. 2012 à 10:23
tu devrais alors vite relire MSDN sur la portée des variables !
tu n'as pas déclaré tes variables convenablement et elles ne sont pas accédées par ta procédure !

Et je vois que tu continues avec un code de bidouillage (ton propre mot) en dépit de nos efforts !

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 228
17 janv. 2012 à 10:28
Et cela est maintenant le pire :
Workbooks.Open Filename:="Chemin" & "" & "monClasseur.xls", Password:=motdepasse

tu n'utilises alors plues les variables, mais carrément des chaines de caractères, ce qui fait que tu cherches à ouvrir un ficheir dont le chemin serait (textuellement) :*
"chemin\monclasseur.xls"
C'est une plaisanterie ?

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
debutVBAEXCEL Messages postés 32 Date d'inscription lundi 16 janvier 2012 Statut Membre Dernière intervention 6 février 2012
17 janv. 2012 à 10:31
Bonjour ucfoutu,

J'ai juste testé cela en faisant un copier-coller afin de voir les valeurs des variables.

Mais Effectivement le code n'est pas propre c'est pour cela que je suis en train de le re-prog..

Par contre c'est ce que je me disais,tu as raison ,a mon avis va falloir mettre des variables public ..

Mais je t'avouerai la ou je seche pourquoi sous 2003,sans rien changer à la portée des variables la macro tourne bien et sous 2010 cela plante.??
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 228
17 janv. 2012 à 10:37
Mais je t'avouerai la ou je seche pourquoi sous 2003,sans rien changer à la portée des variables la macro tourne bien et sous 2010 cela plante.??

M'étonnerait beaucoup !
Mais si tu insistes : mets à notre disposition ce fameux classeur 2003 ! et on y trouvera vite fait bien fait le "pourquoi" !
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0