OVH Cloud OVH Cloud

Affecter une macro au bouton Enregistrer

6 réponses
Avatar
bobo le bo
Bonsoir à tous,

j'aimerai pouvoir utiliser une macro qui enregistre mon fichier d'une
certaine façon. Pour cela, j'aimerai qu'elle se déclenche quand
l'utilisateur clique sur le bouton Enregistrer.

On m'a proposé la procédure 'Workbook_BeforeSave', mais cependant, comme ma
macro lance une commande de sauvegarde, ça ne m'arrange pas d'utiliser ça,
surtout qu'il a fallu que je trouve une façon de ne pas me retrouver avec
une boucle infinie ;) . C'est pour ça que j'aimerai bien que le bouton
Enregistrer lance ma macro qui se charge de faire la sauvegarde. Est-ce
possible? Par la même occasion, peut-on désactiver le bouton enregistrer
sous?

Merci par avance

6 réponses

Avatar
Denis Michon
Bonsoir bobo le bo,


Voici un exemple comment procéder :

Pour obtenir dès l'ouvertue de ton fichier, un bouton enregistre qui s'exécute différemment, utilise les événements
suivant du ThisWorkbook

'====================== Private Sub Workbook_Open()
Enregistrer
End Sub
'---------------------

Private Sub Workbook_BeforeClose(Cancel As Boolean)
RevenirAlaNormale
End Sub
'======================

DANS UN MODULE STANDARD :

'-------------------
Sub Enregistrer()
'Id = Enregistrer=3

For Each C In Application.CommandBars.FindControls(ID:=3)
C.OnAction = "NouvelleMacro"
Next

End Sub

'-------------------

Sub NouvelleMacro()

If Right(ActiveWorkbook.Name, 3) Like "xls" Then
ActiveWorkbook.Save
Else
Application.Dialogs(xlDialogSaveWorkbook).Show
End If
End If

'Tu insère ta nouvelle macro dans les lignes qui suivent

MsgBox "As-tu compris"

End Sub

'-------------------

Sub RevenirAlaNormale()
'Id = Enregistrer=3

For Each C In Application.CommandBars.FindControls(ID:=3)
C.OnAction = ""
Next

End Sub
'-------------------



Salutations!



"bobo le bo" a écrit dans le message de news:bmhqi3$i47$
Bonsoir à tous,

j'aimerai pouvoir utiliser une macro qui enregistre mon fichier d'une
certaine façon. Pour cela, j'aimerai qu'elle se déclenche quand
l'utilisateur clique sur le bouton Enregistrer.

On m'a proposé la procédure 'Workbook_BeforeSave', mais cependant, comme ma
macro lance une commande de sauvegarde, ça ne m'arrange pas d'utiliser ça,
surtout qu'il a fallu que je trouve une façon de ne pas me retrouver avec
une boucle infinie ;) . C'est pour ça que j'aimerai bien que le bouton
Enregistrer lance ma macro qui se charge de faire la sauvegarde. Est-ce
possible? Par la même occasion, peut-on désactiver le bouton enregistrer
sous?

Merci par avance
Avatar
Coco le bobo
Super ça marche très bien. Il faut juste que j'assigne la macro à 'ctrl+s'
aussi, mais sinon c plutot cool.

Connais-tu l'ID de 'Enregistrer sous aussi'. En règle général où peut-on
obtenir la liste des ID, j'ai fais une petite recherche rapide mais je n'ai
pas encore trouvé

Merci de ton aide

"Denis Michon" a écrit dans le message news:
mt_ib.160385$
Bonsoir bobo le bo,


Voici un exemple comment procéder :

Pour obtenir dès l'ouvertue de ton fichier, un bouton enregistre qui
s'exécute différemment, utilise les événements

suivant du ThisWorkbook

'====================== > Private Sub Workbook_Open()
Enregistrer
End Sub
'---------------------

Private Sub Workbook_BeforeClose(Cancel As Boolean)
RevenirAlaNormale
End Sub
'====================== >

DANS UN MODULE STANDARD :

'-------------------
Sub Enregistrer()
'Id = Enregistrer=3

For Each C In Application.CommandBars.FindControls(ID:=3)
C.OnAction = "NouvelleMacro"
Next

End Sub

'-------------------

Sub NouvelleMacro()

If Right(ActiveWorkbook.Name, 3) Like "xls" Then
ActiveWorkbook.Save
Else
Application.Dialogs(xlDialogSaveWorkbook).Show
End If
End If

