XL 2013 Feuille avec plus d'une liste de validation : plantage

Sebast

XLDnaute Impliqué
Bonjour à toutes et à tous,

j'ai besoin de vos lumières concernant une procédure événementielle (changement de valeur dans une cellule).

Je n'arrive pas à avoir une feuille contenant plus d'une colonne avec liste de validation

Concrêtement, dans le fichier joint, feuille "Saisie" j'ai
Colonne B : liste de validation via liste qui pointe en feuille "Supports"
Colonne C : liste de validation sélective, selon contenu de la colonne B (voir code, ex : si B=Parcelles, alors on pioche dans feuille "Parcelles" colonne B)
Colonne D : en fonction de ce qui a été sélectionné en C, on colle unité1 correspondant (ex : si parcelle 2, alors unité1= m²)
Colonne E : en fonction de ce qui a été sélectionné en C, on colle la base correspondant (ex : si parcelle 2, alors base= 1725)
Colonne F : liste de validation sélective, selon contenu de la colonne B (si B=Parcelles, alors on pioche dans feuille Activités_parcelles, colonne A)

et ainsi de suite pour les 4 types de support

Mon souci est que je n'arrive pas à avoir plus d'une liste de validation qui fonctionne (dans la pièce jointe, je n'ai essayé qu'avec deux et même ça, ça plante)
J'ai l'impression que je ne dois pas définir les bonnes zones au bon moment mais je ne sais pas où ça pêche …

Quelqu'un a-t-il une idée d'où vient mon erreur ?

Merci d'avance



Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim f As String
Dim Colonne_Support As Range
Dim dernlig As Long
Dim Lastline As Long

Dim MyValue As Variant

' --- Première partie : création des listes de validation sélectives

dernlig = Sheets("Saisie").Range("C" & Rows.Count).End(xlUp).Row
Set Colonne_Support = Sheets("Saisie").Range("C2:C" & dernlig)



If Not Intersect(Target, Colonne_Support) Is Nothing Then

For Each Target In Colonne_Support
    Select Case Target
         Case "Parcelle"
                Lastline = Sheets("Parcelles").Range("A" & Rows.Count).End(xlUp).Row
                f = "=Parcelles!$B$2:$B$" & Lastline
         Case "Matière"
                Lastline = Sheets("Matières").Range("A" & Rows.Count).End(xlUp).Row
                f = "=Matières!$B$2:$B$" & Lastline
         Case "Fourniture"
                Lastline = Sheets("Fournitures").Range("A" & Rows.Count).End(xlUp).Row
                f = "=Fournitures!$B$2:$B$" & Lastline
         Case "Prestation"
                Lastline = Sheets("Prestations").Range("A" & Rows.Count).End(xlUp).Row
                f = "=Prestations!$B$2:$B$" & Lastline
    End Select

With Target(1, 2).Validation
     .Delete
     .Add xlValidateList, Formula1:=f
End With

Next Target

End If



' --- Deuxième partie : remplissage des colonnes D et E dans feuille "Saisie" en fonction
' du contenu de la colonne C

Dim PlageParcelles As Range
Dim PlageMatières As Range
Dim PlageFournitures As Range
Dim PlagePrestations As Range

Dim k As Variant
Dim zone As Range

For Each Target In Colonne_Support
    Select Case Target
           Case "Parcelle"
                Set k = Sheets("Parcelles")
           Case "Matière"
                Set k = Sheets("Matières")
           Case "Fourniture"
                Set k = Sheets("Fournitures")
           Case "Prestation"
                Set k = Sheets("Fournitures")
    End Select

Next Target


If Not Intersect(Target, Colonne_Support) Is Nothing Then
Set zone = k.[A:A].Find(what:=Target.Value)

Target.Offset(0, 1).Value = zone.Offset(0, 1).Value
Target.Offset(0, 2).Value = zone.Offset(0, 2).Value

End If

End Sub
 

Pièces jointes

  • Question_forum_23032016.xlsm
    41.6 KB · Affichages: 30

bbb38

XLDnaute Accro
Re : Feuille avec plus d'une liste de validation : plantage

Bonjour Sebast, le forum,
Je crois que l’on ne peut utiliser qu’un seul « If Not Intersect(Target, Colonne_Support) Is Nothing Then » dans une macro (vous me corrigerez, si nécessaire - je sors de la sieste). Pour ma part, j’utiliserai un formulaire, pour compléter les données.
Cordialement,
Bernard
 

Sebast

XLDnaute Impliqué
Re : Feuille avec plus d'une liste de validation : plantage

Bonjour bbb38,

merci beaucoup pour cette piste, que je dois explorer : j'avoue ne pas savoir si on peut ou pas avoir plusieurs fois
If Not Intersect ...

Quant au formulaire, pourquoi pas mais sera-t-il sélectif (c'est à dire peut-on afficher un contenu propre selon la valeur d'une autre cellule ?)

merci
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Feuille avec plus d'une liste de validation : plantage

Bonjour Sebast, bbb38 :)

Un essai sans VBA.

Le tableau Tableau10 a été modifié par l'ajout d'une colonne qui indique le tableau cible suivant le support

Puis deux noms ont été définis:
Support qui est la liste des Support (colonne Support du Tableau10) ->
Code:
=Tableau10[Support]
et
ListeNOM qui est un nom dynamique qui varie en fonction du support choisi dans le tableau de la feuille "Saisie" (colonne Nom du tableau cible) ->
Code:
=INDIRECT(INDEX(Tableau10[Tableau];EQUIV(Tableau9[@Support];Tableau10[Support];0)) & "[Nom]")

Pour la recherche de Unité1 et Base deux formules dans le tableau renvoie la bonne valeur.
Pour la colonne Unité1 :
Code:
=SIERREUR(RECHERCHEV([@Nom];INDIRECT( RECHERCHEV([Support];Tableau10;2;0) &  "[[Nom]:[Base]]");2;0);"")
Pour la colonne Base :
Code:
=SIERREUR(RECHERCHEV([@Nom];INDIRECT( RECHERCHEV([Support];Tableau10;2;0) &  "[[Nom]:[Base]]");3;0);"")


Une MFC a été définie sur les colonne B:C du tableau de la feuille "Saisie". Cette MFC colore la police en rouge si il y a incohérence entre le support et le nom (Ex: on choisit Parcelle et Parcelle 1, puis on modifie Parcelle pour Matières -> on obtient une incohérence entre Matières et Parcelle 1 !)
Formule de MFC :
Code:
=$D4=""

nb: Attention! Dans la tableau Fournitures, j'ai remplacé l'en-tête Base1 par Base.

Rem: Pas vu qu'il y avait déjà un fil sur le même sujet!
 

Pièces jointes

  • Sebast-Question_forum_23032016- v1.xlsx
    30.5 KB · Affichages: 22
Dernière édition:

Sebast

XLDnaute Impliqué
Re : Feuille avec plus d'une liste de validation : plantage

Salut mapomme,

Merci beaucoup pour ta proposition, qui fonctionne bien et est effectivement futée pour la détection des incohérences

Quant au fil sur le même sujet, c’est plutôt un sujet connexe car ce qui m’a poussé à ouvrir un nouveau fil, c’est l’incertitude sur l’emploi multiple de
If not Intersect(Target, …


Encore merci pour ta solution, qui plus est bien détaillée et didactique

Bonne journée
 

Discussions similaires

Statistiques des forums

Discussions
312 248
Messages
2 086 594
Membres
103 250
dernier inscrit
keks974