Формула условного форматирования Excel и диапазоны (VBA) - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть FormatCondition. Я читаю .Formula1 и .AppliesTo

Я хочу выяснить, содержит ли формула ссылку на ячейку, которая будет изменяться в диапазоне, указанном в AppliesTo, например, =NOT(ISNUMBER(C3)) в диапазоне C3:D10.

Из того, что я могу сказать, эта ссылка может быть относительной (например, C3) или смешанной (например, $C3 или C$3), но не абсолютной. Это также будет «верхняя левая ячейка в примененном диапазоне» на основе https://www.ablebits.com/office-addins-blog/2014/08/07/relative-absolute-cell-references-excel-conditional-formatting/ и некоторых других сайтов.

Если диапазон похож на C3:D10, тогда это легко. Найдите верхний левый угол, например, с помощью myRange.Cells(1, 1), преобразуйте его в строку, используя .Address или аналогичную, а затем найдите эту строку в формуле вместе с соответствующими вариантами, добавив $. Конечно, я должен быть осторожен с такими вещами, как строки (например, верхняя левая ячейка - C3' and formula is = "CC3NE" `), но это возможно (тем не менее, я бы приветствовал предложения о том, как сделать это лучше, но это не так вопрос).

Реальная проблема заключается в том, что диапазон более сложный, как это часто бывает с условным форматированием. Примером является $CQ$39:$FT$39,$BE$39,$BE$8:$BE$9,$CU$8:$FT$9,$CU$12:$FT$14,$BE$12:$BE$14,$BE$16:$BE$30,$CQ$16:$FT$30,$CQ$32:$FT$36,$BE$32:$BE$36. .Cells(1, 1) не дает правильного ответа на это (BE8, в соответствии с формулой, сделанной в Excel).

Кроме того, что, если диапазон был чем-то вроде $A$5,$E$1 - «слева вверху» нет. Итак, как Excel (или пользователь) решает, что должно быть в формуле?

Таким образом, основной вопрос: Какая система для Excel определяет, какую ячейку использовать в формуле, потому что я не верю, что это «верхний левый» - это может быть «найти самую верхнюю строку, затем найдите там самую левую ячейку », или это может быть наоборот, или что-то совершенно другое.

Второй вопрос: как наилучшим образом найти эту ячейку из заданного диапазона?

Бонусный вопрос (я рад, если здесь не будет ответа): Есть ли хороший способ найти ссылки на эту ячейку в формуле, включая относительные и смешанные версии этой ячейки?

Обратите внимание, что эти странные диапазоны возникают из-за того, что строки и столбцы вырезаются и вставляются на лист с условным форматированием, а Excel в результате обрезает условное форматирование (изменение диапазона и изменение формулы, как без ввода пользователя) ). Таким образом, приоритет заключается в том, чтобы справиться с тем, что Excel будет устанавливать формулу как самостоятельную в таком сценарии, а не обязательно с тем, что может делать пользователь - но обработка обоих будет еще лучше.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Спасибо за обновление вашего вопроса и найдите ниже мои комментарии

Какова система для Excel, определяющая, какую ячейку использовать в формуле, потому что я не верю, что это «верхний левый» - это может быть «найти самую верхнюю строку, а затем найти самую левую ячейку там» Или это может быть наоборот, или что-то совершенно другое.

Обычно диапазон в Excel похож на прямоугольник или прямоугольник с фиксированной длиной и шириной, например В3: С8. В случае этого простого диапазона типов ячеек верхняя левая ячейка является базой для всех формул условного форматирования. Другими словами, при первой оценке формулы значение этой ячейки сверяется с формулой, применяемой при условном форматировании. (Давайте назовем эту клетку материнской клеткой)

Например

  • Если условное форматирование применяется к ячейке A1: D10 и условное формула B2> 0, это означает применить форматирование к ячейке A1, если значение B2> 0, а для других применяют форматирование к любой ячейке, если значение ячейка со смещением (1, 1) (то есть B2 в случае A1) имеет значение больше 0. То есть для форматирования B2 будет проверяться значение C3.
  • Если условное форматирование применяется к ячейке A1: D10 и условное формула AND ($ B1> = 30, $ B1 <= 60) означает применение форматирования к ячейка A1, если значение условия истинно, но теперь разница приходит, потому что B теперь статический из-за $ B, для условного форматирования В2 условие снова будет И ($ B1> = 30, $ B1 <= 60) таким же для С1 и D1, но для A2, B2, C2 и D2 это будет AND ($ B2> = 30, $ B2 <= 60) </li>

