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

vba - tester la présence des menus commandbars ajoutés

7 réponses
Avatar
twinley
Bonjour à tous,

Je crée des menus commandbars dans l'openworkbook.
J'ai vu que parfois l'utilisateur faisait une manip inconnue qui ne
permettait pas de supprimer les menus dans le before_close.

Pour remedier à cela j'aimerai tester à l'ouverture la présence des
trois menus que j'ajoute, et s'ils sont là, les tuer jusqu'a ce qu'il
n'y en ai plus.
En usage normal, j'en crée 3, mais j'ai vu un classeur qui en contenait
9. L'utilisateur a du planter 3 fois.

Voici l'une des trois sub pour supprimer :
Sub SupprMenuFV()
Dim NomBarre$
NomBarre = "FV"
On Error Resume Next
Application.CommandBars(1).Controls(NomBarre).Delete
End Sub

Comment tester la présence des menus que j'ajoute ?


Merci pour l'aide
--
à+twinley

7 réponses

Avatar
anonymousA
bonjour,

ben ce que tu écris est bon. Il y a quand même quelque chose d'étrange dans
ta demande, car une commandbar avec un nom spécifique ne peut avoir de
doublons, donc ton affaire de 9 commandbars par groupe de 3 , I presume, me
parait suspect.
Par ailleurs, la manip à faire absolument au moment de la création de ta
commandbar c'est d'écrire toujours une instruction préalable de destruction
de celle-ci

On error resume next
Application.commanbars("Twinley1").delete
set Mybar=application.commandbars.add
Mybar.name="Twinley1"

Ce faisant,tu seras certain avant création d'avoir détruit ta commandbar,
quoiqu'il ait pu se passer par ailleurs

A+



Bonjour à tous,

Je crée des menus commandbars dans l'openworkbook.
J'ai vu que parfois l'utilisateur faisait une manip inconnue qui ne
permettait pas de supprimer les menus dans le before_close.

Pour remedier à cela j'aimerai tester à l'ouverture la présence des
trois menus que j'ajoute, et s'ils sont là, les tuer jusqu'a ce qu'il
n'y en ai plus.
En usage normal, j'en crée 3, mais j'ai vu un classeur qui en contenait
9. L'utilisateur a du planter 3 fois.

Voici l'une des trois sub pour supprimer :
Sub SupprMenuFV()
Dim NomBarre$
NomBarre = "FV"
On Error Resume Next
Application.CommandBars(1).Controls(NomBarre).Delete
End Sub

Comment tester la présence des menus que j'ajoute ?


Merci pour l'aide
--
à+twinley



Avatar
twinley
Bonjour aA

merci pour l'aide

Je réexplique mieux.

Je crée un menu trimestre, un menu mois, un menu semaine.
Si l'utilisateur plante ou fait une manip improbable, qu'il ne peut pas
décrire, je me retrouve avec 9 menus (3 fois : trim, mois, sem). Je
suppose qu'il ne passe pas dans beforeclose de thisworkbook (là ou je
tue les menus).

Je me disais que plutôt de faire une boucle de 5 fois "delete de chaque
menu avec on error", j'aimerai bien identifier le nombre de menus
oubliés à l'ouverture, les tuer tous et en recréer un groupe de trois.
Comme cela je couvre tous les cas de figure (6 menus oubliés, 9, 12 etc.)

