Validation de données avec deux cas de figure

paulwasit

XLDnaute Nouveau
Bonjour,

Je travaille sur une base de données d'environ 10.000 articles. Pour chaque article existent une référence (toutes les références sont des codes 6 chiffres) et une désignation. Par exemple : 100001 - Tiroir de bureau.

Je travaille donc sur un tableau de 10.000 lignes et deux colonnes.

Les utilisateurs doivent saisir une référence quelconque dans certaines cellules d'une autre feuille (dans le même fichier). J'aimerais traiter les deux cas de figure suivants :

1. La référence n'est pas dans la base de données et dans ce cas un message d'erreur s'affiche et interdit de sortir de la cellule (le résultat est très satisfaisant avec la fonction Données/Validation de données)

2. Si la référence est dans la base de données, un message de confirmation s'affiche en rappelant la référence saisie par l'utilisateur et la désignation associée (Valider ? OUI / NON), pour vérifier que la référence saisie correspond bien à l'article souhaité.

Mon problème est là. Comment conditionner l'apparitition d'un boîte de dialogue pour le cas N°2, à la validation du cas N°1 ?


J'ai aussi pensé utiliser la fonction equiv (cf. ci-dessous) pour vérifier que le contenu saisi était dans la liste, mais en l'état, le contenu de la cellule target est remplacé par la formule et cela crée une référence circulaire.
Nota: Feuil2!A:A correspond à la colonne référence de ma base de données articles

Une fois le problème résolu, je pourrai m'en sortir avec des If.

______________________
Private Sub Worksheet_Change(ByVal Target As Range)

Dim a As String


Target.FormulaR1C1 = "=MATCH(Feuil1!RC,Feuil2!A:A)"

a = Target.Value


If a <> "#n/a" Then

MsgBox "ton message d'erreur", vbCritical + vbOKOnly, "ton_titre"

End If

End Sub
______________________

Merci pour votre aide
Paulwasit
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Validation de données avec deux cas de figure

Bonjour,


Code:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect([A2:A10], Target) Is Nothing Then
    p = Application.Match(Target.Value, [ref], 0)
    If IsError(p) Then
      MsgBox "inconnu"
      Application.EnableEvents = False
      Target = ""
      Application.EnableEvents = True
    Else
      If MsgBox(Application.Index([libelle], p) & " ok", vbYesNo) <> vbYes Then
        Application.EnableEvents = False
        Target = ""
        Application.EnableEvents = True
      End If
    End If
  End If
End Sub

JB
Formation Excel VBA JB
 

Pièces jointes

  • Classeur1.xls
    26.5 KB · Affichages: 91
  • Classeur1.xls
    26.5 KB · Affichages: 87
  • Classeur1.xls
    26.5 KB · Affichages: 88
Dernière édition:

paulwasit

XLDnaute Nouveau
Re : Validation de données avec deux cas de figure

JB,

merci beaucoup pour cette aide précieuse. J'ai un autre problème : lorsque l'utilisateur a validé la référence (donc à la fin du code écrit ci-dessus), j'aimerais que soit sélectionnée automatiquement la cellule située sur la même colonne mais deux lignes plus bas. Quelque chose comme R[-2]C à partir du target.

Est-ce possible ?

Merci d'avance
Paulwasit
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Validation de données avec deux cas de figure

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect([A2:A10], Target) Is Nothing And Target.Count = 1 Then
    p = Application.Match(Target.Value, [ref], 0)
    If IsError(p) Then
      MsgBox "inconnu"
      Application.EnableEvents = False
      Target = ""
      Target.Select
      Application.EnableEvents = True
    Else
      If MsgBox(Application.Index([libelle], p) & " ok", vbYesNo) <> vbYes Then
        Application.EnableEvents = False
        Target = ""
        Target.Select
        Application.EnableEvents = True
      Else
        Target.Offset(2, 0).Select
      End If
    End If
  End If
End Sub

JB
 

Pièces jointes

  • Classeur1.xls
    27 KB · Affichages: 63
  • Classeur1.xls
    27 KB · Affichages: 64
  • Classeur1.xls
    27 KB · Affichages: 60