'Tu insère ta nouvelle macro dans les lignes qui suivent

MsgBox "As-tu compris"

End Sub

'-------------------

Sub RevenirAlaNormale()
'Id = Enregistrer=3

For Each C In Application.CommandBars.FindControls(ID:=3)
C.OnAction = ""
Next

End Sub
'-------------------



Salutations!



"bobo le bo" a écrit dans le message de
news:bmhqi3$i47$

Bonsoir à tous,

j'aimerai pouvoir utiliser une macro qui enregistre mon fichier d'une
certaine façon. Pour cela, j'aimerai qu'elle se déclenche quand
l'utilisateur clique sur le bouton Enregistrer.

On m'a proposé la procédure 'Workbook_BeforeSave', mais cependant, comme
ma

macro lance une commande de sauvegarde, ça ne m'arrange pas d'utiliser ça,
surtout qu'il a fallu que je trouve une façon de ne pas me retrouver avec
une boucle infinie ;) . C'est pour ça que j'aimerai bien que le bouton
Enregistrer lance ma macro qui se charge de faire la sauvegarde. Est-ce
possible? Par la même occasion, peut-on désactiver le bouton enregistrer
sous?

Merci par avance





Avatar
Croquignol
Salut Coco,


Connais-tu l'ID de 'Enregistrer sous aussi'. En règle général où peut-on
obtenir la liste des ID, j'ai fais une petite recherche rapide mais je n'ai
pas encore trouvé


Oui avec cette petite macro (lance la procédure ListeIDS)

Dim I As Integer, J As Integer

Sub ListeIDS()
' L. Longre MPFE
Dim CmdB As CommandBar
I = 1: J = 0
Worksheets.Add Sheets(1)
Application.ScreenUpdating = False
For Each CmdB In Application.CommandBars
Recurse CmdB
Next CmdB
With Range("A1").CurrentRegion
.Font.Size = 8
.EntireColumn.AutoFit
.EntireRow.AutoFit
End With
End Sub

Private Sub Recurse(CmdB As Object)
Dim Ctrl As CommandBarControl
J = J + 1
For Each Ctrl In CmdB.Controls
With Cells(I, J)
.Value = Ctrl.Caption & IIf(Ctrl.BuiltIn, " = " & Ctrl.ID, "")
If J = 1 Then .Font.Bold = True
End With
If Ctrl.Type = msoControlPopup Then Recurse Ctrl Else I = I + 1
Next Ctrl
J = J - 1
End Sub

'=======================================
Amicalement,

Croquignol

Avatar
Coco le bobo
D'abord merci, car ça marche bien. Mais je viens de m'apercevoir que si
j'ouvre un deuxième classeur en même, la fonction Enregistrer correspond à
celle qui a été définie pour le premier classeur qui contient la macro.

C'est un peu embêtant, car il faut que je ferme le classeur qui contient la
macro avant de pouvoir manipuler un autre classeur. Il y a-t-il un moyen
pour limiter la portée de la macro au classeur 1?


"Croquignol" a écrit dans le message news:


Salut Coco,


Connais-tu l'ID de 'Enregistrer sous aussi'. En règle général où peut-on
obtenir la liste des ID, j'ai fais une petite recherche rapide mais je
n'ai


pas encore trouvé


Oui avec cette petite macro (lance la procédure ListeIDS)

Dim I As Integer, J As Integer

Sub ListeIDS()
' L. Longre MPFE
Dim CmdB As CommandBar
I = 1: J = 0
Worksheets.Add Sheets(1)
Application.ScreenUpdating = False
For Each CmdB In Application.CommandBars
Recurse CmdB
Next CmdB
With Range("A1").CurrentRegion
.Font.Size = 8
.EntireColumn.AutoFit
.EntireRow.AutoFit
End With
End Sub

Private Sub Recurse(CmdB As Object)
Dim Ctrl As CommandBarControl
J = J + 1
For Each Ctrl In CmdB.Controls
With Cells(I, J)
.Value = Ctrl.Caption & IIf(Ctrl.BuiltIn, " = " & Ctrl.ID, "")
If J = 1 Then .Font.Bold = True
End With
If Ctrl.Type = msoControlPopup Then Recurse Ctrl Else I = I + 1
Next Ctrl
J = J - 1
End Sub

'======================================= >
Amicalement,

Croquignol



Avatar
michdenis
Bonjour Coco le bobo,


