XL 2016 Rendre inactif le bouton affiché liste macro.

Sacha1980

XLDnaute Nouveau
Hello tout le monde,

Je cherche le moyen de pouvoir rendre inactif le bouton afficher la liste des macros à l'ouverture du classeur afin d'empêcher l'utilisation de certaines macros par des joueurs, car ce classeur sera dispo en téléchargement.

Dans la liste des macros il y a des macros qui inversent la première et il ne faut pas que les joueurs puissent inverser en cliquant sur la liste des macros ou alt+F8 et inverser en faisant exécuter la macro !

Le bouton afficher la liste des macros est dispo dans le menu développeur ainsi que dans le menu affichage.

donc ce bouton :
Capture.PNG

Est-ce possible ? c'est pour mettre dans Workbook_Open()

Merci.
Sacha.
 

BrunoM45

XLDnaute Barbatruc
Bonjour Sacha1980

Plutôt que d'essayer de masquer le bouton, il suffit d'ajouter un argument à la procédure, exemple :
VB:
Sub Toto()
End Sub
A remplacer par
Sass:
Sub Toto(Flg as Boolean)
En Sub
L'appel ne pourra se faire qu'avec l'argument
Code:
Call Toto(True)
Ou sinon mettre les Sub en Private

@+
 

Sacha1980

XLDnaute Nouveau
Bonjour Sacha1980

Plutôt que d'essayer de masquer le bouton, il suffit d'ajouter un argument à la procédure, exemple :
VB:
Sub Toto()
End Sub
A remplacer par
Sass:
Sub Toto(Flg as Boolean)
En Sub
L'appel ne pourra se faire qu'avec l'argument
Code:
Call Toto(True)
Ou sinon mettre les Sub en Private

@+
Hello Bruno,

Merci pour ton aide, oui en effet c'est aussi efficace d'autant plus que les macros concernés, je n'ai pas mis de raccourci clavier pour les appeler.

Par contre, je n'ai pas compris l'appel ne pourrai se faire qu'avec l'argument
VB:
Call Toto(True)

Que veux-tu dire par appeler ?

Merci.
Sacha.
 

soan

XLDnaute Barbatruc
Bonjour Sacha, Bruno,

Sub Toto(Flg as Boolean)

l'argument Flg n'est pas optionel ; il est donc obligatoire ➯ on doit le mettre lors de l'appel :

Call Toto(True) ou plus simplement : Toto True



l'argument Flg aurait été optionnel si l'en-tête de la sub était :

Sub Toto(Optional Flg as Boolean)

soan
 

soan

XLDnaute Barbatruc
ajout :

il y a la sub proprement dite ; exemple :

VB:
Sub Hello(msg$)
  MsgBox msg
End Sub

qui n'apparaît qu'une fois dans le code VBA.

et son appel, ou ses appels :

VB:
Sub Essai()
  Hello "message 1"
  Hello "message 2"
  Hello "message 3"
End Sub

la sub Hello() est appelée 3× par la sub Essai(), et affichera successivement les 3 messages "message 1", puis "message 2", puis "message 3".​

soan
 

Sacha1980

XLDnaute Nouveau
Bonjour Sacha, Bruno,

Sub Toto(Flg as Boolean)

l'argument Flg n'est pas optionel ; il est donc obligatoire ➯ on doit le mettre lors de l'appel :

Call Toto(True) ou plus simplement : Toto True



l'argument Flg aurait été optionnel si l'en-tête de la sub était :

Sub Toto(Optional Flg as Boolean)

soan
Hello Soan,

Merci, pas certain d'avoir bien tout compris, du moins sur la partie
call toto (True)
J'ai fait ainsi :

VB:
Sub Onglet_visible(Flg As Boolean)
ActiveWindow.DisplayWorkbookTabs = True
Call Onglet_visible(True)
End Sub

Est-ce bon ?
 

soan

XLDnaute Barbatruc
ah non, c'est pas bon : là, la sub Onglet_visible() fait appel à elle-même ! car Call Onglet_visible(True) est dans le corps de la sub Onglet_visible() ; en fait, c'est pas interdit qu'une sub s'appelle elle-même ; mais dans ce cas c'est des subs spéciales car elles sont récursives ; exemple : une sub de Tri QuickSort.

une sub récursive s'appelle donc elle-même, mais elle doit être écrite de telle façon qu'il y ait « un point de sortie » ; sans cela, ça bouclerait indéfiniment !​

soan
 

soan

XLDnaute Barbatruc
je te propose d'écrire :

VB:
Sub Onglet_visible(Flg As Boolean)
  ActiveWindow.DisplayWorkbookTabs = True
End Sub

Sub Essai()
  Onglet_visible True
End Sub



autre possibilité :

