Как найти верхние n значений в коллекции? - PullRequest
0 голосов
/ 26 октября 2018

Итак, у меня есть столбец данных, который я разделил на несколько (несмежных) коллекций, и я хотел бы выделить верхние значения в каждой коллекции.До сих пор мне удавалось выделить каждое значение в каждой коллекции, но я понятия не имею, как найти хотя бы максимум коллекции, не говоря уже о переменном числе верхних значений.

Вот что у меня пока есть:

Sub Test()

Dim i As Integer
Dim t As Variant
Dim T1 As New Collection
Dim T2 As New Collection
Dim T3 As New Collection


    'Sort into collections
    For i = 2 To 195
        If Cells(i, 14) = "" Then
                Rows(i).EntireRow.Hidden = True
        ElseIf Cells(i, 14) < 10000 Then
                T1.Add Cells(i, 16)
        ElseIf Cells(i, 14) > 100000 Then
                T3.Add Cells(i, 16)
        Else
                T2.Add Cells(i, 16)
        End If
    Next i

    'colour cells
    For Each t In T1
            t.Interior.Color = RGB(204, 236, 255)
    Next t

     For Each t In T2
            t.Interior.Color = RGB(204, 204, 255)
    Next t

     For Each t In T3
            t.Interior.Color = RGB(204, 153, 255)
    Next t

End Sub

Я бы хотел заменить часть 'цветных ячеек на что-то вроде

For Each t in T1 
    If t > (nth largest value in T1) Then 
        t.Interior.Color = RGB(whatever)
    End If 
Next t 

Интересно, если бы я вызывалБольшая функция и использование переменной для k может сработать, но я боюсь, что несмежная природа ячеек, в которой нужно искать, не будет работать в этой функции.

Буду очень признателен за помощь в выяснении этого <3 </p>

1 Ответ

0 голосов
/ 26 октября 2018

вы можете использовать SortedList объект вместо Collection и иметь значения столбца P в качестве ключей и ячейки столбца P в качестве своих элементов, чтобы они автоматически сортировались по ключам:

Option Explicit

Sub Test()
    Dim i As Long

    Dim T1 As Object
    Dim T2 As Object
    Dim T3 As Object

    Set T1 = CreateObject("System.Collections.SortedList") ' set a sorted list object
    Set T2 = CreateObject("System.Collections.SortedList") ' set a sorted list object
    Set T3 = CreateObject("System.Collections.SortedList") ' set a sorted list object

    For i = 2 To 195
        If Cells(i, 14) = "" Then
                Rows(i).EntireRow.Hidden = True
        ElseIf Cells(i, 14) < 10000 Then
                T1.Add Cells(i, 16).Value, Cells(i, 16) ' add an element to T1 sorted list with current column P value as key and current column P cell as item
        ElseIf Cells(i, 14) > 100000 Then
                T3.Add Cells(i, 16).Value, Cells(i, 16) ' add an element to T1 sorted list with current column P value as key and current column P cell as item
        Else
                T2.Add Cells(i, 16).Value, Cells(i, 16) ' add an element to T1 sorted list with current column P value as key and current column P cell as item
        End If
    Next i

    ColourIt T1, 4, RGB(204, 236, 255)
    ColourIt T2, 4, RGB(204, 204, 255)
    ColourIt T3, 4, RGB(204, 153, 255)
End Sub


Sub ColourIt(T As Object, ByVal maxElementsNumber As Long, color As Long)
    Dim j As Long, lastElementIndex As Long

    With T ' reference passed object
        If maxElementsNumber <= .Count Then lastElementIndex = .Count - maxElementsNumber 'set last element index to be colored according to sorted list actual items number

        For j = .Count - 1 To lastElementIndex Step -1 ' loop through sorted list items backwards to start from the highest key down to the lowest
            .GetByIndex(j).Interior.color = color ' color current sorted list item
        Next
    End With

End Sub
...