Voici un exemple pour le menu trimestre, creatmenutrim , supprmenutrimok
(ce que j'avais et qui fonctionne), supprmenutrim (ce que j'ai créer
selon ta façon (et qui ne fait rien).

Si je crée 4 menus trim, je peux lancer une boucle qui en tue 5 puis je
crée. Mais je vais bien tomber un jour sur 6 menus qui trainent.

Sub CreateMenuTrim()
Dim MenuTrimestre As CommandBarPopup
On Error Resume Next

With Application.CommandBars(1)
Set MenuTrimestre = .Controls.Add(Type:=msoControlPopup,
before:=.Controls.Count - 1)
End With
MenuTrimestre.Caption = "Trimestre"
'Creation des sous-menus
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim1"
.OnAction = "montretrim1"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim2"
.OnAction = "montretrim2"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim3"
.OnAction = "montretrim3"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim4"
.OnAction = "montretrim4"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Tout"
.OnAction = "ShowAllSh"
End With
End Sub

Sub SupprMenuTrimok()
Dim NomBarre$
NomBarre = "Trimestre"
On Error Resume Next
Application.CommandBars(1).Controls(NomBarre).Delete
End Sub

Sub SupprMenuTrim()
Dim NomBarre$
'NomBarre = "Trimestre"
On Error Resume Next
Application.CommandBars("Trimestre").Delete
End Sub

Sub aA()
Dim Mybar
On Error Resume Next
Application.commanbars("Trimestre").Delete
' Set Mybar = Application.CommandBars.Add
' Mybar.Name = "Twinley1"
End Sub


Pour présenter mon idée, mais ce code ne marche pas :

Sub SupprMenuTrimPasok()
Dim NomBarre$
NomBarre = "Trimestre"
On Error Resume Next
While CommandBars(1).Controls(NomBarre) = "Trimestre"
Application.CommandBars(1).Controls(NomBarre).Delete
Wend
End Sub

ou alors touver le nombre de fois que j'ai le menu Trimestre et je les
tue. Mais je ne trouve pas de count.

voilà,voilà, j'espère être plus clair.

à+twinley

anonymousA wrote:
bonjour,

ben ce que tu écris est bon. Il y a quand même quelque chose d'étrange dans
ta demande, car une commandbar avec un nom spécifique ne peut avoir de
doublons, donc ton affaire de 9 commandbars par groupe de 3 , I presume, me
parait suspect.
Par ailleurs, la manip à faire absolument au moment de la création de ta
commandbar c'est d'écrire toujours une instruction préalable de destruction
de celle-ci

On error resume next
Application.commanbars("Twinley1").delete
set Mybar=application.commandbars.add
Mybar.name="Twinley1"

Ce faisant,tu seras certain avant création d'avoir détruit ta commandbar,
quoiqu'il ait pu se passer par ailleurs

A+



Bonjour à tous,

Je crée des menus commandbars dans l'openworkbook.
J'ai vu que parfois l'utilisateur faisait une manip inconnue qui ne
permettait pas de supprimer les menus dans le before_close.

Pour remedier à cela j'aimerai tester à l'ouverture la présence des
trois menus que j'ajoute, et s'ils sont là, les tuer jusqu'a ce qu'il
n'y en ai plus.
En usage normal, j'en crée 3, mais j'ai vu un classeur qui en contenait
9. L'utilisateur a du planter 3 fois.

Voici l'une des trois sub pour supprimer :
Sub SupprMenuFV()
Dim NomBarre$
NomBarre = "FV"
On Error Resume Next
Application.CommandBars(1).Controls(NomBarre).Delete
End Sub

Comment tester la présence des menus que j'ajoute ?


Merci pour l'aide
--
à+twinley





Avatar
anonymousA
OK, je n'avais d'abord pas compris que tu ne créeais pas de barre de
commandes mais un commandcontrolbutton sur une commandbar ( en l'occurence la
commandbar 1 ou worksheetmenubar), dont acte !!!.

Nonobstant, la suppression des controles dans plusieurs commandbars ou sous
menu d'ailleurs , s'il s'appellent par le même nom , est possible en écrivant

on error resume next
Set CollControls = Application.CommandBars.FindControls(ID:=1)

For I = CollControls.Count To 1 Step -1
If CollControls(I).Caption = "Trimestre" Then CollControls(I).Delete
Next

les controles non built-in ont un ID de 1

j'espère avoir répondu à ta question désormais.

A+



Bonjour aA

merci pour l'aide

Je réexplique mieux.

Je crée un menu trimestre, un menu mois, un menu semaine.
Si l'utilisateur plante ou fait une manip improbable, qu'il ne peut pas
décrire, je me retrouve avec 9 menus (3 fois : trim, mois, sem). Je
suppose qu'il ne passe pas dans beforeclose de thisworkbook (là ou je
tue les menus).

Je me disais que plutôt de faire une boucle de 5 fois "delete de chaque
menu avec on error", j'aimerai bien identifier le nombre de menus
oubliés à l'ouverture, les tuer tous et en recréer un groupe de trois.
Comme cela je couvre tous les cas de figure (6 menus oubliés, 9, 12 etc.)