В первом случае первая ячейка, которая была проверена по формуле, была A1, и даже во втором случае ячейка, которая была проверена по условной формуле, была A1 (которую мы назвали материнской ячейкой)

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

На ваш второй вопрос, как лучше всего найти эту ячейку из заданного диапазона?

Если вы хотите найти материнскую клетку в поле, похожем на простой Range, это просто ячейки (1, 1)

Если вы хотите обнаружить, что ячейка в смешанном диапазоне может быть, есть некоторые функции, но я не знаю ни одной; Я нашел бы это с помощью цикла, как показано ниже

Sub find_topleft()

 Dim r, full_range As Range

 Set r = Range("$O$8:$O$17,$Q$4:$Q$13,$S$4:$S$6")

 Set full_range = Sheets("Sheet1").UsedRange

 row_num = full_range.Rows.Count + full_range.Row - 1
 col_num = full_range.Columns.Count + full_range.Column - 1

 For Each c In r
    If c.Row < row_num Then
    row_num = c.Row
    End If

    If c.Column < col_num Then
    col_num = c.Column
    End If
 Next

 Debug.Print row_num
 Debug.Print col_num

End Sub

Есть ли хороший способ найти ссылки на эту ячейку в формуле, включая относительные и смешанные версии этой ячейки?

Эта ячейка напрямую связана с формулой, указанной в ответе на ваш первый вопрос.

0 голосов
/ 12 ноября 2018

Первый ответ : Короткая версия: Excel действительно использует самую верхнюю левую ячейку - но она делает это ДАЖЕ, ЕСЛИ КЛЕТКА НЕ ЧАСТЬ ДИАПАЗОНА .

Я создал чистый лист, выбрал A5,E1 и поместил в условный формат NOT BLANK (что Excel делает с формулой). Excel создал следующее:

Диапазон: $E$1,$A$5

Формула: =LEN(TRIM(A1))>0

Так что, хотя A1 не входит в диапазон, это то, что использовалось в формуле.

Я проверил это, продублировав его вокруг листа, и он остался неизменным.

Таким образом, Excel находит самый левый столбец в диапазоне и самую верхнюю строку в диапазоне и объединяет их, чтобы создать ячейку, которая должна рассматриваться как «верхняя левая» диапазона, даже если полученная ячейка фактически не является частью диапазона.

Также предлагается ответ на второй вопрос : найдите самую верхнюю строку в диапазоне; найдите самый левый столбец; затем используйте ячейку, которая объединяет два, чтобы сравнить с формулой. Вы можете сделать это, пройдя через строку диапазона или, возможно, ячейку за ячейкой через сам диапазон; возможно, есть лучший способ сделать это (предложения приветствуются).

Это не красиво, но сработало бы, если бы я нашел хороший способ сделать эти две вещи.

Я бы все равно приветствовал:

  • любой, кто может улучшить этот ответ о том, какая ячейка используется в формуле (я не проверял это подробно)
  • любой, кто может предложить хороший способ найти «верхнюю левую ячейку», как указано выше
  • любой, кто может предложить хороший способ поиска строки формулы для этой верхней левой ячейки

РЕДАКТИРОВАТЬ - Вот альтернативный метод кода превосходному методу Усманхака - он проходит через диапазон в виде строки:

Private Function FindTopLeft(rangeStr As String, rowabs As Boolean, colabs As Boolean) As String
    newRange = Replace(rangeStr, ":", ",")
    newRangeArray = Split(newRange, ",")
    Dim lowestRow As Long
    Dim lowestCol As Long
    lowestRow = 2147483647
    lowestCol = 2147483647

    For Each cell In newRangeArray
        cell = Trim(cell)
        If cell <> "" Then
            cCol = range(relativeCell).Column
            cRow = range(relativeCell).Row
            If cCol < lowestCol Then lowestCol = cCol
            If cRow < lowestRow Then lowestRow = cRow
        End If
    Next

    FindTopLeft = Cells(lowestRow, lowestCol).Address(rowabs, colabs)

End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...