Добрый день! Установите фильтр и сортируйте вначале по Штукам, потом по Клиенту, или воспользуйтесь Настраиваемой сортировкой, только тут наоборот вначале по клиенту, потом по штукам
Sub КапПерРанг()
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
With ActiveSheet.UsedRange
Dim ya As Long, arr As Variant, brr As Variant
arr = .Columns(1).Resize(, 2).Value
For ya = 2 To UBound(arr, 1)
If Not dic.Exists(arr(ya, 1)) Then
Set dic(arr(ya, 1)) = CreateObject("Scripting.Dictionary")
End If
dic(arr(ya, 1))(.Cells(ya, 2).Value) = Empty
Next
For ya = 2 To UBound(arr, 1)
brr = dic(arr(ya, 1)).keys()
.Cells(ya, 4).Resize(1, UBound(brr) + 1).Value = brr
.Cells(ya, 3).FormulaR1C1 = "=RANK(RC[-1],RC[1]:RC[" & UBound(brr) + 1 & "])"
Next
End With
End Sub
let
f=(x)=>Table.AddRankColumn(x,"Ранг",{"Штуки",1}),
from=Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
gr=Table.Combine(Table.Group(from,"Клиент",{"tmp",f})[tmp])
in
gr
если порядок необходимо сохранить как во втором примере
pq_v2
Код
let
f=(x)=>((a)=>Table.Sort(Table.AddRankColumn(a,"Ранг",{"Штуки",1}),"ind"))
(Table.AddIndexColumn(x,"ind",0,1)),
from=Excel.CurrentWorkbook(){[Name="Таблица3"]}[Content],
gr=Table.RemoveColumns(Table.Combine(Table.Group(from,"Клиент",{"tmp",f})[tmp]),"ind")
in
gr
Если клиенты сгруппированы, то можно таким макросов вставить формулу РАНГ()
Скрытый текст
Код
Sub Макрос1()
Dim n As Integer
Set sd = CreateObject("Scripting.Dictionary")
lr = Cells(Rows.Count, 1).End(xlUp).Row
arr = Range("A2:B" & lr).Value
ReDim arr_r(1 To UBound(arr), 1 To 1)
For n = 1 To UBound(arr)
If Not sd.Exists(arr(n, 1)) Then
sd.Add arr(n, 1), n + 1
Else
sd(arr(n, 1)) = sd(arr(n, 1)) & ";" & n + 1
End If
Next
For n = 1 To UBound(arr)
arr_r(n, 1) = "=RANK(B" & n + 1 & ",$B$" & Split(sd(arr(n, 1)), ";")(0) & ":$B$" & Split(sd(arr(n, 1)), ";")(UBound(Split(sd(arr(n, 1)), ";"))) & ",0)"
Next
[c2].Resize(UBound(arr_r), 1) = arr_r
End Sub
Если не сгруппированы то таким по возрастанию
Скрытый текст
Код
Sub A_Z()
Dim n As Integer, m As Integer
Set sd = CreateObject("Scripting.Dictionary")
Set sd_1 = CreateObject("Scripting.Dictionary")
arr = Range("A2:B" & Cells(Rows.Count, 1).End(xlUp).Row).Value
ReDim arr_r(1 To UBound(arr), 1 To 1)
For n = 1 To UBound(arr)
If Not sd.Exists(arr(n, 1)) Then
Set sd(arr(n, 1)) = CreateObject("Scripting.Dictionary")
Set sd_1(arr(n, 1)) = CreateObject("Scripting.Dictionary")
sd(arr(n, 1)).Add arr(n, 2), 1
Else
sd(arr(n, 1))(arr(n, 2)) = sd(arr(n, 1))(arr(n, 2)) + 1
End If
Next
For Each y In sd_1
arr_2 = sd(y).Keys
For i& = LBound(arr_2) To UBound(arr_2) - 1
For j& = LBound(arr_2) To UBound(arr_2) - i - 1
If arr_2(j) > arr_2(j + 1) Then Tmp = arr_2(j): arr_2(j) = arr_2(j + 1): arr_2(j + 1) = Tmp
Next j
Next i
m = 1
For Each y1 In arr_2
sd_1(y).Add y1, m
m = sd(y)(y1) + m
Next
Next
For n = 1 To UBound(arr)
arr_r(n, 1) = sd_1(arr(n, 1))(arr(n, 2))
sd_1(arr(n, 1))(arr(n, 2)) = sd_1(arr(n, 1))(arr(n, 2)) + 1
Next
Range("C2").Resize(UBound(arr_r), 1).Clear
Range("C2").Resize(UBound(arr_r), 1) = arr_r
End Sub
А таким по убыванию
Скрытый текст
Код
Sub Z_A()
Dim n As Integer, m As Integer
Set sd = CreateObject("Scripting.Dictionary")
Set sd_1 = CreateObject("Scripting.Dictionary")
arr = Range("A2:B" & Cells(Rows.Count, 1).End(xlUp).Row).Value
ReDim arr_r(1 To UBound(arr), 1 To 1)
For n = 1 To UBound(arr)
If Not sd.Exists(arr(n, 1)) Then
Set sd(arr(n, 1)) = CreateObject("Scripting.Dictionary")
Set sd_1(arr(n, 1)) = CreateObject("Scripting.Dictionary")
sd(arr(n, 1)).Add arr(n, 2), 1
Else
sd(arr(n, 1))(arr(n, 2)) = sd(arr(n, 1))(arr(n, 2)) + 1
End If
Next
For Each y In sd_1
arr_2 = sd(y).Keys
m = 0
For i& = LBound(arr_2) To UBound(arr_2) - 1
For j& = LBound(arr_2) To UBound(arr_2) - i - 1
If arr_2(j) > arr_2(j + 1) Then Tmp = arr_2(j): arr_2(j) = arr_2(j + 1): arr_2(j + 1) = Tmp
Next j
m = m + sd(y)(arr_2(i))
Next i
m = m + sd(y)(arr_2(UBound(arr_2)))
For n = LBound(arr_2) To UBound(arr_2)
sd_1(y).Add arr_2(n), m
m = m - sd(y)(arr_2(n))
Next
Next
For n = 1 To UBound(arr)
arr_r(n, 1) = sd_1(arr(n, 1))(arr(n, 2))
sd_1(arr(n, 1))(arr(n, 2)) = sd_1(arr(n, 1))(arr(n, 2)) - 1
Next
Range("D2").Resize(UBound(arr_r), 1).Clear
Range("D2").Resize(UBound(arr_r), 1) = arr_r
End Sub