Voici un exemple pour le menu trimestre, creatmenutrim , supprmenutrimok
(ce que j'avais et qui fonctionne), supprmenutrim (ce que j'ai créer
selon ta façon (et qui ne fait rien).

Si je crée 4 menus trim, je peux lancer une boucle qui en tue 5 puis je
crée. Mais je vais bien tomber un jour sur 6 menus qui trainent.

Sub CreateMenuTrim()
Dim MenuTrimestre As CommandBarPopup
On Error Resume Next

With Application.CommandBars(1)
Set MenuTrimestre = .Controls.Add(Type:=msoControlPopup,
before:=.Controls.Count - 1)
End With
MenuTrimestre.Caption = "Trimestre"
'Creation des sous-menus
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim1"
.OnAction = "montretrim1"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim2"
.OnAction = "montretrim2"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim3"
.OnAction = "montretrim3"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim4"
.OnAction = "montretrim4"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Tout"
.OnAction = "ShowAllSh"
End With
End Sub

Sub SupprMenuTrimok()
Dim NomBarre$
NomBarre = "Trimestre"
On Error Resume Next
Application.CommandBars(1).Controls(NomBarre).Delete
End Sub

Sub SupprMenuTrim()
Dim NomBarre$
'NomBarre = "Trimestre"
On Error Resume Next
Application.CommandBars("Trimestre").Delete
End Sub

Sub aA()
Dim Mybar
On Error Resume Next
Application.commanbars("Trimestre").Delete
' Set Mybar = Application.CommandBars.Add
' Mybar.Name = "Twinley1"
End Sub


Pour présenter mon idée, mais ce code ne marche pas :

Sub SupprMenuTrimPasok()
Dim NomBarre$
NomBarre = "Trimestre"
On Error Resume Next
While CommandBars(1).Controls(NomBarre) = "Trimestre"
Application.CommandBars(1).Controls(NomBarre).Delete
Wend
End Sub

ou alors touver le nombre de fois que j'ai le menu Trimestre et je les
tue. Mais je ne trouve pas de count.

voilà,voilà, j'espère être plus clair.

à+twinley

anonymousA wrote:
bonjour,

ben ce que tu écris est bon. Il y a quand même quelque chose d'étrange dans
ta demande, car une commandbar avec un nom spécifique ne peut avoir de
doublons, donc ton affaire de 9 commandbars par groupe de 3 , I presume, me
parait suspect.
Par ailleurs, la manip à faire absolument au moment de la création de ta
commandbar c'est d'écrire toujours une instruction préalable de destruction
de celle-ci

On error resume next
Application.commanbars("Twinley1").delete
set Mybar=application.commandbars.add
Mybar.name="Twinley1"

Ce faisant,tu seras certain avant création d'avoir détruit ta commandbar,
quoiqu'il ait pu se passer par ailleurs

A+



Bonjour à tous,

Je crée des menus commandbars dans l'openworkbook.
J'ai vu que parfois l'utilisateur faisait une manip inconnue qui ne
permettait pas de supprimer les menus dans le before_close.

Pour remedier à cela j'aimerai tester à l'ouverture la présence des
trois menus que j'ajoute, et s'ils sont là, les tuer jusqu'a ce qu'il
n'y en ai plus.
En usage normal, j'en crée 3, mais j'ai vu un classeur qui en contenait
9. L'utilisateur a du planter 3 fois.

Voici l'une des trois sub pour supprimer :
Sub SupprMenuFV()
Dim NomBarre$
NomBarre = "FV"
On Error Resume Next
Application.CommandBars(1).Controls(NomBarre).Delete
End Sub

Comment tester la présence des menus que j'ajoute ?


Merci pour l'aide
--
à+twinley








Avatar
twinley
ah ! j'avance.

grâce à Papou

Sub VirerMonMenu()
Dim ctr
For Each ctr In Application.CommandBars(1).Controls
If Not ctr.BuiltIn And ctr.Caption = "Trimestre" Then
ctr.Delete
End If
Next
End Sub

il me vire bien 4 menus trimestre si j'en ai 4...

Par contre aA, tu avais mis le doigt sur le point faible. Empécher la
création d'un deuxième menu.

j'ai donc ajouté ".Controls("Trimestre").Delete"

With Application.CommandBars(1)
.Controls("Trimestre").Delete
Set MenuTrimestre = .Controls.Add(Type:=msoControlPopup,
before:=.Controls.Count - 1)
End With

Bon je suis bordé sur ce coup là, pas très rapide, mais j'ai fais le tour...

encore merci

à+twinley

twinley wrote:
Bonjour aA

merci pour l'aide

Je réexplique mieux.

Je crée un menu trimestre, un menu mois, un menu semaine.
Si l'utilisateur plante ou fait une manip improbable, qu'il ne peut pas
décrire, je me retrouve avec 9 menus (3 fois : trim, mois, sem). Je
suppose qu'il ne passe pas dans beforeclose de thisworkbook (là ou je
tue les menus).

Je me disais que plutôt de faire une boucle de 5 fois "delete de chaque
menu avec on error", j'aimerai bien identifier le nombre de menus
oubliés à l'ouverture, les tuer tous et en recréer un groupe de trois.
Comme cela je couvre tous les cas de figure (6 menus oubliés, 9, 12 etc.)

