EtienneChouard
XLDnaute Nouveau
Bonjour le forum.
Je farfouille dans le forum depuis un moment pour éviter de vous embêter pour rien, mais décidément, je ne trouve pas ce qu'il me faut (je dois chercher comme une patate, sans doute : ma douce et tendre me le rappelle gentiment chaque fois que je l'oublie un peu )
Alors voici mon problème, si l'un des magiciens du coin veut bien m'aider :
Dans un planning, je voudrais assister la saisie en proposant des boutons, qui afficheraient chacun les initiales d'un des salariés pris dans une liste saisie à part, et chacun de ces boutons servirait à remplir automatiquement d'un clic les cellules de la sélection avec ces initiales.
Je suis donc en train de créer une barre d'outils paramétrée, c'est-à-dire dont les boutons (libellés et macros correspondantes) soient calculés/programmés pour correspondre à une table saisie dans une feuille : table des initiales des salariés.
J'ai trouvé comment créer la barre d'outils et les boutons, avec les bons libellés et avec le code VBA correspondant à chaque bouton, mais ça cloche encore (dans la boucle à la fin). Voici le code :
J'y suis presque, mais j'ai deux problèmes que je n'arrive pas à régler :
1) les macros en question (laMacro créée en boucle) ne fonctionnent pas parce que les boutons n'arrivent pas à les trouver (le code VBA crée les macros dans le code d'une feuille au lieu de les mettre dans le code d'un module).
Première question : comment imposer que le code créé soit placé dans le module1 (par exemple) et pas ailleurs ?
2) Le programme fonctionne la première fois, mais si on le fait tourner une deuxième fois, il crée des doublons, bien sûr... Il faudrait donc (au départ) supprimer toutes les anciennes procédures pour que la création puisse à nouveau avoir lieu au même endroit.
Deuxième question : comment vider un module (ce serait le module1 en l'occurrence) de toutes ses procédures sans détruire le module lui-même (puisqu'il va resservir aussitôt) ?
J'imagine que je vais me faire traiter de Cro-Magnon par les pros, mais j'assume Si vous avez des idées de code plus astucieux, ça m'intéresse au plus haut point, bien sûr.
Merci d'avance pour vos lumières et pour votre gentillesse.
Étienne.
Je farfouille dans le forum depuis un moment pour éviter de vous embêter pour rien, mais décidément, je ne trouve pas ce qu'il me faut (je dois chercher comme une patate, sans doute : ma douce et tendre me le rappelle gentiment chaque fois que je l'oublie un peu )
Alors voici mon problème, si l'un des magiciens du coin veut bien m'aider :
Dans un planning, je voudrais assister la saisie en proposant des boutons, qui afficheraient chacun les initiales d'un des salariés pris dans une liste saisie à part, et chacun de ces boutons servirait à remplir automatiquement d'un clic les cellules de la sélection avec ces initiales.
Je suis donc en train de créer une barre d'outils paramétrée, c'est-à-dire dont les boutons (libellés et macros correspondantes) soient calculés/programmés pour correspondre à une table saisie dans une feuille : table des initiales des salariés.
J'ai trouvé comment créer la barre d'outils et les boutons, avec les bons libellés et avec le code VBA correspondant à chaque bouton, mais ça cloche encore (dans la boucle à la fin). Voici le code :
Code:
Sub CréerBarreDoutils()
Dim Bouton As CommandBarButton
Dim Ws As Worksheet
Dim Obj As OLEObject
Dim laMacro As String
Dim x As Integer
'On commence par détruire la barre d'outils si elle existe,
'car on va la reconstruire de toutes pièces :
On Error Resume Next
Application.CommandBars("SaisiePlanning").Delete
Set CmdBar = Application.CommandBars _
.Add(Name:="SaisiePlanning", Position:=msoBarTop, _
temporary:=True)
Dim N, NOM, Cells
N = 0
NOM = ""
Application.ScreenUpdating = False 'Fige l'écran
Set Bouton = CmdBar.Controls.Add(Type:=msoControlButton)
With Bouton
.FaceId = 6678
.OnAction = "EffacementCouleur"
.TooltipText = "Effacement de la couleur"
.Caption = "Efface Couleur"
.Style = msoButtonIconAndCaption
End With
Set Bouton = CmdBar.Controls.Add(Type:=msoControlButton)
With Bouton
.FaceId = 6678
.OnAction = "EffacementContenu"
.TooltipText = "Effacement du contenu"
.Caption = "Efface Contenu"
.Style = msoButtonIconAndCaption
End With
Set Bouton = CmdBar.Controls.Add(Type:=msoControlButton)
With Bouton
.FaceId = 135
.OnAction = "LIE"
.TooltipText = "LIE"
.Caption = "LIE"
.Style = msoButtonIconAndCaption
.Picture = stdole.StdFunctions.LoadPicture("C:\Mes documents\bouton_lie.gif")
End With
Set Bt = Application.CommandBars("Standard").Controls.Add(Type:=msoControlButton, before:=5, temporary:=True)
Set Bouton = CmdBar.Controls.Add(Type:=msoControlButton)
With Bouton
.FaceId = 6851
.OnAction = "VIN"
.TooltipText = "VIN"
.Caption = "VIN"
.Style = msoButtonIconAndCaption
.Picture = stdole.StdFunctions.LoadPicture("C:\Mes documents\bouton_vin.gif")
End With
Set Bouton = CmdBar.Controls.Add(Type:=msoControlButton)
With Bouton
.FaceId = 4
.OnAction = "MARC"
.TooltipText = "MARC"
.Caption = "MARC"
.Style = msoButtonIconAndCaption
.Picture = stdole.StdFunctions.LoadPicture("C:\Mes documents\bouton_marc.gif")
End With
For Each Cells In Range("ListeDesInitiales")
If Cells <> "" Then 'si la cellule n'est pas vide (contient des initiales), il faut créer un outil sur la barre d'outils
N = N + 1
NOM = Cells
'création d'une macro pour chaque salarié :
' macro dont LE NOM est le même que les initiales du salarié,
'et dont le code VBA est fait pour insérer automatiquement les initiales en question
'dans toutes les cellules de la sélection :
'(saisie assistée dans le planning)
laMacro = "Sub " & NOM & "()" & vbCrLf
laMacro = laMacro & "Dim Cells" & vbCrLf
laMacro = laMacro & "Application.ScreenUpdating = False 'Fige l'écran" & vbCrLf
laMacro = laMacro & "For Each Cells In Selection" & vbCrLf
laMacro = laMacro & "Cells.value = " & """" & NOM & """" & vbCrLf
laMacro = laMacro & "Next Cells" & vbCrLf
laMacro = laMacro & "Application.ScreenUpdating = True" & vbCrLf
laMacro = laMacro & "End Sub"
With ThisWorkbook.VBProject.VBComponents(Sheets(5).CodeName).CodeModule
x = .CountOfLines + 1
.InsertLines x, laMacro
End With
'Si message "L’accès par programme au projet Visual Basic n’est pas fiable"
'Alors Menu Outils d'Excel -> Macro -> Sécurité -> Onglets Sources fiables -> Cocher "Faire confiance au projet Visual Basic"
'Pour atteindre le même menu sous Excel 2007 :
'Menu Office -> Options Excel -> Centre de gestion de la confidentialité -> Paramètres du Centre de gestion de la confidentialité -> Paramètres des macros -> Accès approuvé au modèle d'objet du projet VBA
End If
Next Cells
Application.ScreenUpdating = True
CmdBar.Visible = True
End Sub
J'y suis presque, mais j'ai deux problèmes que je n'arrive pas à régler :
1) les macros en question (laMacro créée en boucle) ne fonctionnent pas parce que les boutons n'arrivent pas à les trouver (le code VBA crée les macros dans le code d'une feuille au lieu de les mettre dans le code d'un module).
Première question : comment imposer que le code créé soit placé dans le module1 (par exemple) et pas ailleurs ?
2) Le programme fonctionne la première fois, mais si on le fait tourner une deuxième fois, il crée des doublons, bien sûr... Il faudrait donc (au départ) supprimer toutes les anciennes procédures pour que la création puisse à nouveau avoir lieu au même endroit.
Deuxième question : comment vider un module (ce serait le module1 en l'occurrence) de toutes ses procédures sans détruire le module lui-même (puisqu'il va resservir aussitôt) ?
J'imagine que je vais me faire traiter de Cro-Magnon par les pros, mais j'assume Si vous avez des idées de code plus astucieux, ça m'intéresse au plus haut point, bien sûr.
Merci d'avance pour vos lumières et pour votre gentillesse.
Étienne.