Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème sur macro fermeture Excel

7 réponses
Avatar
Laurent
Bonjour,
J'ai un fichier qui utilise des fonctionnalités Outlook (olmail).
A l'ouverture j'installe donc la librairie Outlook qui va bien (mes
utilisateurs peuvent avoir des versions allant de Office 2000 à 2007).
Pour ne pas avoir de problème de compatibilité de librairie, à la fermeture
(Workbook_BeforeClose(Cancel As Boolean)) je désinstalle la librairie. Si
l'utilisateur a un message demandant d'enregistrer, s'il fait annuler, la
librairie se déinstalle, j'ai donc un message d'erreur s'il tente de
réutiliser l'envoir de mail.

Le même problème se pose sur des fichiers avec des ouvertures de barres
d'outils, je les désinstalle à la fermeture pour ne pas qu'elle "polue"
l'espace de travail.
Auriez vous une solution pour contrer le "Annuler" de l'enregistrement ou
pour activer ma macro seulement une fois qu'il a répondu oui ou non.
Aujourd'hui, la macro se déclenche avant.
Merci d'avance de vos réponses
Cordialement
Laurent

7 réponses

Avatar
Carim
Bonjour,

Pour tes objects initialement définis, il suffit de les vider ...

Set OutMail = Nothing
Set OutApp = Nothing

