Условный формат VBA. Значение ранга на основе ячейки - Top10 - PullRequest
0 голосов
/ 24 сентября 2019

Первоначально мне нужно было выбрать верхние 5% выбранных элементов, но он не смог округлить количество выделенных элементов.Например: если в списке 25 элементов, 5% - это 1,25, а в условном формате выбирается только 1 элемент.Согласно моему отчету, он должен округлить его и выбрать 2 пункта.

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

  1. Было бы проще, если бы был способ заставить условный формат округлять количество выбранных элементов.

, например: .rank = 5 (но следует округлить его) .percent = True

Если это невозможно,

Я хотел бы выделить верхние значения 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: usingoffice 365.

Спасибо

Обновление : приведенный выше код работает до тех пор, пока значение "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 ]

1 голос
/ 24 сентября 2019

Если решение не VBA может работать для вас, вы можете использовать это.Я сделал поддельный набор данных, просто список из 25 значений (от 1 до 25).Вы хотите выделить на 5% более высокие значения.5% от 25 = 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) ранжирует значение внутриlist, в порядке потомок .
  2. ROUNDUP(COUNTA($A$1:$A$25)*0,05;0) подсчитает, сколько ячеек в списке (25) и получит 5% (умножение на 0,05, изменение 0,05в%, который вам нужен), и он округлит его вверх (в этом случае будет получено 2).
  3. Last Step сравнивает значение шага 1 со значением шага 2. Если оно меньшеили равно 2 (в данном случае), оно будет выделено, как вы можете видеть

Обратите внимание, что этот CFR может работать некорректно, если есть значения пробелов.

ТакжеХорошо, что при изменении 0,05 на любой%, который вам нужен, CFR будет обновляться идеально.Вы даже можете привязать его к ячейке и вручную изменить значение ячейки:)

Надеюсь, это работает для вас!

0 голосов
/ 24 сентября 2019

Свойство AppliesTo дает диапазон, в котором применяется условие.Затем вы можете получить из этого числа клеток, умножить его на 5% и округлить, используя функцию WorksheetFunction.

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