Application.Intersect vs WorksheetSelection_Change

pacoako

XLDnaute Occasionnel
Bonjour à tous!

J'ai un petite question à savoir si c'est faisable ou non.

Je voulais savoir si s'était possible lorsqu'un utilisateur coupe une zone de cellule en sélectionnant le contour de la cellule et en la déplacant, que dès qu'il passe au dessus d'une zone défini, qu'un message lui dise qu'il n'a pas le droit de passer dans cette zone..

Je sais que c'est possible avec application.intersect d'empêcher la sélection d'une zone. Mais cette option n'empêche pas l'utilisateur de couper un zone de cellule et de la coller dans la zone interdite.

Et je sais que c'est possible d'empêcher la modification d'une zone de la même façon en ajoutant un application.undo pis défaire ce que l'utilisateur à fait, mais je trouve cette technique difficile à gèrer au niveau des bugs possible surtout lorsqu'il y a de la validation dans la cellule...

Alors si quelqu'un a une idée ausssi farfelue qu'elle peut être, vous êtes le bienvenue!! =)

Je vous laisse un fichier exemple afin que vous puissiez visualisez un peu plus ce que je dis...

Bonne fin de journée à tous, et merci pour vos commentaires! A+ :D
 

Pièces jointes

  • zoneinterdite.xls
    43.5 KB · Affichages: 47

PMO2

XLDnaute Accro
Re : Application.Intersect vs WorksheetSelection_Change

Bonjour,

Une piste avec le code ci-dessous à copier dans la fenêtre de code de la feuille concernée
après avoir adapté, à votre usage, les constantes cernées par des ###

Code:
'### Constantes à adapter ###
Const PLAGE_INTERDITE As String = "A1:D17,A22:D23"
Const MSG As String = "Vous n'avez pas le droit de passer au dessus de cette zone"
Const TITRE_MSG As String = "Attention!"
'############################

Private OldRange As String
Private bool As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Range(PLAGE_INTERDITE), Target) Is Nothing Then
  With Application
    .EnableEvents = False
    .Undo
    If .CutCopyMode = xlCopy Then bool = True
    .CutCopyMode = False
    Range(OldRange).Select
    MsgBox MSG, , TITRE_MSG
    .EnableEvents = True
  End With
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Range(PLAGE_INTERDITE), Target) Is Nothing Then
  With Application
    .EnableEvents = False
    .CutCopyMode = False
    Range(OldRange).Select
    .EnableEvents = True
  End With
  If bool Then
    bool = Not bool
  Else
    MsgBox MSG, , TITRE_MSG
  End If
Else
  OldRange = Target.Address
End If
End Sub

Cordialement.

PMO
Patrick Morange
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 196
Messages
2 086 099
Membres
103 116
dernier inscrit
kutobi87