#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))» часть, и это сделало свое дело. Ты качаешься.