[VB6 -> VBA] Problème de version excel.

FloVba Messages postés 27 Date d'inscription jeudi 19 avril 2012 Statut Membre Dernière intervention 8 août 2013 - 27 mars 2013 à 15:08
FloVba Messages postés 27 Date d'inscription jeudi 19 avril 2012 Statut Membre Dernière intervention 8 août 2013 - 8 août 2013 à 16:16
Bonjour à tous,

Je suis face à un problème dont j'ignore vraiment la cause , j'ai créer une application en VBA sous excel 2010 mais en enregistrant en .xls pour avoir une compatibilité avec des versions antérieurs.
Cette application est utilisé par une dizaine de personnes dans mon service sur plusieurs PC (avec certain PC encore sous Excel 2003).
Tout marchait à la perfection jusqu'à ce WE (pas de problème de compatibilité ou autre). Depuis samedi, j'ai l'impression que vba ne reconnait plus certaines instructions (la première que j'ai rapidement remarqué : "ActiveWorkbook.Close True "). Cette dernière analyse bien la commande .close mais ne prend pas en compte la demande d'enregistrement avec l'instruction "true" . Conséquence: une fenêtre apparaît pour demander si on souhaite enregistrer le fichier (ne marche pas non plus pour false...)

Je ne connais pas grand chose au librairy, add-in ou autre mais je pense que le problème vient de ça... J'ai demandé si il y avait eu une mise a jour quelconque sur les systèmes mais je n'ai pas eu de réponse convaincante, je continue de chercher de ce coté.
Si quelqu’un voit d'où peut venir le problème il me sauve!

Merci d'avoir lu ce problème, en espérant que des lumières naissent de vos têtes!

Cordialement,

Florent

17 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
27 mars 2013 à 17:53
Cette application est utilisé par une dizaine de personnes dans mon service

La valeur (True ou False) donnée à l'argument SaveChanges de la méthode Close étant ignorée si le classeur concerné est par ailleurs affiché dans d'autres fenêtres ouvertes.
Il est probable que tel soit la cause de ce que tu observes.

PS : peux-tu s'il te plait prendre soin (c'est important) d'ouvrir dans la section Langages dérivés > VBA tes discussions concernant VBA ? Tu es ici dans la section :
Forum > Visual Basic 6
non concernée par ce que tu exposes.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
27 mars 2013 à 18:27
Ce qui est très probable, pour être encore plus précis, c'est qu'une seconde instance de ce classeur a été ouverte dans une autre fenêtre. Si tel est bien le cas, elle l'a probablement été en lecture seule, mais peu importe.
Si, depuis cette fenêtre-là, est lancée l'exécution de :
ActiveWorkbook.Close True