Voici un exemple pour le menu trimestre, creatmenutrim , supprmenutrimok
(ce que j'avais et qui fonctionne), supprmenutrim (ce que j'ai créer
selon ta façon (et qui ne fait rien).

Si je crée 4 menus trim, je peux lancer une boucle qui en tue 5 puis je
crée. Mais je vais bien tomber un jour sur 6 menus qui trainent.

Sub CreateMenuTrim()
Dim MenuTrimestre As CommandBarPopup
On Error Resume Next

With Application.CommandBars(1)
Set MenuTrimestre = .Controls.Add(Type:=msoControlPopup,
before:=.Controls.Count - 1)
End With
MenuTrimestre.Caption = "Trimestre"
'Creation des sous-menus
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim1"
.OnAction = "montretrim1"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim2"
.OnAction = "montretrim2"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim3"
.OnAction = "montretrim3"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim4"
.OnAction = "montretrim4"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Tout"
.OnAction = "ShowAllSh"
End With
End Sub

Sub SupprMenuTrimok()
Dim NomBarre$
NomBarre = "Trimestre"
On Error Resume Next
Application.CommandBars(1).Controls(NomBarre).Delete
End Sub

Sub SupprMenuTrim()
Dim NomBarre$
'NomBarre = "Trimestre"
On Error Resume Next
Application.CommandBars("Trimestre").Delete
End Sub

Sub aA()
Dim Mybar
On Error Resume Next
Application.commanbars("Trimestre").Delete
' Set Mybar = Application.CommandBars.Add
' Mybar.Name = "Twinley1"
End Sub


Pour présenter mon idée, mais ce code ne marche pas :

Sub SupprMenuTrimPasok()
Dim NomBarre$
NomBarre = "Trimestre"
On Error Resume Next
While CommandBars(1).Controls(NomBarre) = "Trimestre"
Application.CommandBars(1).Controls(NomBarre).Delete
Wend
End Sub

ou alors touver le nombre de fois que j'ai le menu Trimestre et je les
tue. Mais je ne trouve pas de count.

voilà,voilà, j'espère être plus clair.

à+twinley

anonymousA wrote:

bonjour,

ben ce que tu écris est bon. Il y a quand même quelque chose d'étrange
dans ta demande, car une commandbar avec un nom spécifique ne peut
avoir de doublons, donc ton affaire de 9 commandbars par groupe de 3 ,
I presume, me parait suspect.
Par ailleurs, la manip à faire absolument au moment de la création de
ta commandbar c'est d'écrire toujours une instruction préalable de
destruction de celle-ci

On error resume next
Application.commanbars("Twinley1").delete
set Mybar=application.commandbars.add
Mybar.name="Twinley1"

Ce faisant,tu seras certain avant création d'avoir détruit ta
commandbar, quoiqu'il ait pu se passer par ailleurs

A+



Bonjour à tous,

Je crée des menus commandbars dans l'openworkbook.
J'ai vu que parfois l'utilisateur faisait une manip inconnue qui ne
permettait pas de supprimer les menus dans le before_close.

Pour remedier à cela j'aimerai tester à l'ouverture la présence des
trois menus que j'ajoute, et s'ils sont là, les tuer jusqu'a ce qu'il
n'y en ai plus.
En usage normal, j'en crée 3, mais j'ai vu un classeur qui en
contenait 9. L'utilisateur a du planter 3 fois.

Voici l'une des trois sub pour supprimer :
Sub SupprMenuFV()
Dim NomBarre$
NomBarre = "FV"
On Error Resume Next
Application.CommandBars(1).Controls(NomBarre).Delete
End Sub

Comment tester la présence des menus que j'ajoute ?


Merci pour l'aide
--
à+twinley







Avatar
twinley
Parfait, c'est exactement ça.
J'aime bien l'idée de partir à l'envers dans la boucle, c'est surement
plus rapide que celle de Papou qui inclu le test de built-in à chaque
fois. Là on ne parcours que les menus perso.

J'étais pas près d'inventer ce truc.

Bonne soirée et merci.

à+twinley

anonymousA wrote:
OK, je n'avais d'abord pas compris que tu ne créeais pas de barre de
commandes mais un commandcontrolbutton sur une commandbar ( en l'occurence la
commandbar 1 ou worksheetmenubar), dont acte !!!.

Nonobstant, la suppression des controles dans plusieurs commandbars ou sous
menu d'ailleurs , s'il s'appellent par le même nom , est possible en écrivant

on error resume next
Set CollControls = Application.CommandBars.FindControls(ID:=1)

For I = CollControls.Count To 1 Step -1
If CollControls(I).Caption = "Trimestre" Then CollControls(I).Delete
Next

les controles non built-in ont un ID de 1

j'espère avoir répondu à ta question désormais.

A+




Bonjour aA

merci pour l'aide

Je réexplique mieux.

Je crée un menu trimestre, un menu mois, un menu semaine.
Si l'utilisateur plante ou fait une manip improbable, qu'il ne peut pas
décrire, je me retrouve avec 9 menus (3 fois : trim, mois, sem). Je
suppose qu'il ne passe pas dans beforeclose de thisworkbook (là ou je
tue les menus).

