Условное форматирование, применяемое к диапазону вместо отдельной ячейки

#vba #excel #excel-formula

#vba #excel #excel-формула

Вопрос:

Следующий код предназначен для форматирования ячейки

  • если введенное значение равно No и
  • Если в массиве указано значение ячейки в той же строке и в нескольких столбцах ранее sshDevices
     Function sshProblem(rng As Range) As Boolean
    
    Dim portStatus As String
    portStatus = rng.Value
    
    Dim deviceType As String
    deviceType = Cells(ActiveCell.Row, 3).Value
    
    Dim sshDevices As Variant
    sshDevices = Array("linux", "vmw", "docker", "unix")
    
    If StrComp(portStatus, "No") = 0 Then
      If StrComp(deviceType, sshDevices(1)) = 0 Then
         sshProblem = True
      End If
    End If
    
    End Function
     

Сейчас я просто сравниваю значение DeviceType со вторым элементом в массиве. Форматирование работает правильно, если тип устройства совпадает, а содержимое — нет. Проблема в том, что когда содержимое равно No и тип устройства не совпадает, ВСЕ ячейки в столбце теряют свой формат. Например:

Я ввожу «Нет» в строке 8, и ячейка правильно отформатирована с розовым фоном: введите описание изображения здесь

Затем я делаю то же самое со столбцами 9 и 10: введите описание изображения здесь

Но когда я добираюсь до 10, я ввожу «Нет» в ячейку, но теперь значение предыдущей ячейки «ubuntu» не соответствует значению позиции 1 массива, поэтому я ожидаю, что у этой ячейки не будет розового фона, однако все предыдущие ячейки теряют свой фон при вводе»Нет»: введите описание изображения здесь

Настройки условного форматирования выглядят следующим образом (буква столбца — «I»): введите описание изображения здесь

введите описание изображения здесь

Я не знаю, в чем заключается моя проблема (rng As Range) или в том, как я настраиваю правило условного форматирования. Идеи?

Ответ №1:

Если sshProblem находится в обычном модуле, то любые ячейки / диапазон будут по умолчанию ссылаться на ActiveSheet, не обязательно на лист, из которого вы вызываете функцию.

Кроме того, ActiveCell здесь бесполезно — если вы хотите сослаться на ячейку, из которой вызывается формула, используйте Application.Caller

Наконец, вы можете использовать Application.Match для проверки, содержится ли значение в массиве.

 Function sshProblem(rng As Range) As Boolean

    Dim portStatus As String, sht As WorkSheet
    Dim rw as Long

    Set sht = rng.WorkSheet
    portStatus = rng.Value

    Dim deviceType As String

    rw = Application.Caller.Row

    deviceType = sht.Cells(rw, 3).Value

    Dim sshDevices As Variant
    sshDevices = Array("linux", "vmw", "docker", "unix")

    If StrComp(portStatus, "No") = 0 Then
        sshProblem = Not IsError(Application.Match(deviceType, sshDevices, 0))
    End If

End Function
 

Комментарии:

1. Большое вам спасибо. Я позаимствовал это Заявление. Звонивший. Строку и вставил ее вместо ActiveCell, сохранил и попробовал еще раз, безуспешно. Затем я заменил оператор 2 If на ваш «Not IsError(Application. Match(DeviceType, sshDevices, 0))» часть, и это сделало свое дело. Ты качаешься.