True sera totalement ignoré et tu verras apparaître une fenêtre de dialogue qui te permettrait d'enregistrer ailleurs que dans le répertoire du classeur.
Une feinte existe, mais alors sans sauvegarde des modifs (logique de ne pas la permettre puisqu'en lecture seule, hein).
T'en dire plus ici sur cette feinte serait solution perdue pour d'autres (puisque l'on n'est pas ici dans la section VBA).
Je ne t'en parlerai donc plus précisément que lorsque cette discussion aura été déplacée par un administrateur bienveillant.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
27 mars 2013 à 19:38
Ah ! Merci à l'administrateur qui a bien voulu déplacer.
La feinte est celle dont j'ai parlé dans cette discussion :
Tapez le texte de l'url ici.
Elle consiste à "raconter" à Excel que le classeur a été sauvegardé (utilisation de la propriété Saved).
Comme je l'exposais dans la discussion de référence, l'utilisation de l'inhibition des messages d'alerte est maladroite . Dans le cas présent, elle ne serait pas seulement maladroite, mais bel et bien vaine, puisque la fenêtre d'enregistrement affichée n'est pas une alerte, mais une boîte de dialogue.

Suggestion et commentaires ===>>>
 With ActiveWorkbook
    If .ReadOnly Then ' si on est dans le cas d'une seconde instance (ouverte donc en lecture seule)
      .Saved = True ' on dit que les modifs ont déjà été effectuées (mensonge honorable)
      .Close ' et on ferme
    Else ' on est dans la première instance (donc modifiable)
      .Close True ' on ferme en sauvegardant (par True) ou sans sauvegarder (par False
    End If
  End With


Dis-nous.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
27 mars 2013 à 19:39
Corriger le commentaire :
'on dit que les modifs ont déjà été effectuées sauvegardées (mensonge honorable)


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0

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

Posez votre question
FloVba Messages postés 27 Date d'inscription jeudi 19 avril 2012 Statut Membre Dernière intervention 8 août 2013
28 mars 2013 à 10:32
Bonjour ucfoutu,
D'abord un grand merci d'avoir prêter attention à mon problème (et merci au modérateur d'avoir déplacer ce sujet, j'avais essayer de le placer au mieux mais je n'avais pas trouvé la section vba).
Je pense malheureusement que la piste que tu évoques n'est pas une solution pour moi.

Je vais donner plus de détails pour que vous compreniez.
L'application que j'ai crée se compose d'un fichier "mère" qui est en lecture seul et qui va interagir avec une quinzaine d'autre fichiers excel. Les modifications ne se font donc que sur les fichiers annexes. Les fichiers annexes sont ouvert une fraction de seconde et ne sont ouvert que si personne d'autre les utilisent (si le fichier est déjà ouvert, on attend deux secondes avant de réessayer et si c'est toujours ouvert on affiche un message d'erreur)

Autre indice qui me fait douté: avec excel 2010 tout marche parfaitement...

Merci quand même pour votre solution je l'utiliserais pour un autre projet :D
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 mars 2013 à 10:51
1) Une "fraction de seconde" reste une durée, hein ...
2)
avec excel 2010 tout marche parfaitement...

je n'ai pas Excel 2010, mais il n'est pas impossible qu'il gère différemment, tout simplement, les fichiers partagés.

Mais procède donc à une vérification toute bête, sur machine avec 2003 ou 2007 :
ajoute tout simplement ce code :
If ActiveWorkbook.ReadOnly Then msgbox "appelez vite Florent"

Et laisse les utilisateur travailler comme ils le font d'habitude. Laisse cette expérience tourner ainsi quelque temps.
Si l'un d'entre eux te signale l'affichage de ce message, ===>> j'avais raison.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
FloVba Messages postés 27 Date d'inscription jeudi 19 avril 2012 Statut Membre Dernière intervention 8 août 2013
28 mars 2013 à 11:01
Hello,
Merci de répondre si rapidement!

J'ai insérer le code dans un fichier qui est tous le temps utilisé. Il sera ouvert entre 5 et 10 fois aujourd’hui.

Par contre j'avais fait un test: créer un nouveau fichier vierge et écrire juste:

Sub essaifermeture()
ActiveWorkbook.Close True
End Sub


conclusion:
Office 2010: fonctionne
Office 2003: boite de dialogue "souhaitez vous enregistrer ce fichier" yes/no/cancel
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 mars 2013 à 13:09
Par contre j'avais fait un test: créer un nouveau fichier vierge et écrire juste:

