VBA 基于单元格的条件格式 .rank 值 - Top10

VBA Conditional Format .rank value based on a cell - Top10

我最初需要 select 前 5% 的 selected 项目,但是它无法将突出显示的项目数汇总。例如:如果列表中有 25 个项目,则 5% 为 1.25,条件格式仅 selecting 1 个项目。根据我的报告,它应该四舍五入和 select 2 项。

由于找不到执行此操作的方法,我决定手动计算项目数,以显示要突出显示的项目数(在一个单元格中)。

  1. 如果有一种方法可以使条件格式对 selected 项目的数量进行四舍五入,那就更容易了。

例如: .rank = 5(但应该四舍五入) .percent = 真

如果不行,

  1. 我想使用条件格式突出显示列中的前 X 值。 值 X(排名)在单元格中计算,每次宏为 运行.
  2. 时都会更改

我试过下面的代码,但它不起作用。

Dim i As Integer
    i = Workbooks("a.xlsm").Worksheets("b").Range("A1")

Selection.FormatConditions.AddTop10
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1)
    .TopBottom = xlTop10Top
    .Rank = i
    .Percent = False
End With
With Selection.FormatConditions(1).Interior
    .PatternColorIndex = xlAutomatic
    .Color = 65535
    .TintAndShade = 0

End With

我在“.rank = i”行收到错误,这让我觉得不可能在那里分配变量,或者我可能错误地分配了单元格。

我也尝试了“.rank = i.Value”,这似乎也是错误的(编译错误:无效限定符)

我是 vba 的新手,如有任何帮助,我们将不胜感激。

ps: 使用 Office 365。

谢谢

Update:只要 "i" 值不为零,上面的代码就可以工作。 我设法创建了一个简单的 If 语句来防止错误。

'In my report i cannot be below 0
If i > 0 Then
  Insert the code above here
'If there is no data to be highlighted
Else
'Do Nothing
End If

如果非 VBA 解决方案适合您,您可以使用它。我制作了一个假数据集,只是一个包含 25 个值(数字 1 到 25)的列表。您想要突出显示高出 5% 的值。 25 的 5% = 1,25,但四舍五入为 2。因此,在这种情况下,您想要突出显示值是前 2 个值之一的任何单元格。

我知道了:

如您所见,值 25 和 24 突出显示。我使用的条件格式规则 (CFR) 基于此公式:

=RANK(A1;$A:$A;0)<=ROUNDUP(COUNTA($A:$A)*0,05;0)

这是它的工作原理:

  1. RANK(A1;$A:$A;0) 将按 descendent 顺序排列列表中的值。
  2. ROUNDUP(COUNTA($A:$A)*0,05;0) 将计算列表中有多少个单元格 (25) 并将得到 5%(乘以 0,05,将 0,05 更改为您需要的 %),它会四舍五入它向上(在这种情况下,输出将是 2)。
  3. 最后一步会将第 1 步的值与第 2 步的值进行比较。如果小于或等于 2(在本例中),它将突出显示,如您所见

请注意,如果有空白值,此 CFR 可能无法正常工作。

此外,好处是将 0,05 部分更改为您需要的任何百分比,CFR 将完美更新。您甚至可以将它绑定到一个单元格,然后手动更改单元格的值:)

希望这对你有用!

AppliesTo 属性 为您提供条件适用的范围。 然后,您可以从中获取单元格计数,将其乘以 5%,然后使用 WorksheetFunction 将其四舍五入。

.Rank = WorksheetFunction.RoundUp(.AppliesTo.Cells.Count * 0.05, 0)
.Percent = False