Comment s'assurer qu'on a qu'une feuille de sélectionnée ?

Résolu/Fermé
Bartez_Cool Messages postés 15 Date d'inscription lundi 31 mai 2004 Statut Membre Dernière intervention 13 mars 2017 - Modifié par Bartez_Cool le 22/12/2016 à 15:29
Bartez_Cool Messages postés 15 Date d'inscription lundi 31 mai 2004 Statut Membre Dernière intervention 13 mars 2017 - 27 déc. 2016 à 12:50
Bonjour,

N'arrivant pas à trouver de réponse à ma question sur les divers forums que je consulte régulièrement, je viens solliciter votre aide en direct.

Voici mon problème :

Que puis-je faire pour éviter qu'un utilisateur puisse saisir une valeur quant il a sélectionné par mégarde plusieurs feuilles sur le classeur ?
Comment faire en sorte que la valeur saisie dans ce cas là, ne soit inscrite que dans la feuille active et pas dans toutes les autres ?

j'ai trouvé la petite parade ci-dessous dans le cas ou les feuilles sont sélectionnées avant qu'il ne choisisse la cellule à modifier, mais dans le cas contraire je ne vois pas comment faire. C'est à dire si le user clic sur une cellule puis sélectionne 2 feuilles et saisie une valeur sans changer de cellule. Ce qui dans ce cas là, inscrit la valeur saisie sur les 2 feuilles et ce que je voudrais éviter.

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

'si le classeur est Protégé,
If ThisWorkbook.ProtectStructure = True Then
's'assurer de n'avoir qu'une feuille de sélectionnée
ActiveSheet.Select
End If

End Sub

D'avance, un grand MERCI pour votre aide.

2 réponses

Bonjour Bartez_Cool,

Je te propose ce code VBA :


Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

  ' si le classeur est protégé,
  If ThisWorkbook.ProtectStructure = True Then
    ' s'assurer de n'avoir qu'une feuille de sélectionnée
    If ActiveWindow.SelectedSheets.Count = 1 Then
      ' mets ici ton code, qui sera exécuté pour une seule feuille
    End If
  End If

End Sub


Ton ActiveSheet.Select est inutile : la feuille active est déjà sélectionnée.

Si ton problème est réglé, merci d'aller en haut de page
pour cliquer sur « Marquer comme résolu ».

Cordialement.  :)
 
0
Bartez_Cool Messages postés 15 Date d'inscription lundi 31 mai 2004 Statut Membre Dernière intervention 13 mars 2017
22 déc. 2016 à 16:20
Merci de ta proposition, mais ça ne fonctionne pas chez moi.

En fait, si je ne change pas de cellule, cet évènement ne se déclenche pas, et dans ce cas je peux saisir une valeur dans la cellule active et cette même valeur sera inscrite aussi sur toutes les feuilles sélectionnées, et c'est justement ce que je cherche à éviter.

j'aimerais trouver quelque chose à mettre dans Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) pour que Sh soit unique et pas une collection de feuilles, mais je ne trouve pas.

J'ai essayé de redéfinir Sh avec
set Sh = activesheet, mais ça ne fonctionne pas :-(

si tu as une autre idée, je suis preneur ;-)
0
Utilisateur anonyme > Bartez_Cool Messages postés 15 Date d'inscription lundi 31 mai 2004 Statut Membre Dernière intervention 13 mars 2017
22 déc. 2016 à 19:23
 
Pour un classeur de 10 feuilles vides, sélection manuelle des feuilles 3 à 7
=> 5 feuilles sélectionnées (groupe de travail).

Worksheets("Feuil1").Select : sélection d'une feuille en dehors de la sélection
=> cette feuille est sélectionnée (feuille 1), et les autres désélectionnées.

Worksheets("Feuil5").Select : sélection d'une feuille au sein de la sélection
=> cette feuille est sélectionnée (feuille 5), et les autres désélectionnées.

Donc dans les 2 cas, on est sur une seule feuille, et la feuille sélectionnée
est la feuille active.
 
0
Bartez_Cool Messages postés 15 Date d'inscription lundi 31 mai 2004 Statut Membre Dernière intervention 13 mars 2017 > Utilisateur anonyme
23 déc. 2016 à 12:22
Merci Albkan pour ton aide, mais je pense qu'on ne se comprend pas.

Signe qu'en plus de n'être pas doué pour la programmation, je ne le suis pas non plus pour me faire comprendre :-)

Voici les 2 procédures évènementielles que j'utilise et qui me vont très bien tant que l'utilisateur ne sélectionne pas 2 feuilles avant de saisir une valeur.