paulwasit

XLDnaute Nouveau
Re : Validation de données avec deux cas de figure

J'ai essayé de continuer grâce à vos indications, mais la solution que vous proposez ne fonctionne pas lorsque la cellule située 2 lignes plus bas est régie par une autre procédure (cf. code ci-dessous).

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect([C2:I2,C7:I7,C12:I12], Target) Is Nothing And Target.Count = 1 Then
p = Application.Match(Target.Value, [Code_6_chiffres], 0)
If IsError(p) Then
If MsgBox("Veuillez saisir un code 6 chiffres existant dans Navision", vbOKOnly + vbCritical, "Erreur de saisie") = vbOK Then
Application.EnableEvents = False
Target = ""
Target.Select
Application.EnableEvents = True
End If
Else
If MsgBox("Vous essayez de mettre en stock la référence :" & vbCrLf & vbCrLf & Target.Value & " - " & Application.Index([Désignation_article], p) & vbCrLf & vbCrLf & "Confirmer la mise en stock ?", vbYesNo + vbExclamation, "Validation du code 6 chiffres") <> vbYes Then
Application.EnableEvents = False
Target = ""
Target.Select
Application.EnableEvents = True
Else
Application.EnableEvents = False
If MsgBox("Veuillez saisir la quantité contenue dans la palette filmée", vbOKOnly + vbInformation, "Quantité à mettre en stock") = vbOK Then
Target.Offset(2, 0).Select
Application.EnableEvents = True
End If
End If
End If


Else

If Not Intersect([C4:I4,C9:I9], Target) Is Nothing And Target.Count = 1 Then


If Target.Value = 9999 Then
AdrSaisie = ""
Application.EnableEvents = False
Application.EnableEvents = True
Exit Sub
End If
q = IsNumeric(Target.Value)
r = IsEmpty(Target.Offset(-2, 0).Value)

If r = True Then
If MsgBox("Veuillez d'abord saisir une référence pour l'emplacement", vbOKOnly + vbCritical, "Erreur de saisie") = vbOK Then
Application.EnableEvents = False
Target = ""
Target.Offset(-2, 0).Select
Application.EnableEvents = True
End If
Else
If q = False Then
If MsgBox("Veuillez saisir un nombre", vbOKOnly + vbCritical, "Erreur de saisie") = vbOK Then
Application.EnableEvents = False
Target = ""
Target.Select
AdrSaisie = Target.Address
Application.EnableEvents = True
End If
Else
If Target.Value < 0 Then
If MsgBox("Veuillez saisir une quantité positive", vbOKOnly + vbCritical, "Erreur de saisie") = vbOK Then
Application.EnableEvents = False
Target = ""
Target.Select
AdrSaisie = Target.Address
Application.EnableEvents = True
End If
Else
If MsgBox("Vous essayez de mettre en stock :" & vbCrLf & vbCrLf & Target.Value & " unités du produit " & Target.Offset(-2, 0).Value & vbCrLf & vbCrLf & "Confirmer la mise en stock ?", vbYesNo + vbExclamation, "Validation de la quantité") <> vbYes Then
Application.EnableEvents = False
Target = ""
Target.Select
AdrSaisie = Target.Offset(0, 0).Address
Application.EnableEvents = True
Else
AdrSaisie = ""
Exit Sub
End If
End If
End If
End If
End If
End If



End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If AdrSaisie <> "" Then

If Range(AdrSaisie) = "" Then
Range(AdrSaisie).Select
End If
End If
End Sub
_______________________

Je pense qu'il serait plus simple d'interdire la sortie de la cellule en forçant la saisie (cf. ce qui se passe lorsqu'on utilise la fonction données / validation avec erreur). L'utilisateur entre dans la cellule (idem touche F2) et ne peux pas la quitter tant qu'il n'a pas saisis une valeur satisfaisante.

Merci d'avance
Paulwasit
 

Discussions similaires

Statistiques des forums

Discussions
311 730
Messages
2 081 989
Membres
101 856
dernier inscrit
Marina40