Bonsoir le fil, bonsoir le forum,
En pièce jointe ton fichier modifié avec des macros en 3 étapes :
• Étape 1 dans le composant ThisWorkbook
À l'ouverture du classeur une liste de validation de données est créée en A1 de l'onglet Feuil2, contenant tous les serveurs de la colonne Z de l'onglet Feuil1, avec le code ci-dessous :
Private Sub Workbook_Open()
Module1.Liste 'lance la procédure [Liste] du module [Module1]
End Sub
Puis dans le composant Module1
Public O As Worksheet 'déclare la variable O (Onglet)
Public PL As Range 'déclare la variable PL (PLage)
Public Sub Liste()
Dim TC As Variant 'déclare la variable TC (Tableau de Cellules)
Dim NL As Integer 'déclare la variable NL (Nombre de Lignes)
Dim NC As Byte 'déclare la variable NC (Nombre de Colonnes)
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 O = Sheets("Feuil1") 'définit l'onglet O
Set PL = O.Range("A1").CurrentRegion 'définit la plage PL
TC = PL 'définit le tableau de celluiles TC
NL = UBound(TC, 1) 'définit le nombre de lignes NL du tableau de cellules TC
NC = UBound(TC, 2) 'définit le nombre de colonnes NC du tableau de cellules TC
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To NL 'boucle sur toutes les lignes I du tablaeu de cellules TC (en partant de la seconde)
D(TC(I, 26)) = "" 'alimente le dictionnaire D avec la valeur ligne I colonne 26 (=> ccolonne Z) de TC
Next I 'prochaine ligne de la boucle
L = Join(D.keys, ",") 'définit la liste L avec la liste de éléments du dictionanire D sans doublon
With Sheets("Feuil2").Range("A1").Validation 'prend en compte la validation de données de la cellue A1 de l'onglet O
.Delete 'efface une eventuelle ancienne validation de données
.Add Type:=xlValidateList, Formula1:=L 'ajoute la liste L comme liste de validation de données
End With 'fin de la prose en compte de la validation de données de la cellue A1 de l'onglet O
End Sub
• Étape 2 dans le composant Feuil2(Feuil2)
Quand tu modifies ou efface le contenu de A1 dans l'onglet Feuil2, les anciennes valeurs sont effacées et les données correspondantes au filtre sont affichées, avec le code ci-dessous :
Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim PLV As Range 'déclare la bariable PLV (PLage Visible)
If Target.Address <> "$A$1" Then Exit Sub 'si le changement a lieu ailleurs qu'en A1, sort de la procédure
Range("A3").CurrentRegion.ClearContents 'efface d'éventuelle ancienne données
If Target.Value = "" Then Exit Sub 'si A1 est effacée, sort de la procédure
'filtre l'onglet la 26 colonne de l'onglet O avec le contenu de A1 comme critère
O.Range("A1").AutoFilter Field:=26, Criteria1:=Target.Value
Set PLV = PL.SpecialCells(xlCellTypeVisible) 'définit la plage PLV (=la partie visible de la plage PL)
PLV.Copy Sheets("Feuil2").Range("A3") 'copy la plage PLV dans A3 de l'onglet "Feuil2"
O.Range("A1").AutoFilter 'supprime le filtre automatique de l'onglet O
End Sub
• Étape 3 dans le composant Feuil2(Feuil2)
Quand tu rentres dans l'onglet Feuil2 (après avoir, par exemple, mis à jour la base de données avec un nouveau serveur), la mise à jour de la liste de validation en A1 de l'onglet Feuil2 est faite grâce au code :
Private Sub Worksheet_Activate()
Module1.Liste 'lance la procédure [Liste] du module [Module1]
End Sub
Pour l'utilisateur tout est transparent, il choisit un serveur dans la liste de la cellule A1 de l'onglet Feuil2 et les données s'affichent à partir de A3...