A +
Avatar
Laurent
Bonjour,
C'est déjà ce que je fait.
Mon problème est autre, pour utiliser les olmail, il faut installer les
références Outlook en VBA, donc à l'ouverture je choisis la librairie selon
la version d'Outlook :
Private Sub Workbook_Open()
'Installe la librairie Outlook pour gérer les envois de mail
'Installer la référence à la bibliothèque VBA Outlook
On Error Resume Next
ThisWorkbook.VBProject.References.Remove xObject
'Office 97
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOfficeMSOUTL8.OLB")
'Office 2000
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOfficeMSOUTL9.OLB")
'Office XP
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOfficeMSOUTL10.OLB")
'Office 2003
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOffice11MSOUTL.OLB")
'Office 2007
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOffice12MSOUTL.OLB")
'Si l'erreur est de type 1004, il faut modifier les paramètres de
sécurité d'Excel
If Err = 1004 Then
Msg = MsgBox("La librairie 'Outlook' n'est pas installée." & Chr(10)
& Chr(10) & "L'envoi de mail ne fonctionnera pas.", vbExclamation, "Erreur
Librairie Outlook")
End If
On Error GoTo 0
End Sub

Si la librairie Outlook 2003 est installé sur le document et qu'un autre
utilisateur ouvre le document alors qu'il a un Outlook2000, les macros ne
fonctionnent plus et dans "reférence" la librairie Outlook 11 est notée comme
manquante.
Pour cela à la fermeture je désinstalle la référence :
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Désinstalle la référence à la bibliothèque VBA Outlook si changement de
version à la réouverture
On Error Resume Next
Dim xObject
Set xObject = ThisWorkbook.VBProject.References.Item("Outlook")
ThisWorkbook.VBProject.References.Remove xObject
End Sub

Mon problème est que si l'utilisateur clique sur fermer par erreur et qu'au
moment d'enregistrer il fait "annuler" pour ne pas fermer le docuement, la
référence à la librairie se trouve enlever et donc mes macros ne
fonctionnent plus.

Je ne sais pas si je suis assez clair

Laurent


Bonjour,

Pour tes objects initialement définis, il suffit de les vider ...

Set OutMail = Nothing
Set OutApp = Nothing

A +



Avatar
zOrg2net
Bonjour Laurent,

Peut-être qu'en obligeant l'utilisateur à enregistrer avant de sortir, cela
serait une solution ?
Dans ce cas, dans ThisWorkBook taper ce petit code:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Select Case MsgBox("Voulez-Vous valider ce doc ?", 4)

Case 6 'Si on clique sur Oui
ActiveWorkbook.Save
Case 7 'Si on clique sur Non
Cancel = True
End Select

End Sub

zOrg2net


Bonjour,
C'est déjà ce que je fait.
Mon problème est autre, pour utiliser les olmail, il faut installer les
références Outlook en VBA, donc à l'ouverture je choisis la librairie selon
la version d'Outlook :
Private Sub Workbook_Open()
'Installe la librairie Outlook pour gérer les envois de mail
'Installer la référence à la bibliothèque VBA Outlook
On Error Resume Next
ThisWorkbook.VBProject.References.Remove xObject
'Office 97
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOfficeMSOUTL8.OLB")
'Office 2000
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOfficeMSOUTL9.OLB")
'Office XP
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOfficeMSOUTL10.OLB")
'Office 2003
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOffice11MSOUTL.OLB")
'Office 2007
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOffice12MSOUTL.OLB")
'Si l'erreur est de type 1004, il faut modifier les paramètres de
sécurité d'Excel
If Err = 1004 Then
Msg = MsgBox("La librairie 'Outlook' n'est pas installée." & Chr(10)
& Chr(10) & "L'envoi de mail ne fonctionnera pas.", vbExclamation, "Erreur
Librairie Outlook")
End If
On Error GoTo 0
End Sub

Si la librairie Outlook 2003 est installé sur le document et qu'un autre
utilisateur ouvre le document alors qu'il a un Outlook2000, les macros ne
fonctionnent plus et dans "reférence" la librairie Outlook 11 est notée comme
manquante.
Pour cela à la fermeture je désinstalle la référence :
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Désinstalle la référence à la bibliothèque VBA Outlook si changement de
version à la réouverture
On Error Resume Next
Dim xObject
Set xObject = ThisWorkbook.VBProject.References.Item("Outlook")
ThisWorkbook.VBProject.References.Remove xObject
End Sub

Mon problème est que si l'utilisateur clique sur fermer par erreur et qu'au
moment d'enregistrer il fait "annuler" pour ne pas fermer le docuement, la
référence à la librairie se trouve enlever et donc mes macros ne
fonctionnent plus.

Je ne sais pas si je suis assez clair

Laurent


Bonjour,

Pour tes objects initialement définis, il suffit de les vider ...

Set OutMail = Nothing
Set OutApp = Nothing

A +





Avatar
zOrg2net
P.S. Tu peux bien sûr coller tes codes sous le Case 6

zOrg2net


Bonjour Laurent,

Peut-être qu'en obligeant l'utilisateur à enregistrer avant de sortir, cela
serait une solution ?
Dans ce cas, dans ThisWorkBook taper ce petit code:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Select Case MsgBox("Voulez-Vous valider ce doc ?", 4)

Case 6 'Si on clique sur Oui
ActiveWorkbook.Save
Case 7 'Si on clique sur Non
Cancel = True
End Select

End Sub

zOrg2net


Bonjour,
C'est déjà ce que je fait.
Mon problème est autre, pour utiliser les olmail, il faut installer les
références Outlook en VBA, donc à l'ouverture je choisis la librairie selon
la version d'Outlook :
Private Sub Workbook_Open()
'Installe la librairie Outlook pour gérer les envois de mail
'Installer la référence à la bibliothèque VBA Outlook
On Error Resume Next
ThisWorkbook.VBProject.References.Remove xObject
'Office 97
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOfficeMSOUTL8.OLB")
'Office 2000
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOfficeMSOUTL9.OLB")
'Office XP
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOfficeMSOUTL10.OLB")
'Office 2003
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOffice11MSOUTL.OLB")
'Office 2007
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOffice12MSOUTL.OLB")
'Si l'erreur est de type 1004, il faut modifier les paramètres de
sécurité d'Excel
If Err = 1004 Then
Msg = MsgBox("La librairie 'Outlook' n'est pas installée." & Chr(10)
& Chr(10) & "L'envoi de mail ne fonctionnera pas.", vbExclamation, "Erreur
Librairie Outlook")
End If
On Error GoTo 0
End Sub

Si la librairie Outlook 2003 est installé sur le document et qu'un autre
utilisateur ouvre le document alors qu'il a un Outlook2000, les macros ne
fonctionnent plus et dans "reférence" la librairie Outlook 11 est notée comme
manquante.
Pour cela à la fermeture je désinstalle la référence :
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Désinstalle la référence à la bibliothèque VBA Outlook si changement de
version à la réouverture
On Error Resume Next
Dim xObject
Set xObject = ThisWorkbook.VBProject.References.Item("Outlook")
ThisWorkbook.VBProject.References.Remove xObject
End Sub

Mon problème est que si l'utilisateur clique sur fermer par erreur et qu'au
moment d'enregistrer il fait "annuler" pour ne pas fermer le docuement, la
référence à la librairie se trouve enlever et donc mes macros ne
fonctionnent plus.

Je ne sais pas si je suis assez clair

Laurent


Bonjour,

Pour tes objects initialement définis, il suffit de les vider ...

Set OutMail = Nothing
Set OutApp = Nothing

A +







Avatar
Laurent
Merci zOrg2net

C'est effectivement une bonne solution. Cela veut dire que s'ils décident de
fermer le document ils ne pourront pas faire machine arrière, le document
sera forcément fermer en enregistrant ou pas. Ca ne me satisfait que
moyenement.

Je vais parler de ma façon de travailler, j'enregistre très souvent mon
travail, donc à la fermeture si j'ai le message me demandant d'enregistrer ou
non j'ai un doute, dans ce cas j'aurais tendance à faire annuler pour
revérifier avant de fermer... et la ca ne serait pas possible.

Laurent



P.S. Tu peux bien sûr coller tes codes sous le Case 6

zOrg2net


Bonjour Laurent,

Peut-être qu'en obligeant l'utilisateur à enregistrer avant de sortir, cela
serait une solution ?
Dans ce cas, dans ThisWorkBook taper ce petit code:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Select Case MsgBox("Voulez-Vous valider ce doc ?", 4)

Case 6 'Si on clique sur Oui
ActiveWorkbook.Save
Case 7 'Si on clique sur Non
Cancel = True
End Select

End Sub

zOrg2net


Bonjour,
C'est déjà ce que je fait.
Mon problème est autre, pour utiliser les olmail, il faut installer les
références Outlook en VBA, donc à l'ouverture je choisis la librairie selon
la version d'Outlook :
Private Sub Workbook_Open()
'Installe la librairie Outlook pour gérer les envois de mail
'Installer la référence à la bibliothèque VBA Outlook
On Error Resume Next
ThisWorkbook.VBProject.References.Remove xObject
'Office 97
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOfficeMSOUTL8.OLB")
'Office 2000
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOfficeMSOUTL9.OLB")
'Office XP
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOfficeMSOUTL10.OLB")
'Office 2003
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOffice11MSOUTL.OLB")
'Office 2007
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOffice12MSOUTL.OLB")
'Si l'erreur est de type 1004, il faut modifier les paramètres de
sécurité d'Excel
If Err = 1004 Then
Msg = MsgBox("La librairie 'Outlook' n'est pas installée." & Chr(10)
& Chr(10) & "L'envoi de mail ne fonctionnera pas.", vbExclamation, "Erreur
Librairie Outlook")
End If
On Error GoTo 0
End Sub

Si la librairie Outlook 2003 est installé sur le document et qu'un autre
utilisateur ouvre le document alors qu'il a un Outlook2000, les macros ne
fonctionnent plus et dans "reférence" la librairie Outlook 11 est notée comme
manquante.
Pour cela à la fermeture je désinstalle la référence :
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Désinstalle la référence à la bibliothèque VBA Outlook si changement de
version à la réouverture
On Error Resume Next
Dim xObject
Set xObject = ThisWorkbook.VBProject.References.Item("Outlook")
ThisWorkbook.VBProject.References.Remove xObject
End Sub

Mon problème est que si l'utilisateur clique sur fermer par erreur et qu'au
moment d'enregistrer il fait "annuler" pour ne pas fermer le docuement, la
référence à la librairie se trouve enlever et donc mes macros ne
fonctionnent plus.

Je ne sais pas si je suis assez clair

Laurent


Bonjour,

Pour tes objects initialement définis, il suffit de les vider ...

Set OutMail = Nothing
Set OutApp = Nothing

A +









Avatar
zOrg2net
Bonjour Laurent,

Je reprends le fil, perdu à cause de mes activités.
Si tu testes ce code, tu verras que l'utilisateur n'a qu'un choix, celui
d'enregistrer le classeur, sinon il ne peut pas le fermer. Il ne peut pas
annuler non plus, c'est: oui, alors j'enregistre ou c'est non: alors je ne
sors pas du classeur. C'est assez hard, je sais.

zOrg2net


Merci zOrg2net

C'est effectivement une bonne solution. Cela veut dire que s'ils décident de
fermer le document ils ne pourront pas faire machine arrière, le document
sera forcément fermer en enregistrant ou pas. Ca ne me satisfait que
moyenement.

Je vais parler de ma façon de travailler, j'enregistre très souvent mon
travail, donc à la fermeture si j'ai le message me demandant d'enregistrer ou
non j'ai un doute, dans ce cas j'aurais tendance à faire annuler pour
revérifier avant de fermer... et la ca ne serait pas possible.

Laurent



P.S. Tu peux bien sûr coller tes codes sous le Case 6

zOrg2net


Bonjour Laurent,

Peut-être qu'en obligeant l'utilisateur à enregistrer avant de sortir, cela
serait une solution ?
Dans ce cas, dans ThisWorkBook taper ce petit code:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Select Case MsgBox("Voulez-Vous valider ce doc ?", 4)

Case 6 'Si on clique sur Oui
ActiveWorkbook.Save
Case 7 'Si on clique sur Non
Cancel = True
End Select

End Sub

zOrg2net


Bonjour,
C'est déjà ce que je fait.
Mon problème est autre, pour utiliser les olmail, il faut installer les
références Outlook en VBA, donc à l'ouverture je choisis la librairie selon
la version d'Outlook :
Private Sub Workbook_Open()
'Installe la librairie Outlook pour gérer les envois de mail
'Installer la référence à la bibliothèque VBA Outlook
On Error Resume Next
ThisWorkbook.VBProject.References.Remove xObject
'Office 97
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOfficeMSOUTL8.OLB")
'Office 2000
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOfficeMSOUTL9.OLB")
'Office XP
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOfficeMSOUTL10.OLB")
'Office 2003
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOffice11MSOUTL.OLB")
'Office 2007
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOffice12MSOUTL.OLB")
'Si l'erreur est de type 1004, il faut modifier les paramètres de
sécurité d'Excel
If Err = 1004 Then
Msg = MsgBox("La librairie 'Outlook' n'est pas installée." & Chr(10)
& Chr(10) & "L'envoi de mail ne fonctionnera pas.", vbExclamation, "Erreur
Librairie Outlook")
End If
On Error GoTo 0
End Sub

Si la librairie Outlook 2003 est installé sur le document et qu'un autre
utilisateur ouvre le document alors qu'il a un Outlook2000, les macros ne
fonctionnent plus et dans "reférence" la librairie Outlook 11 est notée comme
manquante.
Pour cela à la fermeture je désinstalle la référence :
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Désinstalle la référence à la bibliothèque VBA Outlook si changement de
version à la réouverture
On Error Resume Next
Dim xObject
Set xObject = ThisWorkbook.VBProject.References.Item("Outlook")
ThisWorkbook.VBProject.References.Remove xObject
End Sub

Mon problème est que si l'utilisateur clique sur fermer par erreur et qu'au
moment d'enregistrer il fait "annuler" pour ne pas fermer le docuement, la
référence à la librairie se trouve enlever et donc mes macros ne
fonctionnent plus.

Je ne sais pas si je suis assez clair

Laurent


Bonjour,

Pour tes objects initialement définis, il suffit de les vider ...

Set OutMail = Nothing
Set OutApp = Nothing

A +











Avatar
Laurent
Bonjour zOrg2net,
En fait j'ai fait une interprétation de ce qui pourrait être fait à partir
de ce code. Ce qui laisserait quand même une possibilité de ne pas
enregistrer ces modifications.

Laurent


Bonjour Laurent,

Je reprends le fil, perdu à cause de mes activités.
Si tu testes ce code, tu verras que l'utilisateur n'a qu'un choix, celui
d'enregistrer le classeur, sinon il ne peut pas le fermer. Il ne peut pas
annuler non plus, c'est: oui, alors j'enregistre ou c'est non: alors je ne
sors pas du classeur. C'est assez hard, je sais.

zOrg2net


Merci zOrg2net

C'est effectivement une bonne solution. Cela veut dire que s'ils décident de
fermer le document ils ne pourront pas faire machine arrière, le document
sera forcément fermer en enregistrant ou pas. Ca ne me satisfait que
moyenement.

Je vais parler de ma façon de travailler, j'enregistre très souvent mon
travail, donc à la fermeture si j'ai le message me demandant d'enregistrer ou
non j'ai un doute, dans ce cas j'aurais tendance à faire annuler pour
revérifier avant de fermer... et la ca ne serait pas possible.

Laurent



P.S. Tu peux bien sûr coller tes codes sous le Case 6

zOrg2net


Bonjour Laurent,

Peut-être qu'en obligeant l'utilisateur à enregistrer avant de sortir, cela
serait une solution ?
Dans ce cas, dans ThisWorkBook taper ce petit code:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Select Case MsgBox("Voulez-Vous valider ce doc ?", 4)

Case 6 'Si on clique sur Oui
ActiveWorkbook.Save
Case 7 'Si on clique sur Non
Cancel = True
End Select

End Sub

zOrg2net


Bonjour,
C'est déjà ce que je fait.
Mon problème est autre, pour utiliser les olmail, il faut installer les
références Outlook en VBA, donc à l'ouverture je choisis la librairie selon
la version d'Outlook :
Private Sub Workbook_Open()
'Installe la librairie Outlook pour gérer les envois de mail
'Installer la référence à la bibliothèque VBA Outlook
On Error Resume Next
ThisWorkbook.VBProject.References.Remove xObject
'Office 97
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOfficeMSOUTL8.OLB")
'Office 2000
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOfficeMSOUTL9.OLB")
'Office XP
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOfficeMSOUTL10.OLB")
'Office 2003
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOffice11MSOUTL.OLB")
'Office 2007
ThisWorkbook.VBProject.References.AddFromFile ("C:Program
FilesMicrosoft OfficeOffice12MSOUTL.OLB")
'Si l'erreur est de type 1004, il faut modifier les paramètres de
sécurité d'Excel
If Err = 1004 Then
Msg = MsgBox("La librairie 'Outlook' n'est pas installée." & Chr(10)
& Chr(10) & "L'envoi de mail ne fonctionnera pas.", vbExclamation, "Erreur
Librairie Outlook")
End If
On Error GoTo 0
End Sub

Si la librairie Outlook 2003 est installé sur le document et qu'un autre
utilisateur ouvre le document alors qu'il a un Outlook2000, les macros ne
fonctionnent plus et dans "reférence" la librairie Outlook 11 est notée comme
manquante.
Pour cela à la fermeture je désinstalle la référence :
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Désinstalle la référence à la bibliothèque VBA Outlook si changement de
version à la réouverture
On Error Resume Next
Dim xObject
Set xObject = ThisWorkbook.VBProject.References.Item("Outlook")
ThisWorkbook.VBProject.References.Remove xObject
End Sub

Mon problème est que si l'utilisateur clique sur fermer par erreur et qu'au
moment d'enregistrer il fait "annuler" pour ne pas fermer le docuement, la
référence à la librairie se trouve enlever et donc mes macros ne
fonctionnent plus.

Je ne sais pas si je suis assez clair

Laurent


Bonjour,

Pour tes objects initialement définis, il suffit de les vider ...

Set OutMail = Nothing
Set OutApp = Nothing

A +