Empêcher de changer de feuille

Bonjour à tous,

Je fais appel une nouvelle fois au savoir de la communauté.

Comme expliqué dans le titre je voudrais empêcher l'utilisateur de naviguer sur d'autres onglets durant l'exécution d'une Macro.

Le problème détaillé:

Je propose un déplacement de ligne sur un planning via un UserForm avec des RefEdit (un pour la ligne de départ et un pour la ligne d'arrivée)

J'effectue ensuite le déplacement en récupérant les numéros de ligne obtenus via les RefEdit mais je ne tiens pas compte du nom de la feuille puisqu'ils ne sont pas censé changer de feuille...

Du coup je voudrais limiter le risque de déplacement malencontreux en empêchant la navigation sur une autre feuille.

Je pensais avoir la solution avec "DisplayWorkbookTabs = False" mais je n'empêche pas le déplacement, juste l'affichage des onglets !

De plus j'ai beau remettre "DisplayWorkbookTabs = True" les onglets n'apparaissent pas immédiatement la macro terminée.

En espérant avoir été assez clair.

Merci pour votre aide

Bonjour,

pour agir une une feuille, celle-ci n'a pas besoin d'être active il suffit de le mentionner dans le code

par exemple:

With Sheets("Feuil2")
.Range("A1") = "ok"
End With

Bonjour Isabelle,

J'ai essayé ce que tu as proposé (si j'ai bien compris) à savoir exécuter mon code au sein d'un 'with' avec ma feuille.

Malheureusement ça n'empêche pas de changer de feuille

"Feuille où je souhaite faire le déplacement : MeF Code

"UserForm contenant les 2 RefEdit: UserFormMeF

With Sheets("MeF Code")

UserFormMeF.Show

End With

Une fois exécuté j'ai pu changer de feuille sans restrictions

Bonjour,

tu peux les masquer xlSheetVeryHidden le temps de la macro.

Ou bien tu contrôles ActiveSheet au moment de l'utilisation du RefEdit

eric

Bonjour PinkRabbit, eriiic,

J'ai essayé ce que tu as proposé (si j'ai bien compris)

non, ce que je voulais dire c'est qu'une feuille n'a pas besoin d'être visible ou active pour agir sur cette feuille

il faut juste mentionner dans le code que l'action se passe sur tel ou tel feuille

par exemple:

si j'écris le code

Cells(1,1) = "blabla"

la valeur "blabla" sera inscrit dans la cellule A1 de la feuille active.

par contre si j'écris

Sheets("Feuil2").cells(1,1) = "blabla"

la valeur "blabla sera inscrit sur la Feuil2 cellule A1 peu importe que Feuil2 soit active ou non, ou visible ou non.

pour le RefEdit tu pourrais ajouter ce code

Private Sub RefEdit1_DropButtonClick()
If ActiveSheet.Name <> "Feuil3" Then Sheets("Feuil3").Activate
End Sub

Isabelle, Eric,

Merci pour vos propositions !

@Eriiic

Le fait de les masquer j'y avais pensé mais comme le fichier sera très sécurisé à terme, j'aurai préféré éviter toute la manipulation de déverrouiller, tout masquer tout réafficher et tout reverouiller... Mais lc'est en effet une solution viable

@i20100

Super idée ! C'est malin et élégant, je me suis donc précipité pour essayer... En pratique j'ai quelques bugs:

* Le nom de la feuille reste celui qui a été sélectionné bien que ça ne change pas de feuille

