XL 2010 Besoin d'aide

cqtr

XLDnaute Nouveau
Bonjour,

Voilà. je suis confrontée à un problème. J'ai une liste de dispositifs d'intégration qui réunissent des critères d'accès. On dénombre un total de 7 ou 8 critères. Ma question est la suivante: Est-il possible de créer un document excel vierge avec les conditions que l'on choisirait avec une liste déroulante et qui donne un résultat de dispositif automatiquement svp?
Je vous joins mon fichier excel pour que vous vous rendiez compte de ce que j'essaie de faire.
Merci
 

Pièces jointes

  • Classeur copie intégration.xlsx
    26.3 KB · Affichages: 10

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Cqtr, bonjour le forum,

En pièce jointe ton fichier modifié avec deux codes dans différents endroits.
• Dans le composant ThisWorkbook :
Le code ci-dessous permet de définir/mettre à jour la liste de validation de données dans la cellule A1 de l'onglet Feuil3 :

VB:
Private Sub Workbook_Open() 'à l'ouverture du classeur
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)
Dim L As String 'déclare la variable L (Liste)

Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For Each O In Worksheets 'bocule 1 : sur tous les onglets du classeur
    If Left(O.Name, 10) = "Dispositif" Then 'condition : si le nom de l'onglet commence par "Dispositif"
        TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
        For I = 2 To UBound(TV, 1) 'boucle 2 sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
            D(TV(I, 1)) = "" 'alimente le dictionnaire D avec les données en colonne 1 de TV (le Dispositif)
        Next I 'prochaine ligne de la boucle 2
    End If 'fin de la condition
Next O 'prochain onglet de la boucle 1
L = Join(D.Keys, ",") 'définit la liste L (joint les élément du dictionnaire D sans doublon en les séparant par une virgule)
With Worksheets("Feuil3").Range("A1").Validation 'prend en compte la validation de données de la cellule A1 de l'onglet "Feuil3"
    .Delete 'supprime une éventuelles validation de données ancienne
    .Add xlValidateList, Formula1:=L 'utilise la liste L comme liste de validation de données
End With 'fin de la prise en compte de la cellule A1 de l'onglet "Feuil3"
End Sub

• Dans le composant Feuil3 (Feuil3)
Le code ci-dessous permet, lui, de récupérer les données en fonction de la valeur de la cellule A1 :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim L As Byte 'déclare la variable L (incrément)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)

If Target.Address <> "$A$1" Then Exit Sub 'si le changement a lieu ailleurs qu'en A1, sort de la procédure
If Target.Value = "" Then Range("A1").CurrentRegion.Offset(2, 0).ClearContents: Exit Sub 'si A1 est effacée, efface les éventuelles ancienne données, sort de la procédure
K = 1 'initialise la variable K
For Each O In Worksheets 'bocule 1 : sur tous les onglets O du classeur
    If Left(O.Name, 10) = "Dispositif" Then 'condition 1 : si le nom de l'onglet commence par "Dispositif"
        TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
        For I = 2 To UBound(TV, 1) 'boucle 2 sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
            If TV(I, 1) = Target.Value Then 'condition 2 : si la donnée ligne I colonne 1 de TV est égale à la valeur de A1
                ReDim Preserve TL(1 To UBound(TV, 2), 1 To K) 'redimensionne le tableau des lignes TL (autant de lignes que TV a de colonnes, K colonnes)
                For L = 1 To UBound(TV, 2) 'boucle 3 : sur toutes les colonnes L du tableau des valeurs TV
                    TL(L, K) = TV(I, L) 'récupère dans la ligne L de TL la valeur de la colonne L de TV (=> transposition)
                Next L 'prochaine colonne de la boucle 3
                K = K + 1 'incrémente K
            End If 'fin de la condition 2
        Next I 'prochaine ligne de la boucle 2
    End If 'fin de la condition 1
Next O 'prochain onglet de la boucle 1
If K > 1 Then 'condition : si K est supérieure a 1
    Range("A1").CurrentRegion.Offset(2, 0).ClearContents 'efface les éventuelles ancienne données
    Range("A3").Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL) 'renvoie dans A3 redimensionnée le tableau TL transposé
End If 'fin de la condition
End Sub

Sélectionne un dispositif dans la cellule A1 de l'onglet Feuil3...

Le fichier :
 

Pièces jointes

  • Cqtr_ED_V01.xlsm
    36.5 KB · Affichages: 4

cqtr

XLDnaute Nouveau
Bonjour Robert,

Merci beaucoup pour ta réponse et pour ton aide.
Seulement, il faudrait qu'en fonction des critères d'age, de statut etc, qui soient rentrés en feuille 3 apparaissent automatiquement le dispositif. cet outil sera utilisé afin d'orienter les usagers, les auditrices rentreront les informations et orienteront grâce au résultat les personnes.
Vois tu ce que je veux dire?
 

cqtr

