Skapa unik lista med villkor
I detta tips ska vi titta närmare på hur vi kan skapa listor med unika värden där vi också ställer villkor för att ett värde ska placeras i listan.
Se också Skapa filtrerade listor
Tipset har sin utgångspunkt i följande uppställning, där villkoret består av ett datumintervall. Givet att villkoret uppfylls och att namnet ej tidigare finns i listan (i G-kolumnen) läggs det till mha nedanstående kod:
Exempel 1:
Bygger på en äldre teknik men som fungerar alldeles utmärkt i alla versioner av XL. För att proceduren ska utföras krävs att inmatning sker inom det begränsade cellområdet (se nedan).Följande kod placeras i modulen ThisWorkbook / DennaArbetsbok:
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Worksheets("Exempel 1").OnEntry = ""
End SubPrivate Sub Workbook_Open()
ThisWorkbook.Worksheets("Exempel 1").OnEntry = "Skapa_Unik_Lista1"
End Sub
Följande kod placeras i en allmän modul:
Option Explicit
Sub Skapa_Unik_Lista1()Dim rnNamn As Range, rnLista As Range, rnBetyg As Range
Dim rnStart As Range, rnSlut As Range, rnVarde As Range
Dim lnRader As LongSet rnStart = Range("E1")
Set rnSlut = Range("E2")
Set rnBetyg = Range(Range("C2"), Range("C65536").End(xlUp))
Set rnLista = Range(Range("G1"), Range("G65536").End(xlUp))'Om inte aktiv cell befinner sig inom cellområdet rnBetyg
'avslutas proceduren.
If Intersect(rnBetyg, ActiveCell) Is Nothing Then Exit Sub
Application.ScreenUpdating = FalseSet rnNamn = ActiveCell.Offset(0, -1)
'Vid ifyllandet av det första betyget sker datumkontroll och
'namnet läggs till listan om postens datum är inom intervallet.
If rnNamn.Address = "$B$2" Then
If rnNamn.Offset(0, -1).Value >= rnStart.Value And _
rnNamn.Offset(0, -1).Value <= rnSlut.Value Then
rnLista(2, 1).Value = Range("B2").Value
Exit Sub
End If
End If'Identifiera nästa tomma rad i den unika listans kolumn.
lnRader = Application.WorksheetFunction.CountA(ActiveSheet.Range("G:G")) + 1
'Här sker kontroll om posten uppfyller datumintervallet eller inte.
If rnNamn.Offset(0, -1).Value >= rnStart.Value And _
rnNamn.Offset(0, -1).Value <= rnSlut.Value Then'Här kontrolleras om namnet redan existerar i listan eller inte.
With rnLista
Set rnVarde = .Find(What:=rnNamn.Value)
If rnVarde Is Nothing Then
'Om namnet ej finns läggs det till i listan
rnLista(lnRader, 1).Value = rnNamn.Value
End If
End With
End IfApplication.ScreenUpdating = True
End Sub
Exempel 2:
Här används händelsen Worksheet_Change för det aktuella arbetsbladet (Exempel 2)
Följande ändring görs i arbetsbladets modulkod jämfört med ovanstående kod:
Private Sub Worksheet_Change(ByVal Target As Range)
'RnBetyg ersätts med Target enligt följande:Set Target = Range(Range("C2"), Range("C65536").End(xlUp))
If Intersect(Target, ActiveCell) Is Nothing Then Exit Sub
End Sub
För att erhålla antal förekomster av respektive unikt namn inom datumintervallet används följande formel:
- =OM(ÄRTOM(G2);"";PRODUKTSUMMA(($A$2:$A$10>=$E$1)*($A$2:$A$10<=$E$2)
*($B$2:$B$10=G2)))