Empêcher la saisie dans l'ensemble des cellules d'une feuille si...

alias_2003

XLDnaute Occasionnel
Bonjour à tous,
Je viens vous demander de l'aide pour résoudre le problème qui m'occupe actuellement...
Sur le fichier joint, j'aimerais si possible empêcher toute saisie tant que les cellules B4, C4 et D4 ne sont pas remplies. J'ai essayé via validation de données sans que cela me donne un résultat satisfaisant... En vba, mon code est actuellement :
Code:
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
            If Range("B4").Value = "" Then
                Range("B4").Select
                MsgBox "remplir la cellule  B4 svp", vbOK
            End If
    End Sub

Malheureusement je ne parviens pas à le modifier pour qu'il remplisse ma demande... J'aurais donc besoin de votre aide...
Merci,
Bonne journée,
Amicalement

http://cjoint.com/?3BosgX2vP3O

PS : Je précise que j'ai posé une question semblable sur un autre forum !
 
Dernière édition:

Papou-net

XLDnaute Barbatruc
Re : Empêcher la saisie dans l'ensemble des cellules d'une feuille si...

Bonsoir alias_2003,

Peut-être en utilisant l'événement Change de la feuille de calcul, comme dans la copie de ton fichier ci-jointe.

Espérant avoir répondu.

Cordialement.
 

Pièces jointes

  • Copie de 3BosgX2vP3O_Essai_Forum_V003-1.xls
    42 KB · Affichages: 45

alias_2003

XLDnaute Occasionnel
Re : Empêcher la saisie dans l'ensemble des cellules d'une feuille si...

Merci beaucoup Papou-net de te pencher sur mon "problème" !
Je comprends ton code, par contre j'ai une erreur "la méthode Value de l'objet Range a échoué" qui apparait... pourquoi ?? doit-on déclarer "Target" dans les variables ??
Merci beaucoup,
Amicalement
 

Papou-net

XLDnaute Barbatruc
Re : Empêcher la saisie dans l'ensemble des cellules d'une feuille si...

Merci beaucoup Papou-net de te pencher sur mon "problème" !
Je comprends ton code, par contre j'ai une erreur "la méthode Value de l'objet Range a échoué" qui apparait... pourquoi ?? doit-on déclarer "Target" dans les variables ??
Merci beaucoup,
Amicalement

RE :

Non, il n'est pas nécessaire de déclarer Target. Par contre, il faut annihiler l'événement Change pour éviter qu'il ne se répète à chaque changement.

Voici donc la macro modifiée :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Range("B4") = "" Or Range("C4") = "" Or Range("D4") = "" Then Target.Value = ""
Application.EnableEvents = True
End Sub
Ca fonctionne aussi bien sur XL2003 que sur XL2010.

Bonne soirée à toi.

Cordialement.
 

alias_2003

XLDnaute Occasionnel
Re : Empêcher la saisie dans l'ensemble des cellules d'une feuille si...

Bonjour Papou-net, le forum,
C'est excatement ce que je souhaitais !! Merci !
J'aurais 2 nouvelles questions...
1. le nom de la feuille (onglet) est automatiquement créé à partir des cellules B4, C4 et D4.
Et c'est là que je pêche... Lorsque 2 feuilles comportent un nom équivalent (c'est à dire pour B4, C4 et D4 identiques pour 2 feuilles) , j'obtiens bien évidement une erreur... Comment contourner ce problème ??

