Débutant total bloqué sur message "nom ambigu detecte Workbook_BeforeClose"

guigui971

XLDnaute Junior
Bonjour à tous,
Moi qui me débrouille pas mal en EXCELL, j'essaye de me mettre aux macros...
Et là je me trouve vraiment nul! Sauvez-moi!

J'ai pu en mettre en place une première macro en suivant pas à pas ce que j'ai trouvé sur le site "VBA Express".
Ainsi je me retrouve avec dans ThisWorkbook les lignes suivantes :

Option Explicit
Private Sub Workbook_Activate()
Call ToggleCutCopyAndPaste(False)
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call ToggleCutCopyAndPaste(True)
End Sub
Private Sub Workbook_Deactivate()
Call ToggleCutCopyAndPaste(True)
End Sub
Private Sub Workbook_Open()
Call ToggleCutCopyAndPaste(False)
End Sub
Option Explicit

Jusque là tout marche impec.
Mais, lorsque je veux ajouter une autre macro, on me dit de coller son code également dans ThisWorkbook.
Donc je colle à la suite de ce qui est ci-dessus :
Option Explicit
Const WelcomePage = "Macros"
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Turn off events to prevent unwanted loops
Application.EnableEvents = False
'Evaluate if workbook is saved and emulate default propmts
With ThisWorkbook
If Not .Saved Then
Select Case MsgBox("Do you want to save the changes you made to '" & .Name & "'?", _
vbYesNoCancel + vbExclamation)
Case Is = vbYes
'Call customized save routine
Call CustomSave
Case Is = vbNo
'Do not save
Case Is = vbCancel
'Set up procedure to cancel close
Cancel = True
End Select
End If
'If Cancel was clicked, turn events back on and cancel close,
'otherwise close the workbook without saving further changes
If Not Cancel = True Then
.Saved = True
Application.EnableEvents = True
.Close savechanges:=False
Else
Application.EnableEvents = True
End If
End With
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'Turn off events to prevent unwanted loops
Application.EnableEvents = False
'Call customized save routine and set workbook's saved property to true
'(To cancel regular saving)
Call CustomSave(SaveAsUI)
Cancel = True
'Turn events back on an set saved property to true
Application.EnableEvents = True
ThisWorkbook.Saved = True
End Sub
Private Sub Workbook_Open()
'Unhide all worksheets
Application.ScreenUpdating = False
Call ShowAllSheets
Application.ScreenUpdating = True
End Sub
Private Sub CustomSave(Optional SaveAs As Boolean)
Dim ws As Worksheet, aWs As Worksheet, newFname As String
'Turn off screen flashing
Application.ScreenUpdating = False
'Record active worksheet
Set aWs = ActiveSheet
'Hide all sheets
Call HideAllSheets
'Save workbook directly or prompt for saveas filename
If SaveAs = True Then
newFname = Application.GetSaveAsFilename( _
fileFilter:="Excel Files (*.xls), *.xls")
If Not newFname = "False" Then ThisWorkbook.SaveAs newFname
Else
ThisWorkbook.Save
End If
'Restore file to where user was
Call ShowAllSheets
aWs.Activate
'Restore screen updates
Application.ScreenUpdating = True
End Sub
Private Sub HideAllSheets()
'Hide all worksheets except the macro welcome page
Dim ws As Worksheet
Worksheets(WelcomePage).Visible = xlSheetVisible
For Each ws In ThisWorkbook.Worksheets
If Not ws.Name = WelcomePage Then ws.Visible = xlSheetVeryHidden
Next ws
Worksheets(WelcomePage).Activate
End Sub
Private Sub ShowAllSheets()
'Show all worksheets except the macro welcome page
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If Not ws.Name = WelcomePage Then ws.Visible = xlSheetVisible
Next ws
Worksheets(WelcomePage).Visible = xlSheetVeryHidden
End Sub​

Et c'est là que çà merdoie puisque lorsque je veux sauvegarder, j'ai un message d'erreur qui me dit
"erreur de compilation nom ambigu detecte Workbook_BeforeClose"

