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 WithBonjour 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 SubIsabelle, 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 SubMerci 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,
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 codeeric
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 !