2.comment faire si la taille du nom dépasse les 31 caractères alloués pour nommer la feuille ?? Est-il possible dans ce cas, de remplacer les 3 dernières lettres (c'est à dire à partir du caractère 28) par ...

Merci beaucoup,
Bonne journée,
Amicalement

http://cjoint.com/?3BphF0ujF9V
 

Papou-net

XLDnaute Barbatruc
Re : Empêcher la saisie dans l'ensemble des cellules d'une feuille si...

Bonjour alias_2003,

Vois si le fichier joint répond à tes attentes.

En te souhaitant une bonne journée.

Cordialement.
 

Pièces jointes

  • Copie 01 de 3BosgX2vP3O_Essai_Forum_V003-1.xls
    54 KB · Affichages: 36

Papou-net

XLDnaute Barbatruc
Re : Empêcher la saisie dans l'ensemble des cellules d'une feuille si...

PS

Petite amélioration :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim NomFeuille As String
NomFeuille = "Type " & [C4] & " - Lot " & [D4]
' Vérifie le nombre de caractère du nom de la feuille
' Si >31, ajoute le n° d'index après les 29 premiers caractères
If Len(NomFeuille) > 31 Then
  NomFeuille = Left(NomFeuille, 29) & Format(ActiveSheet.Index, "00")
End If
' Vérifie si le nom de la feuille existe dans le classeur
' Si oui, extrait les 29 premiers caractères et ajoute le n° d'index
For Each sh In Sheets
  If sh.Name = NomFeuille Then
   NomFeuille = Left(NomFeuille, 29) & Format(ActiveSheet.Index, "00")
   Exit For <--- ligne ajoutée
  End If
Next
' Renomme la feuille
ActiveSheet.Name = NomFeuille
End Sub

Cordialement.
 

alias_2003

XLDnaute Occasionnel
Re : Empêcher la saisie dans l'ensemble des cellules d'une feuille si...

Merci beaucoup Papou-net !!
Le code suivant est incorrect mais j'ai essayé d'expliquer ce qui serait parfait pour moi :
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim NomFeuille As String
NomFeuille = "Type " & [C4] & " - Lot " & [D4]
For Each sh In Sheets
  If sh.Name = NomFeuille Then 'si le nom de la feuille existe dans le classeur
    If Len(NomFeuille) > 31 Then
NomFeuille = Left(NomFeuille, 27) & "..." & Format(ActiveSheet.Index, "00")
End If
      If Len(NomFeuille) < 31 Then
   NomFeuille = Left(NomFeuille, 29) & Format(ActiveSheet.Index, "00")
  End If
Else 'si le nom de la feuille feuille est différent de NomFeuille
    If Len(NomFeuille) > 31 Then
NomFeuille = Left(NomFeuille, 27) & "..."
End If
      If Len(NomFeuille) < 31 Then
   NomFeuille = "Type " & [C4] & " - Lot " & [D4]
  End If
 
   Exit For
  End If
Next

' Renomme la feuille
ActiveSheet.Name = NomFeuille
End Sub

Est-ce totalement stupide ??
Merci encore,
Amicalement
 

alias_2003

XLDnaute Occasionnel
Re : Empêcher la saisie dans l'ensemble des cellules d'une feuille si...

Re-,
Voici un code qui a l'air de fonctionner :
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim NomFeuille As String
NomFeuille = "Type " & [C4] & " - Lot " & [D4]
' Vérifie le nombre de caractère du nom de la feuille
' Si >31, ajoute le n° d'index après les 29 premiers caractères
If Len(NomFeuille) > 31 Then
  NomFeuille = Left(NomFeuille, 22) & "... - " & Format(ActiveSheet.Index, "00")
End If
' Vérifie si le nom de la feuille existe dans le classeur
' Si oui, extrait les 29 premiers caractères et ajoute le n° d'index
For Each sh In Sheets
  If sh.Name = NomFeuille Then
     If Len(NomFeuille) > 31 Then
     NomFeuille = Left(NomFeuille, 22) & "... - " & Format(ActiveSheet.Index, "00")
     End If
    
    If Len(NomFeuille) < 31 Then
    NomFeuille = Left(NomFeuille, 25) & " - " & Format(ActiveSheet.Index, "00")
    End If
End If


Next
' Renomme la feuille
ActiveSheet.Name = NomFeuille

End Sub

Par contre, dans le fichier suivant, celui uù l'on clique, on a "Type Cde - Lot Inconnu" ou "Type Cde - Lot Inconnu - 02"... Comment faire pour remédier à ça ??
Merci beaucoup,
Bon appétit
 

alias_2003

XLDnaute Occasionnel
Re : Empêcher la saisie dans l'ensemble des cellules d'une feuille si...

Papou-net,
j'ai un soucis avec le code:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Range("B4") = "" Or Range("C4") = "" Or Range("D4") = "" Then Target.Value = ""
Application.EnableEvents = True
End Sub

aucune saisie n'est possible dans toutes les cellules, y compris les cellules B4, C4 et D4...
Où me suis-je trompé ??
Merci !

http://cjoint.com/?3BpscUuwkYs
 

Papou-net

XLDnaute Barbatruc
Re : Empêcher la saisie dans l'ensemble des cellules d'une feuille si...

Bonsoir alias_2003,

Tout d'abord, mes excuses pour n'avoir pas répondu à tes messages précédents : je viens seulement de rentrer.

Concernant ta dernière demande : effectivement, la saisie en B4 : D4 s'avère impossible. Je n'avais pas suffisamment testé la solution avant de te l'envoyer.

Voilà qui devrait y remédier :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
' Teste si la cellule modifiée (Target) est dans la plage A10:D20
If Intersect(Range("A10:D20"), Target) Is Nothing Then Exit Sub
Application.EnableEvents = False
If Range("B4") = "" Or Range("C4") = "" Or Range("D4") = "" Then Target.Value = ""
Application.EnableEvents = True
End Sub

L'instruction Intersect vérifie que la cellule modifiée est dans la plage de saisie A10 : D20.

Concernant ta demande de 12h02, je n'ai pas très bien saisi ce que te désires obtenir : peux-tu m'envoyer un exemple ?

Dans cette attente.

Cordialement.
 

alias_2003

XLDnaute Occasionnel
Re : Empêcher la saisie dans l'ensemble des cellules d'une feuille si...

Bonsoir Papou-net,
Ne t'inquiète pas, je comprends parfaitement que tu sois occupé par ailleurs ;)
j'ai testé le code mais sans résultat, j'ai encore du me tromper quelque part... Par contre, je ne comprends pas dans le code, il me semble que tu autorise la modification des cellules "A10: D20" ? Ai-je bien compris ?? Si c'est le cas, j'ai mal expliqué mes attentes... J'aimerais si possible qu'aucune modification ne soit possible pour aucune cellule tant que B4, C4 et D4 ne sont pas remplies... Le problème que je rencontrais avec le code:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Range("B4") = "" Or Range("C4") = "" Or Range("D4") = "" Then Target.Value = ""
Application.EnableEvents = True
End Sub
est que dans ce cas, je n'arrive pas à remplir ces 3 fameuse cellules !!
Merci encore de ton aide,
Bonne soirée,
Amicalement
 

Papou-net

XLDnaute Barbatruc
Re : Empêcher la saisie dans l'ensemble des cellules d'une feuille si...

RE alias,

La ligne
Code:
If Intersect(Range("A10:D20"), Target) Is Nothing Then Exit Sub
peut se traduire ainsi :

si la cellule modifiée n'est pas trouvée dans la plage A10 : D20 (Is Nothing) la macro se termine (Exit Sub). Donc, toute cellule située en dehors de cette plage sera modifiable et non effacée par la macro.

As-tu testé le dernier code que je t'ai envoyé ? Parce que chez moi, il fonctionne.


A +

Cordialement.
 

alias_2003

XLDnaute Occasionnel
Re : Empêcher la saisie dans l'ensemble des cellules d'une feuille si...

Merci Papou-net ! Voici le code modifié !

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("A4:D4"), Target) Is Nothing Then Exit Sub
Application.EnableEvents = False
If Range("B4") = "" Or Range("C4") = "" Or Range("D4") = "" Then Target.Value = ""
MsgBox "Remplissez tout d'abord les champs 'B4', 'C4' et 'D4' avant de passer à la suite !", vbInformation
Application.EnableEvents = True
End Sub

Il fonctionne, cependant, la msgbox s'affiche même lorsque B4, C4 et D4 sont remplies... Je ne comprends pas pourquoi...
A+
 

Papou-net

XLDnaute Barbatruc
Re : Empêcher la saisie dans l'ensemble des cellules d'une feuille si...

RE

Il fonctionne, cependant, la msgbox s'affiche même lorsque B4, C4 et D4 sont remplies... Je ne comprends pas pourquoi...

Il te faut intégrer l'affichage de la msgbox dans la condition If...Then, comme ceci :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("A4:D4"), Target) Is Nothing Then Exit Sub
Application.EnableEvents = False
If Range("B4") = "" Or Range("C4") = "" Or Range("D4") = "" Then
  Target.Value = ""
  MsgBox "Remplissez tout d'abord les champs 'B4', 'C4' et 'D4' avant de passer à la suite !", vbInformation
End If
Application.EnableEvents = True
End Sub

Cordialement.
 

Discussions similaires

Statistiques des forums

Discussions
314 653
Messages
2 111 589
Membres
111 208
dernier inscrit
estalavista