Ajoute dans le ThisWorkbook de ton projet ceci :

'------------------
Private Sub Workbook_Activate()
Enregistrer
End Sub
'------------------
Private Sub Workbook_Deactivate()
RevenirAlaNormale
End Sub
'------------------


Salutations!



"Coco le bobo" a écrit dans le message de news:bmjfr0$73l$

D'abord merci, car ça marche bien. Mais je viens de m'apercevoir que si
j'ouvre un deuxième classeur en même, la fonction Enregistrer correspond à
celle qui a été définie pour le premier classeur qui contient la macro.

C'est un peu embêtant, car il faut que je ferme le classeur qui contient la
macro avant de pouvoir manipuler un autre classeur. Il y a-t-il un moyen
pour limiter la portée de la macro au classeur 1?


"Croquignol" a écrit dans le message news:


Salut Coco,


Connais-tu l'ID de 'Enregistrer sous aussi'. En règle général où peut-on
obtenir la liste des ID, j'ai fais une petite recherche rapide mais je
n'ai


pas encore trouvé


Oui avec cette petite macro (lance la procédure ListeIDS)

Dim I As Integer, J As Integer

Sub ListeIDS()
' L. Longre MPFE
Dim CmdB As CommandBar
I = 1: J = 0
Worksheets.Add Sheets(1)
Application.ScreenUpdating = False
For Each CmdB In Application.CommandBars
Recurse CmdB
Next CmdB
With Range("A1").CurrentRegion
.Font.Size = 8
.EntireColumn.AutoFit
.EntireRow.AutoFit
End With
End Sub

Private Sub Recurse(CmdB As Object)
Dim Ctrl As CommandBarControl
J = J + 1
For Each Ctrl In CmdB.Controls
With Cells(I, J)
.Value = Ctrl.Caption & IIf(Ctrl.BuiltIn, " = " & Ctrl.ID, "")
If J = 1 Then .Font.Bold = True
End With
If Ctrl.Type = msoControlPopup Then Recurse Ctrl Else I = I + 1
Next Ctrl
J = J - 1
End Sub

'======================================= >
Amicalement,

Croquignol



Avatar
Coco le bobo
Merci beaucoup, tout marche parfaitement


"michdenis" a écrit dans le message news:
#
Bonjour Coco le bobo,


Ajoute dans le ThisWorkbook de ton projet ceci :

'------------------
Private Sub Workbook_Activate()
Enregistrer
End Sub
'------------------
Private Sub Workbook_Deactivate()
RevenirAlaNormale
End Sub
'------------------


Salutations!



"Coco le bobo" a écrit dans le message de
news:bmjfr0$73l$


D'abord merci, car ça marche bien. Mais je viens de m'apercevoir que si
j'ouvre un deuxième classeur en même, la fonction Enregistrer correspond à
celle qui a été définie pour le premier classeur qui contient la macro.

C'est un peu embêtant, car il faut que je ferme le classeur qui contient
la

macro avant de pouvoir manipuler un autre classeur. Il y a-t-il un moyen
pour limiter la portée de la macro au classeur 1?


"Croquignol" a écrit dans le message news:


Salut Coco,


Connais-tu l'ID de 'Enregistrer sous aussi'. En règle général où
peut-on



obtenir la liste des ID, j'ai fais une petite recherche rapide mais je
n'ai


pas encore trouvé


Oui avec cette petite macro (lance la procédure ListeIDS)

Dim I As Integer, J As Integer

Sub ListeIDS()
' L. Longre MPFE
Dim CmdB As CommandBar
I = 1: J = 0
Worksheets.Add Sheets(1)
Application.ScreenUpdating = False
For Each CmdB In Application.CommandBars
Recurse CmdB
Next CmdB
With Range("A1").CurrentRegion
.Font.Size = 8
.EntireColumn.AutoFit
.EntireRow.AutoFit
End With
End Sub

Private Sub Recurse(CmdB As Object)
Dim Ctrl As CommandBarControl
J = J + 1
For Each Ctrl In CmdB.Controls
With Cells(I, J)
.Value = Ctrl.Caption & IIf(Ctrl.BuiltIn, " = " & Ctrl.ID, "")
If J = 1 Then .Font.Bold = True
End With
If Ctrl.Type = msoControlPopup Then Recurse Ctrl Else I = I + 1
Next Ctrl
J = J - 1
End Sub

'======================================= > >
Amicalement,

Croquignol