J'ai bien compris que le problème vient d'une redondance dans mes 2 groupes de codes, mais vu que je n'y connais rien, je fais appel aux spécialistes.

Merci d'avance et bonne soirée.
 

Fred0o

XLDnaute Barbatruc
Re : Débutant total bloqué sur message "nom ambigu detecte Workbook_BeforeClose"

Bonsoir guigui971 et bienvenue sur le forum.

Remplace tes 2 Sub "WorkBook_BeforeClose par Celle-ci qui combine les 2 précedentes :
VB:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call ToggleCutCopyAndPaste(True)
    'Turn off events to prevent unwanted loops
    Application.EnableEvents = False
    'Evaluate if workbook is saved and emulate default propmts
    With ThisWorkbook
        If Not .Saved Then
            Select Case MsgBox("Do you want to save the changes you made to '" & .Name & "'?", _
                vbYesNoCancel + vbExclamation)
                Case Is = vbYes
                'Call customized save routine
                Call CustomSave
                Case Is = vbNo
                'Do not save
                Case Is = vbCancel
                'Set up procedure to cancel close
                Cancel = True
            End Select
        End If
        'If Cancel was clicked, turn events back on and cancel close,
        'otherwise close the workbook without saving further changes
        If Not Cancel = True Then
            .Saved = True
            Application.EnableEvents = True
            .Close savechanges:=False
        Else
            Application.EnableEvents = True
        End If
    End With
End Sub

A+
 

ya_v_ka

XLDnaute Impliqué
Re : Débutant total bloqué sur message "nom ambigu detecte Workbook_BeforeClose"

Hello

Si j'ai bien compris tu te retrouves avec 2 Worksheet_BeforeClose.

Il faut simplement essayer de les grouper dans la même procédure afin de n'en avoir qu'1...

Ya'v

Edit: Bon bin trop lent le Ya'v... !
 

guigui971

XLDnaute Junior
Re : Débutant total bloqué sur message "nom ambigu detecte Workbook_BeforeClose"

Salut,
Merci beaucoup pour cette réponse ultra réactive.
Mais je te rappelle que je débute à 0,1%
Si je te comprends bien, dans tout mon cumul de code, dès que j'ai "WorkBook_BeforeClose" je met à la place tout le code que tu me donnes?
Merci encore
 

Fred0o

XLDnaute Barbatruc
Re : Débutant total bloqué sur message "nom ambigu detecte Workbook_BeforeClose"

Bonsoir YaV, guigui,

En fait, tu supprimes le 1° code :
VB:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call ToggleCutCopyAndPaste(True)
End Sub


Ensuite, tu copies cette ligne :
VB:
Call ToggleCutCopyAndPaste(True)

juste derrière le prochain
VB:
Private Sub Workbook_BeforeClose(Cancel As Boolean)

Et tu n'auras plus cette erreur. Mais peut-être en auras-tu une autres, chaque chose en son temps...

A+
 

guigui971

XLDnaute Junior
Re : Débutant total bloqué sur message "nom ambigu detecte Workbook_BeforeClose"

Super,

Sauf que maintenant il me dit un message similaire mais concernant "workbook_open"....
Merci
J'ai déjà un pressentiment sur ce que tu vas me conseiller mais j'attends de voir...
 

Fred0o

XLDnaute Barbatruc
Re : Débutant total bloqué sur message "nom ambigu detecte Workbook_BeforeClose"

Re-Bonsoir,

Comme tu l'as compris, tu supprimes la 1° Sub WorkBook_Open (jusqu'au End Sub) puis tu copies l'instruction
VB:
[SIZE=2]Call ToggleCutCopyAndPaste(False)[/SIZE]

Derrière la prochaine instruction
VB:
Sub WorkBook_Open

A+
 

guigui971

XLDnaute Junior
Re : Débutant total bloqué sur message "nom ambigu detecte Workbook_BeforeClose"

OK,
Sauf que maintenant il me met "variable non definie" avec

Private Sub HideAllSheets()
'Hide all worksheets except the macro welcome page
Dim ws As Worksheet

