Just nu i M3-nätverket
Gå till innehåll

Filtrera rader i tabell baserat på värde som skrivs in i cell


ninaax

Rekommendera Poster

Hej,

 

Jag håller på att sätta ihop ett ganska stort excelark för att samla information om anställda och deras kompetenser på företaget jag arbetar på. För att göra det lättare för min chef att använda arket hade jag velat kunna filtrera i den tabell jag skapat på ett enkelt sätt. Jag googlade på det (på engelska) och någon rekommenderade följande vba-kod:

 

Private Sub Worksheet_Change(ByVal Target As Range)
'Updateby Extendoffice 20160606
   If Target.Address = Range("E2").Address Then
       Range("A1:C20").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("E1:E2")
   End If
End Sub

 

Kodens syfte var att skapa en cell i arket där man kan skriva in ett värde och tabellen då automatiskt filtreras så att bara rader som innehåller det värdet syns. Det verkar ha funkat för folk i kommentarfältet, men jag får det inte att fungera. Jag har Excel 2016 på svenska, men har laddat ner ett engelskt språkpaket. Har insett att även om jag nu kan använda engelska funktioner så är det fortfarande småsaker som skiljer sig (exempelvis måste jag använda ; istället för , i funktionerna). Skiljer sig även VBA-koder mellan engelska och svenska Excel och vet någon vad jag i så fall behöver ändra i koden ovan för att få det att fungera?

 

Tack på förhand!

 

Nina

Länk till kommentar
Dela på andra webbplatser

VBA är lika oavsett språkinställningarna.

 

Jag brukar säga att

  • Om du kan, håll dig till formler.
  • Om du tror att det inte räcker med formler, titta en gång till.
  • Om det inte räcker med formler, ta till VBA-kod då.
  • Om det inte räcker med vanlig VBA-kod som startas vi en knapp finns det händelsefunktioner men dessa ska du fundera på om du måste använda både två, tre eller fyra gånger. Går det verkligen INTE att lösa på annat sätt?
  • Går det VERKLIGEN inte att lösa på annat sätt?
  • Om du nu använder händelsefunktioner se till att, som ovan, ha ett först enkelt kriteria som filtrerar bort 99% av alla anrop.

Till saken, koden ska lägga på den modul som tillhör det blad det ska verka på.

Första villkoret ger att funktionen körs enbart om cell E2 har ändrats. Endast då.

Men börja utvecklingen med att skapa en stabil funktion som du startar vi en knapp.

Eller, om nu datamängden inte är för stort, kan man alltid sortera via formler men om mycket data blir det eventuellt lite segt.

 

 

Länk till kommentar
Dela på andra webbplatser

Hej Monshi!

 

Tack så mycket för snabbt och utförligt svar! Jag fick det att fungera när jag döpte om bladet från Blad1 till Sheet1, eller så var det bara en slump att det fungerade just då. Oavsett så fungerade det bara en gång, när jag clearade alla filter och skrev in ett nytt värde i "sökcellen" fungerade det inte. Vet du vad det skulle kunna bero på?

 

Vänliga hälsningar,

Nina

Länk till kommentar
Dela på andra webbplatser

Jag skulle nog skriva koden som

 Private Sub Worksheet_Change(ByVal Target As Range)
'Updateby Extendoffice 20160606
   If Target.Address = Me.Range("E2").Address Then
       Me.Range("A1:C20").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Me.Range("E1:E2")
   End If
End Sub 

För att vara helt tydlig med vart koden refererar. Sheet1 eller Blad1 spelar ingen roll.

 

Koden körs när du skriver in ett värde i Cell E2 och aldrig annars. Enbart när cellen som finns i If-satsen ändras körs resten av koden.

det går att skriva på annat sätt om man vill bevaka fler celler men ju fler celler som bevakas ju oftare körs den och körs den hela tiden så tar den tid.

Om du har annan VBA-kod som skriver till bladet se till att stäng av händelsefunktionerna när denna körs, annars kan exekveringstiden mångfaldigas.

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...