Microsoft 365 Ne pas sortir d'un onglet sauf en exécutant une macro

Usine à gaz

XLDnaute Barbatruc
Bonjour à toutes et à tous,
Je vous souhaite un beau dimanche :)

Je n'arrive pas à coder :
Je voudrais qu'il ne soit pas possible de changer d'onglet sauf UNIQUEMENT en exécutant la macro "action"
Et qu'il ne puisse pas être possible de changer d'onglet en cliquant sur un autre onglet


Pourriez-vous m'aider,
Je joins un p'tit fichier test.
Grands Mercis ;)
Amicalement,
lionel,
 

Pièces jointes

  • Revient à onglet actif.xlsm
    32.9 KB · Affichages: 8

Dudu2

XLDnaute Barbatruc
Bonjour,

Et une fois que tu es sur Feuil7, tu fais comment puisqu'il n'y a pas de bouton Action ?
A adapter selon besoin...
Dans la classe ThisWorkbook:
VB:
Option Explicit

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    Application.EnableEvents = False
    'If Not ActionDéclenché Then ThisWorkbook.Worksheets("Action").Activate
    If Not ActionDéclenché Then Sh.Activate
    ActionDéclenché = False
    Application.EnableEvents = True
End Sub

Dans le Module1:
Code:
Option Explicit

Public ActionDéclenché As Boolean

Sub Action()
    ActionDéclenché = True
    Sheets("Feuil7").Range("G6") = "action exécutée"
    Sheets("Feuil7").Select
    [g6].Select
End Sub
 
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Bonjour Dudu2,
Merci pour les codes. je vais tester.

"Et une fois que tu es sur Feuil7, tu fais comment puisqu'il n'y a pas de bouton Action ?"
Pour les autres feuilles, je dois pouvoir changer de feuille sans avoir besoin d'exécuter un code.

Merci à toi :)
 

Dudu2

XLDnaute Barbatruc
Ah ben oui, ça je te l'avais dit.
Dans la classe ThisWorkbook:
VB:
Option Explicit

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    If Sh.Name = NomFeuilleAction Then
        If Not ActionDéclenché Then
            Application.EnableEvents = False
            Sh.Activate
            Application.EnableEvents = True
        End If
        ActionDéclenché = False
    End If
End Sub

Dans le Module1:
Code:
Option Explicit

Public ActionDéclenché As Boolean
Public Const NomFeuilleAction = "action"

Sub Action()
    ActionDéclenché = True
    Sheets("Feuil7").Range("G6") = "action exécutée"
    Sheets("Feuil7").Select
    [g6].Select
End Sub
 

Usine à gaz

XLDnaute Barbatruc
Merci Dudu2 :)
Mais ça beugue là :
1636289287949.png
 

Dudu2

XLDnaute Barbatruc
Ben ça devrait pas si tu recopies le code du Module1.
1636289555810.png


Ou alors tu déplaces le code dans la feuille "action" comme le suggère @mapomme.
Code:
Option Explicit

Private Sub Worksheet_Deactivate()
    If Not ActionDéclenché Then
        Application.EnableEvents = False
        Me.Activate
        Application.EnableEvents = True
    End If
    ActionDéclenché = False
End Sub

Perso je préfère avoir le code dans le Workbook pour 2 raisons:
- Si on supprime la feuille dans des manips le code est préservé
- On a les différents codes éventuels regroupés.
En contrepartie ça oblige d'utiliser le nom ou l'index des feuilles si les traitements sont spécifiques.
 

fanch55

XLDnaute Barbatruc
Bonjour à tous,
une méthode parmi d'autres:
Dans le module:
VB:
Public Sh_Prev As Worksheet

Sub action()
    Application.EnableEvents = False
        Sheets("Feuil7").Range("G6") = "action exécutée"
        Sheets("Feuil7").Select
        [g6].Select
        Set Sh_Prev = ActiveSheet
    Application.EnableEvents = True
End Sub

Dans Thisworkbook:
Code:
Private Sub Workbook_Open()
    Set Sh_Prev = ActiveSheet
End Sub

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    If Sh_Prev Is Nothing Then Set Sh_Prev = Sh
    If Sh_Prev.Name = Sh.Name Then Sh_Prev.Activate
End Sub

Et le seul moyen de t'en sortir : te mettre en mode création ....
 

Usine à gaz

XLDnaute Barbatruc
Bonjour à tous,
une méthode parmi d'autres:
Dans le module:
VB:
Public Sh_Prev As Worksheet

Sub action()
    Application.EnableEvents = False
        Sheets("Feuil7").Range("G6") = "action exécutée"
        Sheets("Feuil7").Select
        [g6].Select
        Set Sh_Prev = ActiveSheet
    Application.EnableEvents = True
End Sub

Dans Thisworkbook:
Code:
Private Sub Workbook_Open()
    Set Sh_Prev = ActiveSheet
End Sub

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    If Sh_Prev Is Nothing Then Set Sh_Prev = Sh
    If Sh_Prev.Name = Sh.Name Then Sh_Prev.Activate
End Sub

Et le seul moyen de t'en sortir : te mettre en mode création ....
Bonjour fanch55,
Merci d'être là :)
Je vais tester aussi,
 

fanch55

XLDnaute Barbatruc
Sinon une autre version courte :

Module:
VB:
Sub action()
    Sheets("Feuil7").Range("G6") = "action exécutée"
    Sheets("Feuil7").Select
    [g6].Select
    ActiveWindow.DisplayWorkbookTabs = False
End Sub
Sub SetTabs()
     ActiveWindow.DisplayWorkbookTabs = Not ActiveWindow.DisplayWorkbookTabs
End Sub

Thisworkbook:
VB:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ActiveWindow.DisplayWorkbookTabs = True
   Application.OnKey "^f"
End Sub
Private Sub Workbook_Open()
    Application.OnKey "^f", "SetTabs" ' ctrl+f
    SetTabs
End Sub

Plus d'onglet à cliquer 😁
Garde-fou : faire Ctrl+f pour afficher ou non les onglets .... 🥳
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
314 628
Messages
2 111 336
Membres
111 104
dernier inscrit
JEMADA