Fermeture classeur & fenêtre d'enregistrement
Salut tout le monde,
J'avoue à la communauté que je la sollicite régulièrement mais je dirais qu'elle est là pour ça et qu'il faut bien apprendre
Voilà mon "problème", qui m'occupe depuis déjà trop longtemps :
- À partir d'un classeur A je transmet des valeurs dans un classeur B.
- Si ce classeur B est déjà ouvert, la macro ne le réouvre pas. Mais s'il ne l'est pas alors il s'ouvre.
- Ensuite, les valeurs du classeur A se copie dans le classeur B. Jusque là aucun soucis.
- Enfin si le classeur B était ouvert, il le reste. S'il était fermé alors il se ferme.
C'est à cette dernière étape que je rencontre un obstacle. En effet, quand le classeur se ferme car il était, la fenêtre me demandant si je veux enregistrer les modifications s'affiche. Or j'aimerai qu'elle n'apparaisse pas pour la fluidité de l'application.
Il est vrai que ma problématique paraît simple. Mais comme pour mes autres sujets j'ai effectué de longues heures de recherches et de nombreuses tentatives en vain.
Avec :
- application.DisplayAlerts = False (Aucun changement) ;
- Workbook().Close Savechanges:=False (Le classeur se met à charger et ensuite il ne répond plus).
Je précise que ma macro se lance quand l'utilisateur sauvegarde le fichier (classeur A).
Voici l'extrait de mon code :
Application.ScreenUpdating = False
On Error Resume Next
Workbooks(Fiche).Activate
If Err <> 0 Then
Workbooks.Open (Chemin)
Workbooks(Fiche).Sheets(doss).Range("F1") = Now()
Workbooks(Fiche).Sheets(doss).Range("T39") = FS
Workbooks(Fiche).Sheets(doss).Range("U39") = IJRP
Workbooks(Fiche).Sheets(doss).Range("V39") = TTE
Workbooks(Fiche).Sheets(doss).Range("W39") = TTR
Workbooks(Fiche).Sheets(doss).Range("X39") = TM
Workbooks(Fiche).Sheets(doss).Range("Y39") = SP
Workbooks(Fiche).Sheets(doss).Range("AA39") = MS
Workbooks(Fiche).Sheets(doss).Range("AB39") = STAG
Workbooks(Fiche).Sheets(doss).Range("AC39") = TPEM
Workbooks(Fiche).Sheets(doss).Range("AE39") = CAID
Workbooks(Fiche).Sheets(doss).Range("AF39") = PAN
Workbooks(Fiche).Sheets(doss).Range("AG39") = IT
Workbooks(Fiche).Sheets(doss).Range("T40") = MP
Workbooks(Fiche).Sheets(doss).Range("U40") = DSFP
Workbooks(Fiche).Sheets(doss).Range("V40") = AN
Workbooks(Fiche).Sheets(doss).Range("W40") = TH
Workbooks(Fiche).Sheets(doss).Range("X40") = TA
Workbooks(Fiche).Sheets(doss).Range("Y40") = TSAL
Workbooks(Fiche).Sheets(doss).Range("Z40") = FILL
Workbooks(Fiche).Sheets(doss).Range("AA40") = PRIM
Workbooks(Fiche).Sheets(doss).Range("AB40") = AT
Workbooks(Fiche).Sheets(doss).Range("AC40") = AUTR
Workbooks(Fiche).Sheets(doss).Range("AG40") = URSS
Workbooks(Fiche).Sheets(doss).Range("AD40") = HSUP
Workbooks(Fiche).Sheets(doss).Range("AE40") = CICE
Workbooks(Fiche).Sheets(doss).Range("AF40") = CITS
Workbooks(Fiche).Sheets(doss).Range("AH39") = DIV
Workbooks(Fiche).Sheets(doss).Range("AA26") = PASS
Workbooks(Fiche).Sheets(doss).Range("AA28") = ECO
Workbooks(Fiche).Sheets(doss).Range("A21") = avancement * 1
Workbooks(Fiche).Save
C'EST ICI QUE J'AIMERAI FERMER MON CLASSEUR.
Else
Workbooks(Fiche).Sheets(doss).Range("F1") = Now()
Workbooks(Fiche).Sheets(doss).Range("T39") = FS
Workbooks(Fiche).Sheets(doss).Range("U39") = IJRP
Workbooks(Fiche).Sheets(doss).Range("V39") = TTE
Workbooks(Fiche).Sheets(doss).Range("W39") = TTR
Workbooks(Fiche).Sheets(doss).Range("X39") = TM
Workbooks(Fiche).Sheets(doss).Range("Y39") = SP
Workbooks(Fiche).Sheets(doss).Range("AA39") = MS
Workbooks(Fiche).Sheets(doss).Range("AB39") = STAG
Workbooks(Fiche).Sheets(doss).Range("AC39") = TPEM
Workbooks(Fiche).Sheets(doss).Range("AE39") = CAID
Workbooks(Fiche).Sheets(doss).Range("AF39") = PAN
Workbooks(Fiche).Sheets(doss).Range("AG39") = IT
Workbooks(Fiche).Sheets(doss).Range("T40") = MP
Workbooks(Fiche).Sheets(doss).Range("U40") = DSFP
Workbooks(Fiche).Sheets(doss).Range("V40") = AN
Workbooks(Fiche).Sheets(doss).Range("W40") = TH
Workbooks(Fiche).Sheets(doss).Range("X40") = TA
Workbooks(Fiche).Sheets(doss).Range("Y40") = TSAL
Workbooks(Fiche).Sheets(doss).Range("Z40") = FILL
Workbooks(Fiche).Sheets(doss).Range("AA40") = PRIM
Workbooks(Fiche).Sheets(doss).Range("AB40") = AT
Workbooks(Fiche).Sheets(doss).Range("AC40") = AUTR
Workbooks(Fiche).Sheets(doss).Range("AG40") = URSS
Workbooks(Fiche).Sheets(doss).Range("AD40") = HSUP
Workbooks(Fiche).Sheets(doss).Range("AE40") = CICE
Workbooks(Fiche).Sheets(doss).Range("AF40") = CITS
Workbooks(Fiche).Sheets(doss).Range("AH39") = DIV
Workbooks(Fiche).Sheets(doss).Range("AA26") = PASS
Workbooks(Fiche).Sheets(doss).Range("AA28") = ECO
Workbooks(Fiche).Sheets(doss).Range("A21") = avancement * 1
Workbooks(Fiche).Save
Workbooks("Fiche " & doss & ".xlsm").Activate
End If
Application.ScreenUpdating = True
End Sub
Je n'utilise que des variables type String.
Je remercie par avance ceux qui se pencheront sur le problème.
Bonjour,
Essaies avec :
Workbooks(Fiche).Close Savechanges:=True
Au lieu de
Workbooks(Fiche).Save
Oui, c'est une solution que j'ai déjà essayer. Mais la fenêtre s'affiche quand même.
J'ai tenté de changer l'inscription de place dans la macro mais rien n'y fait parfois sa fait buger le fichier (ne répond pas).
J'espère trouver une solution sinon ce n'est pas quelque chose qui va empêcher mon application de fonctionner.
Merci quand même pour ta réponse.
Re,
Le problème vient peut-être d'ailleurs ....
Le gestionnaire d'erreur n'est pas rétabli : il manque On Error Goto 0
J'aurais écrit comme ça :
Sub xx()
Dim wbk As Workbook
Dim fermer As Boolean
Application.ScreenUpdating = False
On Error Resume Next
Set wbk = Workbooks(Fiche).Activate
On Error GoTo 0
If wbk Is Nothing Then
Set wbk = Workbooks.Open(Chemin)
fermer = True
End If
With wbk.Sheets(doss)
.Range("F1") = Now()
.Range("T39") = FS
.Range("U39") = IJRP
.Range("V39") = TTE
.Range("W39") = TTR
.Range("X39") = TM
.Range("Y39") = SP
.Range("AA39") = MS
.Range("AB39") = STAG
.Range("AC39") = TPEM
.Range("AE39") = CAID
.Range("AF39") = PAN
.Range("AG39") = IT
.Range("T40") = MP
.Range("U40") = DSFP
.Range("V40") = AN
.Range("W40") = TH
.Range("X40") = TA
.Range("Y40") = TSAL
.Range("Z40") = Fill
.Range("AA40") = PRIM
.Range("AB40") = AT
.Range("AC40") = AUTR
.Range("AG40") = URSS
.Range("AD40") = HSUP
.Range("AE40") = CICE
.Range("AF40") = CITS
.Range("AH39") = DIV
.Range("AA26") = PASS
.Range("AA28") = ECO
.Range("A21") = avancement * 1
End With
If fermer Then
wbk.Close True
Else
wbk.Save
Application.ScreenUpdating = True
End Sub
Oui, le problème vient sûrement d'ailleurs.
La macro que tu as produite fonctionne tout aussi bien que la mienne. Mais la fenêtre apparaît quand même et parfois le classeur ne répond plus.
Peut-être en inscrivant un code dans l'autre classeur cela pourrait fonctionner ?
En tout cas je te remercie pour ton aide rapide et efficace. On reconnaît bien le talent bordelais.
Re,
Si tu utilises un version Excel postérieure à 2007, le ScreenUpdating=False peut être la source du problème, essaye sans pour savoir.
Re,
J'utilise la version 2010, j'ai bien essayer quand même mais rien n'y change.
J'ai rentré les codes précédant dans le classeur qui se ferme, dans thisworkbook before close. Quand je le ferme manuellement, excel ne me demande pas si je veux enregistrer mais quand la macro s'en occupe alors là, excel me le demande.
C'est quand même un peu tiré par les cheveux ^^.
Bon je pense en rester là, ce n'est pas si important. Mais si jamais tu as une fulgurance, en tout cas merci pour ton aide.
Ah, mais le message concerne le classeur qui contient la macro, pas celui dans lequel les infos sont copiées !
Avant le End sub, ajoutes : ThisWorkbook.Saved = True
Nan nan, le message concerne bien le classeur dans lequel les donnée sont copiées. Sa m'affiche bien le nom de celui-ci et pas un autre. J'ai quand même essayer mais rien n'y fait il y a toujours cette foutu fenêtre.
Au lieu de résoudre le problème, y'a t'il pas un moyen de le contourner ?
Par exemple, est-il possible que ma macro exécute une macro présente dans le classeur récepteur des données ? Je suppose que oui ?.
On va bien finir par y arriver. Cela dit, pour du langage informatique il y'a quand même des choses qu'excel n'arrive pas à comprendre
Mets ton fichier en Pj (sans info confidentielles)
J'ai du supprimer beaucoup de choses à l'intérieur des fichiers. Mais rien qui ne peux compromettre ta réflexion !
Voilà, il y'a plusieurs macro un peu partout. Celle dont ont parler et dans le code de la feuille "SYNTHESE" de la FICHE.
Mes macro sont très mal ordonnée, je débute.
En espérant que tu puisse trouver une solution !
Re,
Je n'ai pas le temps de regarder en détail maintenant mais ta macro dans le code de la feuille synthèse ne peux pas fonctionner, c'est celle située dans le code de ThisWorkbook qui reçoit l'évènement.
Efface celle de la feuille synthèse et essaies les modifications que je t'avais proposé dans celle du module Thisworkbook. A priori c'est pour ça que tes modifications n'avait pas d'effet
Ok Monsieur ! J'ai pas la possibilité d'essayer avant demain. Je te tiens au courant. Merci.
C'est bon, sa fonctionne parfaitement ! Merci pour ton aide, c'est trop cool