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

时间:2019-09-24 11:05:08

标签: excel vba formatting conditional-statements conditional-formatting

我本来需要选择所选项目的前5%,但无法将突出显示的项目数进行四舍五入。例如:如果列表中有25个项目,则5%为1.25,而“条件格式”仅选择1个项目。根据我的报告,它应该四舍五入并选择2个项目。

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

  1. 如果有一种方法可以使条件格式四舍五入所选项目的数量,那会更容易。

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

如果不可能,

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

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

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:使用Office365。

谢谢

更新:只要“ 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

2 个答案:

答案 0 :(得分:1)

如果您可以使用Non-VBA解决方案,则可以使用它。我制作了一个假数据集,仅列出了25个值(数字1至25)。您想突出显示5%更高的值。 25的5%= 1,25,但将其四舍五入为2。因此,在这种情况下,您要突出显示任何值是前两个值之一的单元格。

我明白了:

enter image description here

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

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

它是这样工作的:

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

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

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

希望这对您有用!

答案 1 :(得分:0)

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

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