XL 2013 [RESOLU] Comment annuler un groupe de travail en VBA ?

bipbip

XLDnaute Nouveau
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 :

J'ai des utilisateurs qui créent involontairement des groupes de travail par de mauvaises manipulations (Ctrl ou Shift associé au Clic de souris).
Dans le cas de groupe de travail, le problème c'est que quand ils saisissent ensuite des valeurs sur la feuille visible, les valeurs sont inscrites sur l'ensemble des feuilles le composant et c'est justement ce que je voudrais empêcher.

Question n°1 : Existe-t-il un moyen pour éviter qu'un utilisateur crée un groupe de travail ?

j'ai mis en place la vérification suivante, qui fonctionne très bien dans le cas ou l'utilisateur change de cellule active après avoir créé le groupe de travail et avant de saisir une valeur dans cette cellule, mais qui ne fonctionne pas s'il ne change pas de cellule active car l'évènement ne se produit pas.

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
's'assurer de n'avoir qu'une feuille de sélectionnée
Sh.Select
End Sub

Question n°2 : Existe-t-il un moyen palier à ce problème ?


D'avance, un grand MERCI pour votre aide.
 

Lone-wolf

XLDnaute Barbatruc
Bonjour bipbip et Joyeux Noël :)

Question: les valeurs sont inscrites sur l'ensemble des feuilles et c'est justement ce que je voudrais empêcher.

Ajoute ceci dans ce cas, en prenant soin de changé le nom de la feuille sh.

VB:
Option Explicit

Sub test()
Dim sh As Worksheet, i As Long

Set sh = Sheets("Feuil1")
sh.Range("b2") = "Copier"
For i = 1 To Sheets.Count
Sheets(i).Range("b2") = sh.Range("b2")
If Sheets(i).Name <> sh.Name Then Sheets(i).Range("b2").ClearContents: Exit Sub
Next i

End Sub

À tester. Mais il serait bien que tu mette le fichier pour plus d'éfficacité.
 
Dernière édition:

bipbip

XLDnaute Nouveau
Bonjour Lone-wolf et bon noël à toi aussi.

Merci de prendre du temps pour tenter de me trouver une solution.

Je t'aurais bien fait passer un fichier test, mais ça ne servirait à rien car avec un simple fichier vide on peut recréer tout de suite le problème.
Créer un classeur contenant 3 feuilles.
Créer dans Thisworkbook la procédure suivante:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
's'assurer de n'avoir qu'une feuille de sélectionnée
Sh.Select
End Sub

Ensuite :
Sélectionner la cellule A1 de la 1ere feuille.
Créer un groupe de travail (touche Shift appuyée + Clic de souris sur la 3em feuille)
Ne rien faire de plus
Saisir "COUCOU" dans la cellule active A1 de la feuille 1 actuellement visible.
Maintenant passer sur les 2 autres feuilles et vérifier que "COUCOU" est bien inscrit dans Feuille1!A1 et Feuille2!A1.

Donc ma question est comment faire pour éviter cela sachant que j'ai besoin d'utiliser l'évènement Workbook_SheetSelectionChange
pour faire un traitement suivant ce qui a été saisie par l'utilisateur et dans quelle cellule a été fait la saisie et que Workbook_SheetSelectionChange ne se déclenche qu'après que la valeur est déjà été saisie en qu'on ne peux pas annuler cette saisie.

Je tourne en rond, sans trouver de solution.
J'avais penser intercepter le Clic de souris pour tenter d'annuler le groupe de travail dès sa création, mais il n'existe pas de Workbook_SheetBeforeClick mais juste Workbook_SheetBeforeDoubleClick. Dommage :-(

Si tu as une idée pour contourner le problème, je suis preneur :)
@+
 

Shakki

XLDnaute Occasionnel
Bonjour,

Il y a quelques temps j'avais récupéré un code trouvé sur le net pour empêcher la saisie si plusieurs feuilles étaient sélectionnées (je ne sais malheureusement plus qui en est l'auteur, j'ai oublié de le noter). Peut-être pourra-t-il t'être utile.

VB:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  Static Count As Integer
  On Error GoTo EndHandler

  If Count = 0 Then
    If ActiveWindow.SelectedSheets.Count > 1 Then
      Count = ActiveWindow.SelectedSheets.Count
      MsgBox "Vous êtes en groupe de travail. La saisie a été annulée", vbExclamation
      Application.EnableEvents = False
      Application.Undo
    End If
    Else
    Count = Count - 1
  End If
EndHandler:
  Application.EnableEvents = True
End Sub

A+
 

bipbip

XLDnaute Nouveau
Merci Shakki pour ton code qui dans l'état, indique à l'utilisateur qu'il doit ne sélectionner qu'une seule feuille ce qui règle déjà mon problème

Mais je vais voir ce que je peux en tirer si je peux le modifier car ce qui serait top ce serait que la valeur saisie ne soit pas annulée et bien saisie sur la feuille active et annulée sur les autres feuilles.

@+
 

bipbip

XLDnaute Nouveau
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
 

Discussions similaires

Statistiques des forums

Discussions
312 069
Messages
2 085 042
Membres
102 765
dernier inscrit
richdi