* Le nom de la feuille reste celui qui a été sélectionné bien que je sélectionne une cellule de la feuille "Plannning" ! (L'impact sur le code est nul puisque je ne récupère que le numéro de la ligne, cependant je trouve cela perturbant pour un utilisateur un minimum averti)

* La suite de mon code ne s'exécute plus une fois que j'ai choisi une autre feuille ! Et ça je ne le comprends pas. C'est pour cela que je voulais empêcher de changer de feuille car mon UserForm ne fonctionne plus une fois qu'une autre feuille a été sélectionnée...

Ci-dessous tout le code de mon UserForm :

Private Sub UserForm_Initialize()
    RefEditOrigine.Text = ActiveCell.Address
    LabelNomOrigine = Range("C" & ActiveCell.Row).Value
    RefEditDestination.SetFocus
End Sub

Private Sub RefEditOrigine_Change()
    ' Limite la plage de sélection à une seule cellule

    If RefEditOrigine.Value = "" Or InStr(1, RefEditOrigine.Value, ":") > 0 Then
        RefEditOrigine.Value = vbNullString ' Rend le champ vierge en cas de plage et pas une seule cellule
    Else
        ' Récupère le nom de l'employé sur la ligne
        LabelNomOrigine.Caption = Range("C" & Range(RefEditOrigine.Value).Row).Value
        If LabelNomOrigine.Caption = "" Then
            ' Contrôle pour ne pas supprimer de ligne contenant les NiveauX
            MsgBox "Ligne sélectionnée non valide" & Chr(10) & "Choisir une ligne contenant un collaborateur"
            RefEditOrigine.Value = vbNullString
        End If
    End If

    Call activer_CommandButtonValider

End Sub

Private Sub RefEditDestination_Change()
    ' Idem ci-dessus
    If RefEditDestination.Value = "" Or InStr(1, RefEditDestination.Value, ":") > 0 Then
        RefEditDestination.Value = vbNullString
    Else
        LabelNomDestination.Caption = Range("C" & Range(RefEditDestination.Value).Row).Value
    End If

    Call activer_CommandButtonValider

End Sub

Private Sub RefEditOrigine_DropClickButton()
    If ActiveSheet.Name <> "Planning" Then
        Sheets("Planning").Activate
        RefEditOrigine.Value = vbNullString
    End If
End Sub

Private Sub RefEditDestination_DropClickButton()
    If ActiveSheet.Name <> "Planning" Then
        Sheets("Planning").Activate
        RefEditDestination.Value = vbNullString
    End If
End Sub

Private Sub CommandButtonValider_Click()
    ' Renvoie l'adresse des cellules sélectionnées
    Ligne_Origine = RefEditOrigine.Text
    Ligne_Destination = RefEditDestination.Text

    Unload Me
End Sub

Private Sub activer_CommandButtonValider()
    ' Valider uniquement si les 2 plages ont été sélectionnées

    If RefEditOrigine.Text <> "" And RefEditDestination.Text <> "" Then
        CommandButtonValider.Caption = "Valider"
        CommandButtonValider.Enabled = True
    Else
        CommandButtonValider.Caption = "Valider..."
        CommandButtonValider.Enabled = False
    End If

End Sub

Merci beaucoup pour votre temps et vos idées

Il me reste toujours la solution de masquer les feuilles mais au-delà du code j'aurai aimé résoudre cette situation. Je pense qu'y apporter une réponse pourrait me servir plus tard

Bonjour PinkRabbit, eriiic,

un autre possibilité sans le RefEdit

22test-selection.xlsm (25.89 Ko)

Bonjour,

Pas besoin de déverrouiller quoique ce soit pour masquer une feuille.

Autre proposition :

Private Sub RefEditOrigine_Change()
    ' Limite la plage de sélection à une seule cellule

    If ActiveSheet.Name <> "mafeuille" Then
        MsgBox "Restez sur cette feuille non d'un chien"
        Sheets("mafeuille").Select
        RefEditOrigine.Value = vbNullString
    ElseIf RefEditOrigine.Value = "" Or InStr(1, RefEditOrigine.Value, ":") > 0 Then
        RefEditOrigine.Value = vbNullString ' Rend le champ vierge en cas de plage et pas une seule cellule
    Else
        ' suite du code

eric

Isabelle, Eric,

Merci beaucoup pour vos propositions.

Il n'existe pas de propriété ou méthode pour indiquer à Excel de ne pas changer de feuille.

Au final la méthode qui consiste à faire revenir via un .Select ou .Activate sur la feuille que l'on souhaite dessert l'adresse mentionnée dans le RefEdit qui reste figé sur la feuille sélectionnée précédemment et bloque la suite du code

Je vais donc m'orienter vers la solution de masquer les feuilles.

@eriiic

Il faut tout de même déprotéger le classeur pour pouvoir masquer les feuilles

@i20100

Merci pour le code que tu m'as donné, la méthode des inputbox type:=8 est bien aussi

Je mets le sujet en résolu

Bonne journée à vous et merci encore !

Rechercher des sujets similaires à "empecher changer feuille"