|
|
|
|
Bonjour,
Débutante sur vba excel, je rencontre pas mal de pb malgré de nombreuses recherches sur internet.
Je voudrais afficher le contenu SANS DOUBLONS d'une colonne dans une liste déroulante sur formulaire, sachant que les valeurs à afficher ne commencent qu'à la ligne 3 (j'ai réussi mais les doublons eux sont tjs là!)
Je voudrais également créer un code pour enlever les filtres de toutes les colonnes sauf la colonne 1 de ma feuille. (sans avoir à faire 1 ligne de code pour chaque colonne)
Quelqu'un peut-il m'aider? Dur, dur de tatonner... lol
Merci d'avance
Ludivine
Configuration: windows/excel97 et + /vb 6
Bonjour Ludivine,
Dim CelluleCourante As Range
Dim CelluleSuivante As Range
Set CelluleCourante = Range("A3")
Do While Not IsEmpty(CelluleCourante)
Set CelluleSuivante = CelluleCourante.Offset(1, 0)
If CelluleSuivante.Value = CelluleCourante.Value Then
CelluleCourante.EntireRow.Delete
End If
Set CelluleCourante = CelluleSuivante
Loop
Si tu ne veux pas détruire tes doublons, mais seulement ne pas les afficher, tu peux t'inspirer de ça, ou travailler sur une autre colonne provisoire dans laquelle tu auras copié les données.
EntireRow supprime la ligne entière. L'enlever pour ne virer que la cellule. Pour les filtres : ActiveSheet.AutoFilterMode = False
Columns("A:A").AutoFilter
|
Re, ludivine,
Private Sub UserForm_Initialize() Dim Lig As Long Dim Col As String Dim ValeurCourante As String Dim ValeurPrécédente As String Lig = 3 Col = "A" ValeurPrécédente = "" ValeurCourante = Cells(Lig, Col).Value Do While ValeurCourante <> "" If ValeurCourante <> ValeurPrécédente Then ListBox1.AddItem ValeurCourante End If Lig = Lig + 1 ValeurPrécédente = ValeurCourante ValeurCourante = Cells(Lig, Col).Value Loop End SubPour les filtres, ce que je t'ai donné ne marche pas ? Ça supprime tous les filtres, et ça réinstalle celui de la colonne "A". |
Bonjour,
|
Pas sniff, ludivine... !
|
Désolé ludivine, mais ma FreeBox est restée en rade pendant 3 heures. Bon, 3 h en 2 ans c'est pas une catastrophe, mais bon...
|
Coucou
|
A priori, l'erreur VBA "13" est Incompatibilité de type. Peut-être du texte qui serait utilisé comme du numérique par exemple, ou quelque chose comme ça...?
|
à ce moment là, je pense que je vais créer une plage de données, avec valeurs uniques, qui sera source d'alim pour ma colonne de données
|
Essaie cette macro, à lancer à l'ouverture de ton classeur. Elle crée la liste triée sans doublons dans une feuille spéciale que j'appelle Param (pas la peine de créer la feuille, ça se fait tout seul si elle n'existe pas), et lui donne un nom. Tout est recalculé à chaque ouverture du classeur. Le nom de la plage est PlageListBox (tu changes tout ce que tu veux...).
Sub PrepaListe()
Dim Lig_Deb As Long
Dim DerLig As Long
Dim Col As String
Dim Feuille As String
Dim CelluleCourante As Range
Dim CelluleSuivante As Range
Dim FF As Worksheet
' PARAMETRES A ADAPTER
'----------------------------------------------------------------------------
Lig_Deb = 3 ' n° de la première ligne de données filtrées
Col = "A" ' colonne de données filtrées
Feuille = "Feuil1" ' nom de la feuille de données
'----------------------------------------------------------------------------
Application.ScreenUpdating = False
On Error Resume Next
Worksheets("Param").Activate
If Err.Number = 9 Then
Worksheets.Add
ActiveSheet.Name = "Param"
End If
On Error GoTo 0
Sheets("Param").Cells.ClearContents
Set FF = Sheets(Feuille)
DerLig = FF.Cells(65536, Col).End(xlUp).Row
FF.Range(Col & Lig_Deb & ":" & Col & DerLig).Copy
Cells(1, 1).Select
ActiveSheet.Paste
Selection.Sort Key1:=Range("A1"), _
Order1:=xlAscending, _
Header:=xlNo
Application.CutCopyMode = False
Set CelluleCourante = Range("A1")
Do While Not IsEmpty(CelluleCourante)
Set CelluleSuivante = CelluleCourante.Offset(1, 0)
If CelluleSuivante.Value = CelluleCourante.Value Then
CelluleCourante.EntireRow.Delete
End If
Set CelluleCourante = CelluleSuivante
Loop
On Error Resume Next
ActiveWorkbook.Names("PlageListBox").Delete
On Error GoTo 0
DerLig = Range("A65536").End(xlUp).Row
ActiveWorkbook.Names.Add Name:="PlageListBox", _
RefersToR1C1:="=Param!R1C1:R" & DerLig & "C1"
Application.ScreenUpdating = True
End Sub
|
Bonjour Armojax !
|
Ah si, juste une dernière petite question !
|
Au lieu d'une ListBox, tu peux utiliser un ComboBox. Beaucoup de propriétés sont identiques, et ça ne devrait pas être compliqué à transposer. Tu auras une liste déroulante, et tu pourras déterminer le nombre d'items visibles d'un coup avec la propriété ListRows.
|
Bonjour,
|