Si une fois les 2 feuilles sélectionnées, il modifie la cellule active avant de saisir une valeur, la commande "SH.select" dans Workbook_SheetSelectionChange désélectionne l'ensemble des feuilles sélectionnées pour n'en garder qu'une et la saisie ne s'effectue alors par la suite que sur une feuille sélectionnée.


Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

'si le classeur est Protégé,
If ThisWorkbook.ProtectStructure = True Then
's'assurer de n'avoir qu'une feuille de sélectionnée
Set Sh = ActiveSheet
Sh.Select
'Vide le Presse-papier
Application.CutCopyMode = False 'Clear clipboard
End If

End Sub



Par contre : Si l'utilisateur se positionne directement sur la cellule qu'il souhaite modifier
puis qu'il sélectionne x feuilles supplémentaires, et qu'ensuite il saisisse une valeur dans la cellule active. La saisie se reporte sur chacune des autres feuilles sélectionnées sans que j'arrive à empêcher l'évènement de se produire.

Peut-être que je n'utilise pas le bon évènement pour insérer mon code, ou pas le bon code.
Quand je trace le code, une fois la procédure liée à l'évènement Workbook_SheetChange exécuté, l'évènement se reproduit autant de fois qu'il y avait de feuilles sélectionnées. Sh changeant bien sûr de nom à chaque fois.


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim MoisdeDépart As Date

'Tester si le Classeur est Protégé
If ThisWorkbook.ProtectStructure = True Then

' 's'assurer de n'avoir qu'une feuille de sélectionnée
' Set Sh = ActiveSheet
' Sh.Select

'Vide le Presse-papier
Application.CutCopyMode = False

End If

'test si le changement est intervenu sur une des 13 premières feuilles du classeur
'dans la colonne 2 (Menus) ou la colonne 153 (Catégories)
If Target.Column = 2 Or Target.Column = 153 And Sh.Index < 14 Then

'copier la nouvelle valeur de la cellule modifiée
Target.Copy

'Boucler sur tous les mois suivant
For I = Sh.Index To 13
'Pour Inscrire la valeur sur les mois suivants
Worksheets(I).Range(Target.Address).PasteSpecial Paste:=xlPasteValues
Next I

'vider le contenu du presse papier
Application.CutCopyMode = False

End If

End Sub
0
Utilisateur anonyme > Bartez_Cool Messages postés 15 Date d'inscription lundi 31 mai 2004 Statut Membre Dernière intervention 13 mars 2017
Modifié par albkan le 23/12/2016 à 23:45
Bonjour Bartez_Cool,

Si tu veux empêcher la sélection de plusieurs feuilles, essaye ce
qui est dans ce message #5228061 de Frédéric Sigonneau.

Je rappelle que plusieurs feuilles = un groupe de travail.
Note bien que c'est à faire dans ThisWorkbook.

J'espère que ça marchera. À te lire.  :)
0
Bartez_Cool Messages postés 15 Date d'inscription lundi 31 mai 2004 Statut Membre Dernière intervention 13 mars 2017 > Utilisateur anonyme
24 déc. 2016 à 18:43
Bonsoir Albkan,

hé bien non, ça ne fonctionne pas. c'est ce que j'explique plus haut à savoir que si on ne change pas de cellule une fois qu'on a sélectionnées plusieurs feuilles, l’événement Workbook_SheetSelectionChange ne se produit pas car il ne se produit que lorsqu'on change de cellule.

Je pense que ce ne doit pas être possible.

Merci quand même pour ton aide et ton temps passé sur mon problème et je te souhaite de passer de bonnes fêtes de fin d'année.

@+
0
Bartez_Cool Messages postés 15 Date d'inscription lundi 31 mai 2004 Statut Membre Dernière intervention 13 mars 2017
27 déc. 2016 à 12:50
Voici le code proposé par Shakki que j'ai modifié pour l'adapter à mes besoins.

Même si ce n'est pas très propre comme programmation, ça fonctionne comme je le souhaitais à savoir que la donnée saisie par l'utilisateur est inscrite uniquement sur la feuille active. Les autres feuilles sélectionnées ne sont plus impactées et cela reste transparent pour l'utilisateur.

Encore merci à Shakki pour son aide et Bonnes fêtes de fin d'année à tous !


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim SheetActif As String
Dim CelActive As Variant

'désactivez les événements :
Application.EnableEvents = False

If ActiveWindow.SelectedSheets.Count > 1 Then

'Récupérer le nom de la feuille affichée
SheetActif = Sh.Name
'Récupérer le contenu de la cellule modifiée
CelActive = Target.Value

'Annuler la dernière opération lancée depuis l'interface utilisateur
Application.Undo

'Désélectionner toutes les feuilles sauf la feuille active
Sheets(SheetActif).Select
ActiveCell.Value = CelActive

End If

'Réactivez les événements :
Application.EnableEvents = True

End Sub
0