C'est Normal, tant que le fichier n'a JAMAIS encore été enregistré !
Il n'est encore NULLE PART et Excel ne sait pas encore de ce que tu veux en faire !
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
28 mars 2013 à 13:30
Es-tu certain que le ActiveWorkbook (fichier actif ou à l'écran) est bien celui que tu veux enregistrer lorsque ce bout de code est appelé ?


MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
FloVba Messages postés 27 Date d'inscription jeudi 19 avril 2012 Statut Membre Dernière intervention 8 août 2013
28 mars 2013 à 13:50
C'est Normal, tant que le fichier n'a JAMAIS encore été enregistré !

Vierge mais enregistrer sur le bureau, sinon je suis d'accord avec toi dans les 2 cas il te demande si tu souhaites l'enregistrer.


Bonjour MPi,
Es-tu certain que le ActiveWorkbook (fichier actif ou à l'écran) est bien celui que tu veux enregistrer lorsque ce bout de code est appelé ?

J'en suis sur dans le sens ou je n'ai pas changer le code et que du jour au lendemain cela ne fonctionne plus. Je suis allé sur les PC " à problème" et en déroulant pas à pas, lorsque la boite de dialogue s'ouvre pour demander si on souhaite enregistrer c'est bien le fichier que je souhaite qui est sélectionné dans la barre des taches.

@ ucfoutu : Toujours sur un des PC "à problème" j'ai réessayé donc en relançant le programme cela ouvre automatiquement le fichier dans lequel j'ai placé le code:
If ActiveWorkbook.ReadOnly Then msgbox "appelez vite Florent"

Je n'ai pas eu le message...

merci pour les idées
0
FloVba Messages postés 27 Date d'inscription jeudi 19 avril 2012 Statut Membre Dernière intervention 8 août 2013
29 mars 2013 à 15:11
Vous ne pensez pas que cela pourrait être un problème de librairy?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 mars 2013 à 15:29
Vous ne pensez pas que cela pourrait être un problème de librairy?

Je ne le crois pas, non.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 mars 2013 à 15:39
Je n'ai pas de version 2003 sous la main, mais je viens de le vérifier sur le Net.
VBA 2003 connait la propriété Saved et elle a les mêmes effets : si = True, ne demande alors aucune sauvegarde (pour autant, comme dit plus haut, que le classeur soit déjà sur le disque dur; qu'il ait donc fait l'objet d'un enregistrement précédent)


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
FloVba Messages postés 27 Date d'inscription jeudi 19 avril 2012 Statut Membre Dernière intervention 8 août 2013
29 mars 2013 à 15:44
J'ai eu le service informatique, il avait déjà eu ce problème mais la personne été incapable de me dire d'où cela venait et quoi faire... Il demande autour de lui et me recontacte dès qu'il a plus d'info.

Je vous tiendrais au courant, pour le moment j'ai passé les PC sur Office 2010, ça fonctionne... mais jusqu'à quand?!
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 mars 2013 à 15:49
j'ai passé les PC sur Office 2010, ça fonctionne.

Je te l'ai dit plus haut :
--- 1) il se peut que la version 2010 gère différemment le partage (je n'en sais rien, n'ayant pas cette version)
--- 2) c'est à l'usage long, que tu pourras être assuré de ce que toutes les circonstances possibles ont été testées.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
FloVba Messages postés 27 Date d'inscription jeudi 19 avril 2012 Statut Membre Dernière intervention 8 août 2013
29 mars 2013 à 17:03
J'ai eu le service informatique, il avait déjà eu ce problème mais la personne été incapable de me dire d'où cela venait et quoi faire... Il demande autour de lui et me recontacte dès qu'il a plus d'info.

Je vous tiendrais au courant, pour le moment j'ai passé les PC sur Office 2010, ça fonctionne... mais jusqu'à quand?!
0
FloVba Messages postés 27 Date d'inscription jeudi 19 avril 2012 Statut Membre Dernière intervention 8 août 2013
8 août 2013 à 16:16
Pour information si jamais certains on le même problème que j'ai rencontré.
J'ai retrouvé le problème sous Windows Seven et Office 2010...
J'ai essayé un truc tout simple et ça a fonctionné...
au lieu de :
ActiveWorkbook.close true

J'ai mis :
ActiveWorkbook.save
ActiveWorkbook.close

.... est ça fonctionne...
(j'ai vu d'autre solution sur le net avec des "IfModified"... mais ma solution me suffit)

Bon courage!
0
Rejoignez-nous