Je me disais que plutôt de faire une boucle de 5 fois "delete de chaque
menu avec on error", j'aimerai bien identifier le nombre de menus
oubliés à l'ouverture, les tuer tous et en recréer un groupe de trois.
Comme cela je couvre tous les cas de figure (6 menus oubliés, 9, 12 etc.)

Voici un exemple pour le menu trimestre, creatmenutrim , supprmenutrimok
(ce que j'avais et qui fonctionne), supprmenutrim (ce que j'ai créer
selon ta façon (et qui ne fait rien).

Si je crée 4 menus trim, je peux lancer une boucle qui en tue 5 puis je
crée. Mais je vais bien tomber un jour sur 6 menus qui trainent.

Sub CreateMenuTrim()
Dim MenuTrimestre As CommandBarPopup
On Error Resume Next

With Application.CommandBars(1)
Set MenuTrimestre = .Controls.Add(Type:=msoControlPopup,
before:=.Controls.Count - 1)
End With
MenuTrimestre.Caption = "Trimestre"
'Creation des sous-menus
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim1"
.OnAction = "montretrim1"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim2"
.OnAction = "montretrim2"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim3"
.OnAction = "montretrim3"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim4"
.OnAction = "montretrim4"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Tout"
.OnAction = "ShowAllSh"
End With
End Sub

Sub SupprMenuTrimok()
Dim NomBarre$
NomBarre = "Trimestre"
On Error Resume Next
Application.CommandBars(1).Controls(NomBarre).Delete
End Sub

Sub SupprMenuTrim()
Dim NomBarre$
'NomBarre = "Trimestre"
On Error Resume Next
Application.CommandBars("Trimestre").Delete
End Sub

Sub aA()
Dim Mybar
On Error Resume Next
Application.commanbars("Trimestre").Delete
' Set Mybar = Application.CommandBars.Add
' Mybar.Name = "Twinley1"
End Sub


Pour présenter mon idée, mais ce code ne marche pas :

Sub SupprMenuTrimPasok()
Dim NomBarre$
NomBarre = "Trimestre"
On Error Resume Next
While CommandBars(1).Controls(NomBarre) = "Trimestre"
Application.CommandBars(1).Controls(NomBarre).Delete
Wend
End Sub

ou alors touver le nombre de fois que j'ai le menu Trimestre et je les
tue. Mais je ne trouve pas de count.

voilà,voilà, j'espère être plus clair.

à+twinley

anonymousA wrote:

bonjour,

ben ce que tu écris est bon. Il y a quand même quelque chose d'étrange dans
ta demande, car une commandbar avec un nom spécifique ne peut avoir de
doublons, donc ton affaire de 9 commandbars par groupe de 3 , I presume, me
parait suspect.
Par ailleurs, la manip à faire absolument au moment de la création de ta
commandbar c'est d'écrire toujours une instruction préalable de destruction
de celle-ci

On error resume next
Application.commanbars("Twinley1").delete
set Mybar=application.commandbars.add
Mybar.name="Twinley1"

Ce faisant,tu seras certain avant création d'avoir détruit ta commandbar,
quoiqu'il ait pu se passer par ailleurs

A+




Bonjour à tous,

Je crée des menus commandbars dans l'openworkbook.
J'ai vu que parfois l'utilisateur faisait une manip inconnue qui ne
permettait pas de supprimer les menus dans le before_close.

Pour remedier à cela j'aimerai tester à l'ouverture la présence des
trois menus que j'ajoute, et s'ils sont là, les tuer jusqu'a ce qu'il
n'y en ai plus.
En usage normal, j'en crée 3, mais j'ai vu un classeur qui en contenait
9. L'utilisateur a du planter 3 fois.

Voici l'une des trois sub pour supprimer :
Sub SupprMenuFV()
Dim NomBarre$
NomBarre = "FV"
On Error Resume Next
Application.CommandBars(1).Controls(NomBarre).Delete
End Sub

Comment tester la présence des menus que j'ajoute ?


Merci pour l'aide
--
à+twinley










Avatar
anonymousA
pour être précis, je ne suis pas sur que ce soit beaucoup plus rapide
que la méthode proposée par Papou. Ce qui est vraiement différent par
rapport à celle-ci, c'est que la collection Collcontrols est bâtie sur
la recherche sur l'ensemble des Commandbars ( c.à.d toutes les
commandbars, visibles et/ou Enabled ou pas d'ailleurs) et pas seulement
sur la commandbars(1).
Enfin, la suppression depuis CollControls.Count To 1 step - est faite
non pas pour aller plus vite mais pour eviter un plantage. En effet,
Excel met à jour au fur et à mesure de nombre de controles répondant à
ID:= 1 , auquel cas, chaque fois que tu supprimes un controle le nombre
total diminue et forcément à un moment ou à un autre l'indice de I va
être supérieur à la valeur du nombre total de controles répondant à
id:=1 du moment, d'où erreur certaine.
Dans la proc communiquée, ca ne se plantera pas, car il existe un on
error resume next, mais cette instruction n'est pas faite pour ça. Elle
est simplement là pour gérer le fait que Set CollControls =
Application.CommandBars.FindControls(ID:=1) peut renvoyer nothing au cas
où il n'existe absolument aucun controles non bulit-in présents dans la
session Excel du moment et comme collcontrols renvoie nothing, il y
aurait plantage avec collcontrols.count puisqu'un objet Nothing ne peut
avoir de count.

Voilà, j'ai tout dit, enfin , je crois.Bon courage

A+

Parfait, c'est exactement ça.
J'aime bien l'idée de partir à l'envers dans la boucle, c'est surement
plus rapide que celle de Papou qui inclu le test de built-in à chaque
fois. Là on ne parcours que les menus perso.

J'étais pas près d'inventer ce truc.

Bonne soirée et merci.

à+twinley

anonymousA wrote:

OK, je n'avais d'abord pas compris que tu ne créeais pas de barre de
commandes mais un commandcontrolbutton sur une commandbar ( en
l'occurence la commandbar 1 ou worksheetmenubar), dont acte !!!.

Nonobstant, la suppression des controles dans plusieurs commandbars ou
sous menu d'ailleurs , s'il s'appellent par le même nom , est possible
en écrivant

on error resume next
Set CollControls = Application.CommandBars.FindControls(ID:=1)

For I = CollControls.Count To 1 Step -1
If CollControls(I).Caption = "Trimestre" Then
CollControls(I).Delete
Next

les controles non built-in ont un ID de 1

j'espère avoir répondu à ta question désormais.

A+




Bonjour aA

merci pour l'aide

Je réexplique mieux.

Je crée un menu trimestre, un menu mois, un menu semaine.
Si l'utilisateur plante ou fait une manip improbable, qu'il ne peut
pas décrire, je me retrouve avec 9 menus (3 fois : trim, mois, sem).
Je suppose qu'il ne passe pas dans beforeclose de thisworkbook (là ou
je tue les menus).

Je me disais que plutôt de faire une boucle de 5 fois "delete de
chaque menu avec on error", j'aimerai bien identifier le nombre de
menus oubliés à l'ouverture, les tuer tous et en recréer un groupe de
trois. Comme cela je couvre tous les cas de figure (6 menus oubliés,
9, 12 etc.)

Voici un exemple pour le menu trimestre, creatmenutrim ,
supprmenutrimok (ce que j'avais et qui fonctionne), supprmenutrim (ce
que j'ai créer selon ta façon (et qui ne fait rien).

Si je crée 4 menus trim, je peux lancer une boucle qui en tue 5 puis
je crée. Mais je vais bien tomber un jour sur 6 menus qui trainent.

Sub CreateMenuTrim()
Dim MenuTrimestre As CommandBarPopup
On Error Resume Next

With Application.CommandBars(1)
Set MenuTrimestre = .Controls.Add(Type:=msoControlPopup,
before:=.Controls.Count - 1)
End With
MenuTrimestre.Caption = "Trimestre"
'Creation des sous-menus
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim1"
.OnAction = "montretrim1"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim2"
.OnAction = "montretrim2"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim3"
.OnAction = "montretrim3"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim4"
.OnAction = "montretrim4"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Tout"
.OnAction = "ShowAllSh"
End With
End Sub

Sub SupprMenuTrimok()
Dim NomBarre$
NomBarre = "Trimestre"
On Error Resume Next
Application.CommandBars(1).Controls(NomBarre).Delete
End Sub

Sub SupprMenuTrim()
Dim NomBarre$
'NomBarre = "Trimestre"
On Error Resume Next
Application.CommandBars("Trimestre").Delete
End Sub

Sub aA()
Dim Mybar
On Error Resume Next
Application.commanbars("Trimestre").Delete
' Set Mybar = Application.CommandBars.Add
' Mybar.Name = "Twinley1"
End Sub


Pour présenter mon idée, mais ce code ne marche pas :

Sub SupprMenuTrimPasok()
Dim NomBarre$
NomBarre = "Trimestre"
On Error Resume Next
While CommandBars(1).Controls(NomBarre) = "Trimestre"
Application.CommandBars(1).Controls(NomBarre).Delete
Wend
End Sub

ou alors touver le nombre de fois que j'ai le menu Trimestre et je
les tue. Mais je ne trouve pas de count.

voilà,voilà, j'espère être plus clair.

à+twinley

anonymousA wrote:

bonjour,

ben ce que tu écris est bon. Il y a quand même quelque chose
d'étrange dans ta demande, car une commandbar avec un nom spécifique
ne peut avoir de doublons, donc ton affaire de 9 commandbars par
groupe de 3 , I presume, me parait suspect.
Par ailleurs, la manip à faire absolument au moment de la création
de ta commandbar c'est d'écrire toujours une instruction préalable
de destruction de celle-ci

On error resume next
Application.commanbars("Twinley1").delete
set Mybar=application.commandbars.add
Mybar.name="Twinley1"

Ce faisant,tu seras certain avant création d'avoir détruit ta
commandbar, quoiqu'il ait pu se passer par ailleurs

A+




Bonjour à tous,

Je crée des menus commandbars dans l'openworkbook.
J'ai vu que parfois l'utilisateur faisait une manip inconnue qui ne
permettait pas de supprimer les menus dans le before_close.

Pour remedier à cela j'aimerai tester à l'ouverture la présence des
trois menus que j'ajoute, et s'ils sont là, les tuer jusqu'a ce
qu'il n'y en ai plus.
En usage normal, j'en crée 3, mais j'ai vu un classeur qui en
contenait 9. L'utilisateur a du planter 3 fois.

Voici l'une des trois sub pour supprimer :
Sub SupprMenuFV()
Dim NomBarre$
NomBarre = "FV"
On Error Resume Next
Application.CommandBars(1).Controls(NomBarre).Delete
End Sub

Comment tester la présence des menus que j'ajoute ?


Merci pour l'aide
--
à+twinley












Avatar
twinley
c'est exact que je ne suis pas à un pouillème de seconde près.
La sub papou commence a gauche et il faut attendre la huitième boucle
pour trouver le premier menu perso.
La tienne rencontre seulement aide et fenetre.
Je n'avais pas pensé à la mise à jour au fur et à mesure du nombre de
controles, ce qui est pourtant évident avec des cellules.


à+twinley

anonymousA wrote:
pour être précis, je ne suis pas sur que ce soit beaucoup plus rapide
que la méthode proposée par Papou. Ce qui est vraiement différent par
rapport à celle-ci, c'est que la collection Collcontrols est bâtie sur
la recherche sur l'ensemble des Commandbars ( c.à.d toutes les
commandbars, visibles et/ou Enabled ou pas d'ailleurs) et pas seulement
sur la commandbars(1).
Enfin, la suppression depuis CollControls.Count To 1 step - est faite
non pas pour aller plus vite mais pour eviter un plantage. En effet,
Excel met à jour au fur et à mesure de nombre de controles répondant à
ID:= 1 , auquel cas, chaque fois que tu supprimes un controle le nombre
total diminue et forcément à un moment ou à un autre l'indice de I va
être supérieur à la valeur du nombre total de controles répondant à
id:=1 du moment, d'où erreur certaine.
Dans la proc communiquée, ca ne se plantera pas, car il existe un on
error resume next, mais cette instruction n'est pas faite pour ça. Elle
est simplement là pour gérer le fait que Set CollControls =
Application.CommandBars.FindControls(ID:=1) peut renvoyer nothing au cas
où il n'existe absolument aucun controles non bulit-in présents dans la
session Excel du moment et comme collcontrols renvoie nothing, il y
aurait plantage avec collcontrols.count puisqu'un objet Nothing ne peut
avoir de count.

Voilà, j'ai tout dit, enfin , je crois.Bon courage

A+


Parfait, c'est exactement ça.
J'aime bien l'idée de partir à l'envers dans la boucle, c'est
surement plus rapide que celle de Papou qui inclu le test de built-in
à chaque fois. Là on ne parcours que les menus perso.

J'étais pas près d'inventer ce truc.

Bonne soirée et merci.

à+twinley

anonymousA wrote:

OK, je n'avais d'abord pas compris que tu ne créeais pas de barre de
commandes mais un commandcontrolbutton sur une commandbar ( en
l'occurence la commandbar 1 ou worksheetmenubar), dont acte !!!.

Nonobstant, la suppression des controles dans plusieurs commandbars
ou sous menu d'ailleurs , s'il s'appellent par le même nom , est
possible en écrivant

on error resume next
Set CollControls = Application.CommandBars.FindControls(ID:=1)

For I = CollControls.Count To 1 Step -1
If CollControls(I).Caption = "Trimestre" Then
CollControls(I).Delete
Next

les controles non built-in ont un ID de 1

j'espère avoir répondu à ta question désormais.

A+




Bonjour aA

merci pour l'aide

Je réexplique mieux.

Je crée un menu trimestre, un menu mois, un menu semaine.
Si l'utilisateur plante ou fait une manip improbable, qu'il ne peut
pas décrire, je me retrouve avec 9 menus (3 fois : trim, mois, sem).
Je suppose qu'il ne passe pas dans beforeclose de thisworkbook (là
ou je tue les menus).

Je me disais que plutôt de faire une boucle de 5 fois "delete de
chaque menu avec on error", j'aimerai bien identifier le nombre de
menus oubliés à l'ouverture, les tuer tous et en recréer un groupe
de trois. Comme cela je couvre tous les cas de figure (6 menus
oubliés, 9, 12 etc.)

Voici un exemple pour le menu trimestre, creatmenutrim ,
supprmenutrimok (ce que j'avais et qui fonctionne), supprmenutrim
(ce que j'ai créer selon ta façon (et qui ne fait rien).

Si je crée 4 menus trim, je peux lancer une boucle qui en tue 5 puis
je crée. Mais je vais bien tomber un jour sur 6 menus qui trainent.

Sub CreateMenuTrim()
Dim MenuTrimestre As CommandBarPopup
On Error Resume Next

With Application.CommandBars(1)
Set MenuTrimestre = .Controls.Add(Type:=msoControlPopup,
before:=.Controls.Count - 1)
End With
MenuTrimestre.Caption = "Trimestre"
'Creation des sous-menus
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim1"
.OnAction = "montretrim1"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim2"
.OnAction = "montretrim2"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim3"
.OnAction = "montretrim3"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Trim4"
.OnAction = "montretrim4"
End With
With MenuTrimestre.Controls.Add(msoControlButton)
.Caption = "Tout"
.OnAction = "ShowAllSh"
End With
End Sub

Sub SupprMenuTrimok()
Dim NomBarre$
NomBarre = "Trimestre"
On Error Resume Next
Application.CommandBars(1).Controls(NomBarre).Delete
End Sub

Sub SupprMenuTrim()
Dim NomBarre$
'NomBarre = "Trimestre"
On Error Resume Next
Application.CommandBars("Trimestre").Delete
End Sub

Sub aA()
Dim Mybar
On Error Resume Next
Application.commanbars("Trimestre").Delete
' Set Mybar = Application.CommandBars.Add
' Mybar.Name = "Twinley1"
End Sub


Pour présenter mon idée, mais ce code ne marche pas :

Sub SupprMenuTrimPasok()
Dim NomBarre$
NomBarre = "Trimestre"
On Error Resume Next
While CommandBars(1).Controls(NomBarre) = "Trimestre"
Application.CommandBars(1).Controls(NomBarre).Delete
Wend
End Sub

ou alors touver le nombre de fois que j'ai le menu Trimestre et je
les tue. Mais je ne trouve pas de count.

voilà,voilà, j'espère être plus clair.

à+twinley

anonymousA wrote:

bonjour,

ben ce que tu écris est bon. Il y a quand même quelque chose
d'étrange dans ta demande, car une commandbar avec un nom
spécifique ne peut avoir de doublons, donc ton affaire de 9
commandbars par groupe de 3 , I presume, me parait suspect.
Par ailleurs, la manip à faire absolument au moment de la création
de ta commandbar c'est d'écrire toujours une instruction préalable
de destruction de celle-ci

On error resume next
Application.commanbars("Twinley1").delete
set Mybar=application.commandbars.add
Mybar.name="Twinley1"

Ce faisant,tu seras certain avant création d'avoir détruit ta
commandbar, quoiqu'il ait pu se passer par ailleurs

A+




Bonjour à tous,

Je crée des menus commandbars dans l'openworkbook.
J'ai vu que parfois l'utilisateur faisait une manip inconnue qui
ne permettait pas de supprimer les menus dans le before_close.

Pour remedier à cela j'aimerai tester à l'ouverture la présence
des trois menus que j'ajoute, et s'ils sont là, les tuer jusqu'a
ce qu'il n'y en ai plus.
En usage normal, j'en crée 3, mais j'ai vu un classeur qui en
contenait 9. L'utilisateur a du planter 3 fois.

Voici l'une des trois sub pour supprimer :
Sub SupprMenuFV()
Dim NomBarre$
NomBarre = "FV"
On Error Resume Next
Application.CommandBars(1).Controls(NomBarre).Delete
End Sub

Comment tester la présence des menus que j'ajoute ?


Merci pour l'aide
--
à+twinley