Ralentissement bloqué la saisie mais pas la selection
Bonjour,
Je suis entrain de travailler sur un fichier pour gérer un stock. Afin d'éviter les erreurs de saisie, un stock négatif et que les operateurs supprime les formules j'ai donc décider de passer par un formulaire qui s'ouvre a l'appuie de la touche "entrée" quand on est sur une cellule. Jusque la tout vas bien. En revanche la saisie était possible sans passé par le formulaire. Pour contourner le problème j'ai commencé par simuler un Ctrl + Z avec SendKeys en revanche cette solution rentrée en confusion avec le pad numérique et le désactivait aléatoirement.
J'ai donc chercher une autre solution et j'ai trouvé ceci que j'ai mis dans un module et que j'appel depuis mes différentes feuilles :
Sub SelectionChange(ByVal Target As Range)
Application.ScreenUpdating = False
Dim PlageStock As Range, PlageInventaire As Range
Set PlageInventaire = [A5:B300]: Set PlageStock = [K5:VJ300]
If Not Intersect(Target, PlageStock) Is Nothing Then
ActiveSheet.Protect "1", Contents:=True, userInterfaceOnly:=True
Intersect(Target, PlageStock).Select
End If
If Not Intersect(Target, PlageInventaire) Is Nothing Then
ActiveSheet.Protect "1", Contents:=True, userInterfaceOnly:=True
Intersect(Target, PlageInventaire).Select
End If
End SubLe problème c'est que cette solution ralenti énormément la navigation a l'aide des flèche directionnelle ... Puisque si je comprend bien celle ci ôte la protection a chaque changement de sélection. (Je l'ai aussi essayer dans une feuille dans passé par un module mais aucune différence ...)
Ma protection est configuré comme ci-dessous :
J'ai aussi besoin de pouvoir utiliser les regroupements présent dans toutes mes feuilles, que j'ai autoriser a l'aide de ce code :
Private Sub Workbook_Open()
Dim Feuille As Worksheet
For Each Feuille In ThisWorkbook.Worksheets
With Feuille
.EnableAutoFilter = True
.EnableOutlining = True
.Protect "1", Contents:=False, userInterfaceOnly:=True
End With
Next
End Sub Ma question est la suivante : Comment puis-je faire pour pouvoir permettre la sélection et l'utilisation des regroupements tout en verrouillant la modification manuel et surtout sans avoir de ralentissement ? Sachant que la touche "entrée" est obligatoire pour l'ouverture du formulaire en terme d'ergonomie d'utilisation ...
Par avance merci pour votre aide
Bonjour,
En effet, l'évènement peut ralentir pas mal.
Pour ma part, je reviendrais sur une solution Excel.
Je sais pas si vous savez mais vous pouvez avoir des validations de données par formules. Par exemple, vous pouvez avoir une formule de type :
=stockdepart + entree - sortie >= 0Vous pouvez personnaliser les messages d'alerte. De cette manière, on empeche une mauvaise saisie ou on avertit qu'il y a un ajustement à faire.
Vous pouvez valider de plein de façons vos autres données à saisir...
Ensuite, pour les cellules à formules, vous les laissez verrouillées tandis que que vous déverrouillez les cellules de saisie et alors, à la protection de la feuille, on ne pourra plus modifier les formules mais on pourra toujours saisir. Le verrouillage des cellules est accessible par format de cellule/protection.
La macro ne sera donc plus nécessaire du tout.
Cdlt,
bonjour à tous,
tu as écris une macro qui se déclenche dès lors qu'une cellule est sélectionnée. Or dans ta macro tu sélectionnes des cellules, ce qui provoque le déclenchement de la macro à répétition et donc des ralentissements. Si cette récursivité n'est pas nécessaire, utilise application.enableevents
Sub SelectionChange(ByVal Target As Range)
Application.ScreenUpdating = False
Dim PlageStock As Range, PlageInventaire As Range
Set PlageInventaire = [A5:B300]: Set PlageStock = [K5:VJ300]
application.enableevents=false
If Not Intersect(Target, PlageStock) Is Nothing Then
ActiveSheet.Protect "1", Contents:=True, userInterfaceOnly:=True
Intersect(Target, PlageStock).Select
End If
If Not Intersect(Target, PlageInventaire) Is Nothing Then
ActiveSheet.Protect "1", Contents:=True, userInterfaceOnly:=True
Intersect(Target, PlageInventaire).Select
End If
application.enableevents=true
End SubBonjours
Merci pour vos réponse, je vous mets un screen de mon fichier
@h2so4, ta solution maintient le ralentissement, je me suis donc dit au pire je ne réactive pas le "application.enableevents" mais si je vais dans une autre feuille la solution ne fonctionne pas, je me suis donc dit au pire je la réactive a l'activation de la feuille mais cela ne fonctionne pas ...
Bonjour,
puisque ton but est de forcer l'utilisation du formulaire, pourquoi ne pas l'afficher sur l'événement SelectionChange ?
Tu le fais sur une des colonne et empêche la sélection des autres.
eric
re-bonjour,
@h2so4, ta solution maintient le ralentissement,
c'est qu'il y a autre chose dans ton fichier qui provoque le ralentissement, difficile d'en dire plus sans ton fichier et sans boule de cristal.
Re-Bonjour,
Problème résolu
J'ai modifier le code a l'ouverture du classeur comme ci dessous :
Private Sub Workbook_Open()
Dim Feuille As Worksheet
For Each Feuille In ThisWorkbook.Worksheets
With Feuille
.EnableAutoFilter = True
.EnableOutlining = True
.Protect "1", userInterfaceOnly:=True
End With
Next
End SubEn faite il fallait juste enlever : "Contents:=False" et j"ai completement supprimer mon Sub que j'avais mis dans mon module.
Avant de clôturer le sujet une petite dernière question, savez vous s'il est possible de supprimer ce message lorsqu'on essaye de saisir sans passer par le formulaire ?