Worksheets(WelcomePage).Visible = xlSheetVisible

Là je n'ai aucun pressentiment...

Mais j'ajoute que lorsque je fais déboguage, il me dit "seuls des commentaires peuvent apparaitre après end sub, end fonction ou end property..

Je suppose que le probl est au debut de mon code où j'ai maitnenant :
Option Explicit

Private Sub Workbook_Activate()
Call ToggleCutCopyAndPaste(False)
End Sub


Private Sub Workbook_Deactivate()
Call ToggleCutCopyAndPaste(True)
End Sub

Const WelcomePage = "Macros"

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call ToggleCutCopyAndPaste(True)
'Turn off events to prevent unwanted loops
Application.EnableEvents = False

'Evaluate if workbook is saved......

Merci
 
Dernière édition:

Fred0o

XLDnaute Barbatruc
Re : Débutant total bloqué sur message "nom ambigu detecte Workbook_BeforeClose"

Re-Bonsoir,

Difficile de t'aider sans ton code complet. En effet, tu fais appel à une variable nommée "WelcomePage". Il faut donc qu'elle soit déclarée auparavant par une instruction :
VB:
Private WelcomePage As WorkSheet
ou bien :
VB:
PublicWelcomePage As WorkSheet
ou bien:
VB:
Dim WelcomePage As WorkSheet
. ensuite, il faut qu'elle soit initialisée en lui affectant une valeur, avec par exemple cette instruction :
VB:
WelcomePage = Sheets("Feuil1)

Bref, peux-tu poster en pièce jointe ton fichier que tu auras vidé des données confidentielles ?

A+
 

guigui971

XLDnaute Junior
Re : Débutant total bloqué sur message "nom ambigu detecte Workbook_BeforeClose"

C'est hyper sympa.
Je précise : le nom de la feuille en question est bien "Macros".

Au final, il s'agit de 2 macro :
L'une qui interdit les copier coller couper de tout le classeur,
L'autre qui oblige à actievr les macro pour voir l'ensemble des feuilles, sauf la feuille "Macros"
Sur la feuille "Macros" il y a un message disant qu'on doit activer les macro pour utiliser le classeur...
Merci encore
 

Pièces jointes

  • this workbook.doc.zip
    9.5 KB · Affichages: 27

Fred0o

XLDnaute Barbatruc
Re : Débutant total bloqué sur message "nom ambigu detecte Workbook_BeforeClose"

Re-bonsoir,

En fait, il te faut déplacer cette instruction :
VB:
Const WelcomePage = "Macros"
au tout début du code, juste après l'instruction
VB:
Option Explicit

Je pense qu'on n'a pas fini car je ne troiuve pas la Sub "ToggleCutCopyAndPaste"

A+
 

Fred0o

XLDnaute Barbatruc
Re : Débutant total bloqué sur message "nom ambigu detecte Workbook_BeforeClose"

Re bonsoir,

Je suis beaucoup de chose mais surtout pas dieu. D'autant que sur ce forum, je ne suis qu'un humble contributeur éclairé certes mais d'autres contributeurs ont des connaissances VBA beaucoup plus approfondies que les miennes.

A+
 

guigui971

XLDnaute Junior
Re : Débutant total bloqué sur message "nom ambigu detecte Workbook_BeforeClose"

Bravo, j'ai essayé ta suggestion, çà marche impec.

Sauf que....
Comme je veux empêcher les utilisateur de supprimer par inadvertance des feuilles, je veux cocher maintenant l'option "protéger le classeur"(structure seule), et là çà me met le message d'erreur suivant, quand je veux sauvegarder après avoir coché cette option :

Microsoft Visual Basic (nom de la fenêtre)
Erreur d'exécution '1004':
Impossible de définir la propriété visible de la classe worksheet
Fin(bouton)
 
Dernière édition:

Discussions similaires

Réponses
2
Affichages
193

Statistiques des forums

Discussions
312 199
Messages
2 086 159
Membres
103 145
dernier inscrit
lea.