VB:
Sub Onglet_visible(dummy As Byte)
  ActiveWindow.DisplayWorkbookTabs = True
End Sub

Sub Essai()
  Onglet_visible 0
End Sub

dummy signifie « stupide » ; c'est un bon moyen pour se rappeler que l'argument est bidon car cet argument n'est pas utilisé dans la sub Onglet_visible() ; l'argument est utilisé uniquement pour que la macro n'apparaisse pas dans la liste des macros.

tu as pu remarquer que j'ai changé le type de la variable : ce n'est plus un Boolean mais un Byte.​



j'ai vu ton post précédent qui disait que maintenant tu as bien compris. 👍

soan
 
Dernière édition:

Sacha1980

XLDnaute Nouveau
je te propose d'écrire :

VB:
Sub Onglet_visible(Flg As Boolean)
  ActiveWindow.DisplayWorkbookTabs = True
End Sub

Sub Essai()
  Onglet_visible True
End Sub

autre possibilité :

VB:
Sub Onglet_visible(dummy As Byte)
  ActiveWindow.DisplayWorkbookTabs = True
End Sub

Sub Essai()
  Onglet_visible 0
End Sub

dummy signifie « stupide » ; c'est un bon moyen pour se rappeler que l'argument est bidon car cet argument n'est pas utilisé dans la sub Onglet_visible() ; l'argument est utilisé uniquement pour que la macro n'apparaisse pas dans la liste des macros.​

soan
Alors, j'ai bien compris maintenant cela, mais ce n'est pas ce que je recherche ! ton système d'appel de la sub d'origine et bien il retrouve la possibilité d'inverser dans la liste des macros Alt+F8 ! Et moi je ne veux pas qu'on puisse trouver la macro dans la liste des macros !

Donc en faisant juste
VB:
Sub Onglet_visible(Flg As Boolean)

  ActiveWindow.DisplayWorkbookTabs = True

End Sub

Là la macro n'est plus affichée dans la liste des macros, cependant, moi le créateur du fichier, dans le module du VBA je peux l'inverser, mais avec le flg, ben je ne peu plus l'inverser, il faut que j'enlève Flg As Boolean pour l'exécuter dans le module !

Vais pas m'amuser à chaque fois retirer Flg As Boolean et ensuite le remettre et ce pour chaque macro lol.
 

soan

XLDnaute Barbatruc
??? ben non, pour l'exécuter dans le module, tu écris bien une instruction qui appelle la sub Onglet_visible() ; cette instruction, c'est : Onglet_visible True ; mais cette instruction, tu ne peux pas la mettre en dehors d'une sub, et tu ne peux pas la mettre dans la même sub Onglet_visible() sinon elle sera récursive (ce qui n'est pas ce qu'on veut) ; donc seule solution : faut mettre cette instruction dans une autre sub, par exemple dans la sub Essai() : regarde de nouveau la 1ère possibilité que j'avais indiquée dans mon post #8.
soan
 

soan

XLDnaute Barbatruc
maintenant, si vraiment tu veux inverser, tu peux mettre :

VB:
Sub Onglet_visible(Flg As Boolean)
  ActiveWindow.DisplayWorkbookTabs = Not ActiveWindow.DisplayWorkbookTabs
End Sub

Sub Essai()
  Onglet_visible 0
End Sub

à chaque fois que tu exécuteras la sub Essai(), les onglets seront successivement masqués puis affichés ; remarque : le 0 n'est pas une erreur : c'est l'équivalent de False ; j'aurais aussi pu mettre Onglet_visible -1 car -1 est l'équivalent de True ; et de toutes façons, 0 ou 1, peu importe puisque Flg est un argument bidon car non utilisé dans la sub Onglet_visible().​

soan
 

Sacha1980

XLDnaute Nouveau
??? ben non, pour l'exécuter dans le module, tu écris bien une instruction qui appelle la sub Onglet_visible() ; cette instruction, c'est : Onglet_visible True ; mais cette instruction, tu ne peux pas la mettre en dehors d'une sub, et tu ne peux pas la mettre dans la même sub Onglet_visible() sinon elle sera récursive (ce qui n'est pas ce qu'on veut) ; donc seule solution : faut mettre cette instruction dans une autre sub, par exemple dans la sub Essai() : regarde de nouveau la 1ère possibilité que j'avais indiquée dans mon post #8.
soan
 

patricktoulon

XLDnaute Barbatruc
tiens regarde
VB:
Function Onglet_visible()
  ActiveWindow.DisplayWorkbookTabs = Not ActiveWindow.DisplayWorkbookTabs
End Function

Sub Essai()
  Onglet_visible
End Sub
tu ne verra pas onglet_visible dans la liste de macro mais si tu lance la sub essai ca marchera

comme chez renault c'est simple

bonsoir Soan
 
Dernière édition:
Haut Bas