XLDnaute Nouveau
Oui bien sur!
Alors par exemple, sur la feuille 3, l'idée est que l'auditrice rentre l'age de la personne, plus ou moins 25 ans, son statut, si réfugiés ou primo arrivant, son logement stable ou non etc et qu'à partir des informations écrites, le logiciel affichent automatiquement le dispositif ou les dispositifs qui correspondent aux critères donnés.
Suis-je clair?

merciiii
 

Robert

XLDnaute Barbatruc
Repose en paix
Re,

En pièce jointe, ton fichier modifié. J'ai rajouté un onglet Liste où les noms sont définis dynamiquement avec la formule DECALER (voir Gestionnaire de Noms). Cela permet de définie les listes de validation de données de la ligne 2 de l'onglet Feuil3.
Dans cette ligne 2, choisit le ou les critères puis clique sur le bouton Rechercher. Les résultats s'affichent à partir de la ligne 8...

Le code du bouton RECHERCHER :

VB:
Private Sub CommandButton1_Click()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim NC As Byte 'déclare la variable NC (Nombre de Critères)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim TC(1 To 6) 'déclare la variable TC (Tableau des Critères)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim L As Byte 'déclare la variable L (incrément)
Dim NT As Byte 'déclare la variable NT (Nombre de Test)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)

ActiveCell.Select 'enlève le focus au bouton
Set OD = Worksheets("Feuil3") 'définit l'onglet destination OD
OD.Range("A7").CurrentRegion.Offset(1, 0).ClearContents 'efface d'éventuelles anciennes données
NC = Application.WorksheetFunction.CountA(OD.Range("A2").Resize(1, 6)) 'définit le nombre de critères NC
If NC = 0 Then Exit Sub 'si aucun critère, sort de la procédure
For I = 1 To 6 'boucle sur les 6 colonnes (de 1 à 6)
    TC(I) = OD.Cells(2, I).Value 'alimente le tableau des critères TC avec la valeur en ligne 2 de la boucle
Next I 'prochaine colonne de la boucle
K = 1 'initialise la variable K
For Each O In Worksheets 'boucle 1 : sur tous les onglets O du classeur
    If Left(O.Name, 10) = "Dispositif" Then 'condition 1 : si le nom de l'onglet commence par "Dispositif"
        TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
        For I = 2 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes I du tableau des valeurs
            For J = 1 To 6 'boucle 3 : sur tous les critères du tableau des ctritères TC
                If TC(J) <> "" Then 'condition 2 : si le critère n'est pas vide
                    'si la donnée en ligne I colonne J + 1 de TV est égale au critère TC(J), incrémente le nombre de test NT
                    If TV(I, J + 1) = TC(J) Then NT = NT + 1
                End If 'fin de la condition 2
            Next J 'prochain critère de la boucle 3
            If NT = NC Then 'condition 3: si le nombre de critères NC est égal au nombre de test NT
                ReDim Preserve TL(1 To UBound(TV, 2), 1 To K) 'redimensionne le tableau des lignes TL (auntant de lignes que TV a de colonnes, K colonnes)
                For L = 1 To UBound(TV, 2) 'boucle 4 sur toutes les colonnes L du tableau des valeurs TV
                    TL(L, K) = TV(I, L) 'récupère dans la ligne de TL la donnée en colonne L de TV (=> Transposition)
                Next L 'prochaine colonne de la boucle 4
                K = K + 1 'incrémente K
            End If 'fin de la condition 3
            NT = 0 'initialise le nombre de test NT
        Next I 'prochaine ligne de la boucle 2
    End If 'fin de la condition 1
Next O 'prochain onglet de la boucle 1
'si K est supérieure à 1, envoie dans la cellue A8 redimensionnée, le tableau TL transposé
If K > 1 Then OD.Range("A8").Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL)
End Sub

Le fichier :
 

Pièces jointes

  • CQTR_ED_v02.xlsm
    43 KB · Affichages: 7

cqtr

XLDnaute Nouveau
Bonjour Robert,

Merci beaucoup beaucoup! Ça fonctionne super bien!
Par contre, j'ai des choses à rajouter, puis-je ajouter deux colonnes à la feuille 1 sans que cela ne change quoi que ce soit? Il faut que je mette le département et si le logement est stable ou non.
Merci encore pour ton aide
 

Robert

XLDnaute Barbatruc
Repose en paix
Re,

En pièce jointe ton fichier modifié. Tu verras dans l'onglet Listes, les en-tête jaunes de colonne signifie que tu peux rajouter des valeurs dans la colonne et elles seront prise automatiquement en compte dans les listes de validation de données de la ligne 2 de l'onglet Feuil3. Malheureusement VBA ne permet pas de s'auto-adapter aux éventuelles modifications. Une ligne, une colonne en plus dans le tableau tel qu'il est et le code risque fort de planter...
 

Pièces jointes

  • CQTR_ED_v04.xlsm
    49.9 KB · Affichages: 5

Discussions similaires

Réponses
9
Affichages
363

Membres actuellement en ligne

Statistiques des forums

Discussions
312 206
Messages
2 086 203
Membres
103 157
dernier inscrit
youma