我有一个启用宏的工作簿,我已经处理了一段时间,其目的是从服务器中提取 TFS 项,分配业务价值,然后根据提供最大业务价值的内容对积压工作重新排序。到目前为止,我做得很好,但我遇到了一个障碍。
我正在尝试为业务价值的相邻单元格分配排序顺序,从最高到最低排序。 即,如果该列中的业务价值最高,则其旁边的值将为"1",依此类推。下面是一个示例摘录:
BusinessValue (£)
10
17280
384.6153846
0.173611111
8640
3846.153846
综上所述,我希望"17280"的值具有关联的排名"1",而"0.1736"的值具有关联的排名"6"。这似乎是一个非常简单的表达,但我在实际让 VBA 执行此操作方面没有任何运气。任何帮助将不胜感激,或者只是指点。
编辑:通过排名建议找到答案
您不需要 VBA 来执行此操作。 假设您的值在 A2:A10
中,将此公式放在 B2
中并向下填充将为您提供排名:
=RANK.EQ(A2,$A$2:$A$10)
通过更有用的挖掘(谢谢大家建议 Rank,因为我不知道这个函数(,我设法提出了以下内容,解决了我的问题:
Sub RankBusinessValue()
Dim DataSum As Worksheet
Set DataSum = ActiveWorkbook.Sheets("Summary")
Dim i As Long
Dim j As Long
i = WorksheetFunction.CountIfs(DataSum.Range("B:B"), ">0")
For j = 6 To i + 6
If DataSum.Cells(j, "H").Value > 0 Then
Range("I" & j).Value = WorksheetFunction.Rank(DataSum.Range("H" & j), DataSum.Range("H6" & ":H" & i + 6), 0)
End If
Next j
End Sub
您可以一次评估所有值(如果在 VBAProject 工作表对象中使用,则不需要Summary!
(:
Sub RankBusinessValue()
[Summary!i6:i999] = [if(Summary!j6:j999, Rank(Summary!j6:j999, Summary!j6:j999), "")]
End Sub
或者将范围限制为最后一行:
Dim ws As Worksheet, r As Long
Set ws = Sheets("Summary")
r = ws.Cells(ws.Rows.Count, "J").End(xlUp).Row ' last non-empty row in column J
ws.Range("i6:i" & r) = ws.Evaluate(Replace("if(j6:j9, Rank(j6:j9, j6:j9), """")", 9, r))