Tableau structuré et tableau virtuel
Bonjour à tous,
j'ai un tableau que je filtre via un petit userform, et j'aimerai maintenant me donner la possibilité de faire un recherche dedans (sur une seule colonne).
mon problème c'est que ça prend la vie des rats, oui forcément 56 000 lignes
je fais la même chose via un tableau virtuel qui est beaucoup plus rapide mais il ne prend pas en compte le filtre
Aussi j'aimerai une fois filtré mettre mon tableau Tableau Structuré dans un Tableau Virtuel
ma recherche sur le TS :
Private Sub TextBox1_Change()
Dim cell As Range, i As Long, lig As Long, col As Long, nbt As Integer
ListBox1.Clear
With Range("tableau3").ListObject
.DataBodyRange.EntireRow.Hidden = False
For i = 1 To .ListRows.Count
Set cell = .ListRows(i).Range.Find(TextBox1.Value)
If cell Is Nothing Then
.ListRows(i).Range.EntireRow.Hidden = True
Else
ListBox1.AddItem .ListRows(i).Range.Columns(1)
ListBox1.List(ListBox1.ListCount - 1, 1) = cell.Row
End If
Next i
End With
End Sub
Mon code pour la recherche sur TV
Private Sub TextBox1_Change()
Dim i As Long
Dim j As Integer
Dim n&
Dim K As Long
On Error Resume Next
K = 1
For i = 2 To NL
For COL = 1 To 3
If InStr(1, TV(i, COL), Me.TextBox1.Value, vbTextCompare) <> 0 Then
ReDim Preserve TL1(1 To 4, 1 To K)
TL1(1, K) = i
For n = 0 To 3
TL1(n + 1, K) = O.Cells(i, n)
Next n
K = K + 1
Exit For
End If
Next COL
Next i
If K > 1 Then
If K = 2 Then ReDim TL1(1 To 4, 1 To 2)
Me.ListBox1.List = Application.Transpose(TL1)
End If
End SubMerci d'avance
Bonjour
Un fichier est TOUJOURS le bienvenu
Je pige pas tu fait une boucle et un find... c'est ou l'un ou l'autre ...
A+ François
Bonjour,
Le fichier est dans le post précédent.
concernant la recherche il me faut bien un numéro de ligne pour l'afficher ou pas donc je boucle pour parcourir les lignes et je find pour trouver la valeur
J'ai néanmoins essayé avec un instr ou un like mais j'obtiens le meme résultat
If InStr(1, TV(i, COL), Me.TextBox1.Value, vbTextCompare) <> 0 Thenquand je fais une recherche c'est super long (j'ai normalement 57000 lignes à parcourir, alors que quand je monte tout dans un tableau virtuel c'est exploitable, si ce n'est que je ne sais pas comment tenir compte des filtres, mis à part de conditionner la recherche en fonction des valeurs des filtres mais du coup cela va ralentir encore plus car il me faudra faire un if sur les 3 valeurs filtrées + la recherche.
Il me semblait plus rapide de partir de mon tableau de le filtrer et de mettre ce qui est visible dans un tableau virtuel. mais peut être que je n'utilise pas les bons termes et que je suis donc incompréhensible.
Merci de ton/votre aide
Didier
Bonjour
J'ai beau cherché, changé la couleur ect... je ne trouve pas ta listbox1
Ta recherche tu la fait sur quelle colonne?
A+ François
Bonjour le fil
@figuedi, Perso je n'ai rien compris à ce que vous vouliez faire, ou et comment
Dans. Et exemple y a pas de listbox
J’essaie justement de ne pas en faire mais de présenter le résultat des filtres et de la recherche directement dans la feuille Excel
J’envoie des que je rentre à la maison le même fichier fait avec listbox et qui marche nickel
Voilà le même fichier via une recherche en tableau virtuel et une liste Box.
Mais c'est ce que je ne veux pas faire.
J'aimerai faire une recherche via les 3 pré-filtres puis une recherche qui afficherait les résultats en masquant les lignes de la feuille excel et pas dans une list box.
Merci d'avance,
Didier
Re,
Vous connaissez l'utilisation de votre fichier, pas nous.
Je pense qu'il faudrait nous détailler les étapes que vous faites pour arriver au résultat
A+
Salut,
Je n'ai donc pas été clair. A partir de ce fichier je filtre dans un premier temps pour limiter le champs de recherche (dans le filtre "sous famille" mettre titi)
puis tu cliques sur valider pour valider les filtres et tu tapes dans le textbox de recherche (1 ou 2 ou3 ... 7)
et il affiche que la concaténation des filtres et du champs de recherche qui scrute la colonne 4.
Mais c'est super long et je voudrais comprendre pourquoi (où est mon erreur ?, ou est-ce normal ?).
J'ai donné à titre d'exemple (de rapidité), exactement la même recherche, sans passer par les filtres, uniquement via une listbox. Et c'est 200 fois plus rapide.
Mon code de recherche associé à la textbox est :
(oui j'ai viré le "find" mais sans aucun gain de temps)
Private Sub TextBox1_Change()
Dim cell As Range, i As Long, lig As Long, COL As Long, nbt As Integer
On Error Resume Next
ListBox1.Clear
With Range("tableau3").ListObject
.DataBodyRange.EntireRow.Hidden = False
For i = 3 To 1262
Set cell = .ListRows(i).Range.Find(TextBox1.Value)
.DataBodyRange.EntireRow.Hidden = False
If InStr(1, Range("tableau3")(i, 4), Me.TextBox1.Value, vbTextCompare) <> 0 Then
ListBox1.AddItem .ListRows(i).Range.Columns(1)
ListBox1.List(ListBox1.ListCount - 1, 1) = cell.Row
Else
.ListRows(i).Range.EntireRow.Hidden = True
End If
Next
End With
End SubEn espérant avoir éclairci mes propos (ma demande)
Merci d'avance,
Didier
Bonsoir,
Premièrement, je vois que certaines lignes sont masquées et que la plage utilisée va bien plus loin que le tableau3, tu peux le voir de cette façon :
Sub DernLig()
MsgBox ActiveSheet.UsedRange.Rows.Count
End SubSupprime toutes les lignes en dessous du tableau
Ensuite remplace ton code par celui-ci qui doit faire la même chose :
Private Sub TextBox1_Change()
Dim aFilterRange As Variant, iDernLig as Long
Dim cell As Range, i As Long, lig As Long, COL As Long, nbt As Integer
' Acclérère l'exécution du code
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'Suppression du filtre de la colonne 4 (D)
ActiveSheet.ListObjects("Tableau3").Range.AutoFilter Field:=4
'Mise en place du filtre en colonne 4
ActiveSheet.ListObjects("Tableau3").Range.AutoFilter Field:=4, Criteria1:="=*" & TextBox1.Text & "*"
ListBox1.Clear
With ActiveSheet
iDernLig = .UsedRange.Rows.Count ' Récupération de la dernière ligne de la plage utilisée
For i = 3 To iDernLig
Application.StatusBar = i ' Lecture de la ligne sur la barre d'état
If .Rows(i).Hidden = False Then ' Ligne visible
ListBox1.AddItem .Cells(i, "A")
ListBox1.List(ListBox1.ListCount - 1, 1) = i
End If
Next
End With
' Réinitialisation
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.StatusBar = False
End SubL'utilisation du filtre est beaucoup plus rapide.
Benead
Nickel merci beaucoup