bereik van filter dynamisch maken

Status
Niet open voor verdere reacties.

1965Peter

Gebruiker
Lid geworden
20 jun 2016
Berichten
197
In een vbacode moeten velden worden gedeleate adv een filter. Daar het bestand dynamisch is zou de active.range dynamisch moeten zijn.
Hoe zou ik die toe kunnen passen?



Code:
Rows("1:1").Select
    Application.CutCopyMode = False
    Selection.AutoFilter
    ActiveSheet.Range("$A$1:$U$2124").AutoFilter Field:=6, Criteria1:="1"
    
    ActiveSheet.AutoFilter.Range.Offset(1, 0).Rows.SpecialCells(xlCellTypeVisible).Delete (xlShiftUp)
    ActiveSheet.ShowAllData
    
    AutoFilterMode = False
 
Laatst bewerkt:
kijk eens naar usedrange en currentregion.
 
@Peter: wellicht is het beter om uit te leggen wat u wilt bereiken aan de hand van een screenshot van de beginsituatie en de gewenste eindsituatie.
 
@kaas

Wij houden niet van plaatjes in een Excelforum, maar van illustratieve en representatieve Excelbestanden.
 
Hmm. Dit is niet de toon die ik verwacht op een forum...

Ik zie de reactie van Peter graag tegemoet.
 
Dan hoor jij dingen die anderen niet horen.
Kijk eens in de forumregels.
Het is evenmin gebruikelijk op berichten te reageren, die al 7 weken oud zijn en waarin de vraagsteller op niets heeft gereageerd.
Niet reageren op suggesties is niet erg respektvol.
 
Laatst bewerkt:
@Kaas. Eigenlijk wat ik zoek is om een bestand ongeacht hoeveel regels of kolommen dit gebied dynamisch te maken.
Het filter toont dan de regels die ik wil verwijderen. Ik heb wel andere codes gebruikt maar die doen er ontzettend lang over. Dus leek mij dit de snelste manier.

@Snb. Ik ben zeer respectvol naar iedereen die reageert en ook dankbaar. Maar weet dat niet iedereen een expert is in vba zoals ik, en als ik een antwoord krijg zoals jij gegeven hebt kan ik er eigenlijk niet zoveel mee.
Des al niet te min heb ik hele mooie controletools gemaakt met mijn beperkte kennis en heel veel hulp van dit forum. Gekregen codes sla ik altijd op en kan deze dan ook weer gebruiken voor andere situaties.
Verder no hard feelings. :)
 
Bedankt, Peter.

Om het helemaal goed te begrijpen: is het mogelijk om hier een excel bestand te plaatsen met 1) een sheet met een representatieve uitgangssituatie, en 2) een sheet met het resultaat na de filter?
 
Ik heb een voorbeeld bestand erbij gedaan, hoop dat je snapt wat ik bedoel.
 

Bijlagen

  • Filter vba.xlsx
    11,5 KB · Weergaven: 11
Peter, in bijgaande sheet met daarin een macro die dynamische filtert op kolom DDD. Komt dit in de buurt?

Edit: macro aangepast. Moet nu werken.
 

Bijlagen

  • Book1.xlsm
    14,2 KB · Weergaven: 18
Laatst bewerkt:
Bedankt Kaas,
Niet helemaal wat ik bedoel, want dit is ook weer een If/Then statement en die wil ik juist niet hebben.

In jouw voorbeeld zou je het filter aan moeten zetten, kiezen voor kolom D, en daar "1" aanvinken.
Deze moeten delete worden.

In mijn starttopic zie je ook range A1:U2124 staan. Deze zou dynamisch moeten worden. In ieder geval het aantal regels. Kolommen minder belangrijk.
 
Dat wat wordt gedeletet met het filter is vrij te kiezen middels de inputbox. Met een kleine aanpassing in de code kan het filter ook werken voor een andere kolom.

Naar mijn mening is het bereik van het filter al dynamisch. Dit doordat bij aanvang wordt bepaald hoeveel regels de tabel bevat.

Een If Then statement is niet te voorkomen.
Het zou nog iets sneller worden door de variabelen te dimensioneren en screenupdate tijdelijk uit te zetten.
 
Laatst bewerkt:
Ik was er al bang voor dat het niet anders kon, ik ga kijken hoe ik jouw bestand kan gebruiken. Bedankt weer voor je hulp. :)
 
Code:
Sub hsv()
 With Cells(1).CurrentRegion
  .AutoFilter 4, 1
  .Offset(1).EntireRow.Delete
  .AutoFilter
 End With
End Sub

Voor een echte tabel (Listobjects) die altijd dynamisch is.
Code:
Sub hsv_2()
 With ActiveSheet.ListObjects(1).DataBodyRange
  .AutoFilter 4, 1
  .EntireRow.Delete
  .AutoFilter
 End With
End Sub
 
Bij de tweede routine krijg ik een out-of-range fout op de tweede regel, Harry.

De eerste werkt goed. Enig idee of het sneller is dan een for-next loop?
 
Even het begrip Listobjects doornemen.

Het filter is niet per definitie sneller.
Dit kun je testen door een Msgbox op te laten komen met een timer over een groot bereik.

Edit:
Ander methode.
Code:
Sub hsv_3()
 With Cells(1).CurrentRegion
   Range("M2") = "=D2=1"
  .AdvancedFilter 1, Range("M1:M2")
  .Offset(1).EntireRow.Delete
  .AutoFilter
 End With
Range("M2").ClearContents
End Sub
 
Laatst bewerkt:
Een vergelijkende test voor de geposte macro's voor een tabel van 10000 entries en screenupdating uit:
- For-next loop van mij 58 sec
- hsv1 19 sec
- hsv3 55 sec

Lijkt me overtuigend.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan