Signaler

Comment s'assurer qu'on a qu'une feuille de sélectionnée ? [Résolu]

Posez votre question Bartez_Cool 11Messages postés lundi 31 mai 2004Date d'inscription 11 janvier 2017 Dernière intervention - Dernière réponse le 27 déc. 2016 à 12:50 par Bartez_Cool
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.
Afficher la suite 
Utile
+0
moins plus
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.  :)
 
albkan 2272Messages postés samedi 26 mars 2016Date d'inscription 18 janvier 2017 Dernière intervention - 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.
 
Répondre
Bartez_Cool 11Messages postés lundi 31 mai 2004Date d'inscription 11 janvier 2017 Dernière intervention - 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
Répondre
albkan 2272Messages postés samedi 26 mars 2016Date d'inscription 18 janvier 2017 Dernière intervention - 23 déc. 2016 à 23:37
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.  :)
Répondre
Bartez_Cool 11Messages postés lundi 31 mai 2004Date d'inscription 11 janvier 2017 Dernière intervention - 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.

@+
Répondre
albkan 2272Messages postés samedi 26 mars 2016Date d'inscription 18 janvier 2017 Dernière intervention - 24 déc. 2016 à 18:45
Désolé que ça n'aie pas marché. Bonnes fêtes de fin d'année à toi aussi.  :)
Répondre
Donnez votre avis
Utile
+0
moins plus
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
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !