Вставка формулы по отфильтрованным ячейкам идёт до конца Excel

Автор Посетитель, 11 июля 2024, 15:22

Администратор

Почему вы фильтр применяете со строки 2? В фильтр включается и шапка таблицы.
У вас шапка начинается с какой строки? С 1 или со 2?

Посетитель

Шапки нет. Строки со значением идут с первой строки. Я вставлял пустую строку в коде раньше, поэтому фильтр начинал со 2 строки.

Администратор

В фильтр нужно включать и шапку. Если вы указываете строку 2, то строка 2 не участвует в фильтре.

Посетитель


Администратор

Сделайте человеческий код. Вторая строка ведь тоже должна участвовать в расчётах?
Сделайте так, чтобы фильтр создавался со строки 1.
Иначе сейчас вообще не понятно, что у вас там происходит.

Посетитель

Не пойму ....
Вот ставлю поле фильтра = 1, как только для одного указанного столбца F. НО. При пошаговом выполнении кода видно, что фильтр ставится вовсе не в F, а в первый столбец (А), и фильтрует там ....... Почему фильтрует не в F ?

Dim r As Long
r = Cells(Rows.Count, 1).End(xlUp).Row
Range("F1:F" & r).AutoFilter Field:=1, Criteria1:="<135", Operator:=xlFilterValues

Администратор

Если фильтр применён не к одному столбцу (в данном случае к F), а к нескольким: от A до F и т.д. (стрелочки в Экселе находятся не в одном столбце, а в нескольких), то.
В коде вы указываете столбец F, но это игнорируется фильтром, а фильтр рассматривает всю область, где есть фильтр. Соответственно Field будет относительно всего диапазона, к которому применён фильтр.

Посетитель

Исправил код.
Всё осталось так же: формулу ставит в строки до конца Excel, а не только в видимые.
Запускаю Ваш код:

Sub Macro()
   
    Dim cRange As Range
    Dim b As Range
    Dim R As Long
   
    R = Cells(Rows.Count, 1).End(xlUp).Row
    Range("H1:H" & R).AutoFilter Field:=1, Criteria1:="=*C*", Operator:=xlFilterValues
    Set cRange = ActiveCell.SpecialCells(xlCellTypeVisible)
    Debug.Print ActiveCell.Address
    Debug.Print cRange.Address
    For Each b In cRange.Rows
        b.Cells(15).FormulaR1C1 = "=RC[1]*1.08"
    Next

End Sub

Получаю в Immediate Window:

$A$1
$1:$1,$414:$427,$469:$490,$623:$648,$727:$727,$743:$756,$986:$987,$1312:$1312,$1854:$1856,$1888:$2033,$2077:$2080,$2147:$2189,$2196:$2196,$2201:$2207,$2246:$2332,$2341:$2424,$2449:$2455,$2463:$2463,$2587:$2597,$2639:$2639,$2782:$2790,$2920:$2924,$2971:$2971

Администратор

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

Код:
Sub Macro()
 
    Dim cRange As Range
    Dim b As Range
    Dim R As Long
 
    R = Cells(Rows.Count, 1).End(xlUp).row
    Range("H1:H" & R).AutoFilter Field:=1, Criteria1:="=*C*", Operator:=xlFilterValues
    Set cRange = ActiveSheet.AutoFilter.Range.Offset(1).Columns(1).SpecialCells(xlCellTypeVisible).EntireRow
    Debug.Print ActiveCell.Address
    Debug.Print cRange.Address
    For Each b In cRange.Rows
        b.Cells(15).FormulaR1C1 = "=RC[1]*1.08"
    Next

End Sub
[свернуть]

Администратор

Дописал в ответ пояснения и в код внёс изменения.

Посетитель

Спасибо, заработало ! Вы хорошо объясняете.
"но включит строку, которая находятся под таблицей. В этом случае нужно ещё внести изменения в код, который обращается к телу фильтра."
Вот к телу:
Range("H1:H" & R).AutoFilter Field:=1, Criteria1:="=*C*", Operator:=xlFilterValues
А какие изменения ?

Администратор

Вот так можно исключить строку, которая находится под таблицей.

Код:
Sub Macro()
 
    Dim cRange As Range
    Dim b As Range
    Dim R As Long
 
    R = Cells(Rows.Count, 1).End(xlUp).row
    Range("H1:H" & R).AutoFilter Field:=1, Criteria1:="=*C*", Operator:=xlFilterValues
    Set cRange = ActiveSheet.AutoFilter.Range.Offset(1).Resize(ActiveSheet.AutoFilter.Range.Rows.Count - 1) _
        .Columns(1).SpecialCells(xlCellTypeVisible).EntireRow
    Debug.Print ActiveCell.Address
    Debug.Print cRange.Address
    For Each b In cRange.Rows
        b.Cells(15).FormulaR1C1 = "=RC[1]*1.08"
    Next

End Sub
[свернуть]

Посетитель

Извините. Но одну строчку после последней видимой формула всё равно посчитала:

Set cRange = ActiveSheet.AutoFilter.Range.Offset(1).Resize(ActiveSheet.AutoFilter.Range.Rows.Count - 1).Columns(1).SpecialCells(xlCellTypeVisible).EntireRow


Администратор

Какой адрес даёт этот код, совпадает с адресом вашей таблицы?

Sub Macro()
    Debug.Print ActiveSheet.AutoFilter.Range.Offset(1).Resize(ActiveSheet.AutoFilter.Range.Rows.Count - 1).Address
End Sub