Я пытался добавить условные форматы следующим образом:
Если выражение =($G5<>"")
, то сделать внутреннюю часть набора зелёной, использовать это для $A$5:$H$25.
Попробовал это, сработало нормально, как и ожидалось, затем попытался адаптировать это как код VBA со следующим кодом, который работает, но не так, как ожидалось:
With ActiveSheet.UsedRange.Offset(1)
.FormatConditions.Delete
'set used row range to green interior color, if "Erledigt Datum" is not empty
With .FormatConditions.Add(Type:=xlExpression, _
Formula1:="=($" & cstrDefaultProgressColumn & _
.row & "<>"""")")
.Interior.ColorIndex = 4
End With
End With
Проблема в том, что .row
предоставляет правильную строку во время отладки, однако моя добавленная условная формула, похоже, не соответствует одной или нескольким строкам - в зависимости от моего решения для установки строки. Итак, я получаю условное форматирование со смещением к строке, которая должна была быть отформатирована.
В диалоге это =($G6<>"")
или G3 или G100310 или что-то в этом роде. Но не мой желанный G5.
Установка строки должна быть динамической, потому что это используется для установки условных форматов на разных листах, данные которых могут начинаться с разных строк.
Я подозревал, что у меня With
устройство, но оно не решило эту проблему.
редактировать: Чтобы быть более конкретным, это НЕ проблема с UsedRange, с такой же проблемой:
Dim rngData As Range
Set rngData = ActiveSheet.Range("A:H") 'ActiveSheet.UsedRange.Offset(1)
rngData.FormatConditions.Delete
With rngData.FormatConditions.Add(Type:=xlExpression, _
Formula1:="=($" & cstrDefaultProgressColumn & _
1 & "<>"""")")
.Interior.ColorIndex = 4
End With
Мои данные выглядят так:
1 -> empty cells
2 -> empty cells
3 -> empty cells
4 -> TitleCols -> A;B;C;...;H
5 -> Data to TitleCols
. .
. .
. .
25
Когда я выполняю этот отредактированный код в Excel 2007 и ищу формулу в условном диалоговом окне, это =($G1048571<>"")
- должно быть =($G1<>"")
, тогда все работает нормально.
Что еще более странно - это отредактированная версия отлично работающего кода, который раньше добавлял условные форматы для каждой строки. Но потом я понял, что можно написать выражение, которое форматирует целую строку или ее часть - думал, что это будет адаптировано за минуту, и теперь это ^^
Изменить: Дополнительная информация о задаче
Здесь я использую условное форматирование, потому что эти функции должны настроить таблицу, чтобы она реагировала на пользовательский ввод. Таким образом, если пользователь правильно настроил и редактирует какую-либо ячейку в моем условном столбце этой таблицы, соответствующая строка станет зеленой для используемого диапазона строк.
Теперь, поскольку могут быть строки перед основной строкой заголовка и может быть различное количество столбцов данных, а также целевой столбец может измениться, я, конечно, использую некоторую конкретную информацию.
Чтобы они были минимальными, я использую NamedRanges для определения правильного смещения и определения правильного DefaultProgessColumn
.
GetTitleRow
используется для определения строки заголовка по NamedRange или содержимому заголовка.
With ActiveSheet.UsedRange.Offset(GetTitleRow(ActiveSheet.UsedRange) - _
ActiveSheet.UsedRange.Rows(1).row + 1)
Исправил свою Формулу 1, потому что я обнаружил, что конструкция до этого была неправильно сформирована.
Formula1:="=(" & Cells(.row, _
Range(strMatchCol1).Column).Address(RowAbsolute:=False) & _
"<>"""")"
strMatchCol1
- имя диапазона.
.UsedRange
- см. stackoverflow.com/questions/ 7423022/ и, возможно, некоторые другие потоки SO - person JMax   schedule 14.09.2012