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

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

Посетитель

Здравствуйте, подскажите, пожалуйста, почему вставка формулы не прекращается после последней видимой строки, несмотря на SpecialCells(xlCellTypeVisible), а продолжается до самой последней строки Excel, около 60 с чем-то тысяч там.

---------------------------------------------------------------------------------------------------------------

Range("H2:H" & R).AutoFilter Field:=8, Criteria1:="=*C*", Operator:=xlFilterValues ' Оставляются через фильтр строки, которые содержат в диаметре букву "С"
   
    Dim cRange As Range
    Dim b As Range
    Set cRange = ActiveCell.CurrentRegion.SpecialCells(xlCellTypeVisible)  ' Эта формула выбирает все видимые ячейки в непрерывном диапазоне (CurrentRegion) вокруг активной ячейки
    For Each b In cRange.Rows
    If b.Cells(9) Like "*/*" Then
      Else
      b.Cells(8).Replace What:="C", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2          ' В выбранном фильтром столбце удаляется буква "C"
    End If
    Next
    ActiveSheet.ShowAllData
   
    Range("H2:H" & R).AutoFilter Field:=8, Criteria1:="<>*C*", Operator:=xlFilterValues ' Оставляются через фильтр строки, которые не содержат в диаметре букву "С"
    Columns("E:E").ClearContents ' Очищаются ячейки колонки с надписью "легкогрузовая"
    ActiveSheet.ShowAllData
   
    Range("L2:L" & R).AutoFilter Field:=12, Criteria1:="шип", Operator:=xlFilterValues ' Оставляются через фильтр строки, которые не содержат в диаметре букву "С"
    ActiveSheet.AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete ' Удаляет выбранные фильтром строки
    ActiveSheet.ShowAllData
       
    R = Cells(Rows.Count, 1).End(xlUp).Row
    Range("H2:H" & R).AutoFilter Field:=8, Criteria1:="=*C*", Operator:=xlFilterValues ' Оставляются через фильтр строки, которые содержат в диаметре букву "С"
       
    Set cRange = ActiveCell.SpecialCells(xlCellTypeVisible)  ' Эта формула выбирает все видимые ячейки в текущей области активной ячейки
    For Each b In cRange.Rows
        b.Cells(15).FormulaR1C1 = "=RC[1]*1.08"
       
    Next
   
    End Sub

===================================

Первый раз  (в начале кода) операции после фильтра проходят хорошо, третий же раз, где вставляется формула (в конце кода) .... начинает считать до 60 000 строк. А в фильтре всего 214 видимых строк.

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

Какой адрес сообщает MsgBox:
Sub Макрос()
    MsgBox ActiveCell.CurrentRegion.Address
End Sub


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

В этом коде на первый взгляд что-то не то:
Set cRange = ActiveCell.SpecialCells(xlCellTypeVisible)  ' Эта формула выбирает все видимые ячейки в текущей области активной ячейки
For Each b In cRange.Rows
    b.Cells(15).FormulaR1C1 = "=RC[1]*1.08"
Next

Здесь у вас SpecialCells(xlCellTypeVisible) применяется не к ActiveCell.CurrentRegion, а просто к ActiveCell.

Посетитель

Да, потому что если добавить CurrentRegion, то считать начинает не в 15 столбце, а в 5-м. Потому что между 10-м и 14-м столбцом идут пустые столбцы. А по Region может считать только смежные, неразрывные области. И при попытке написать 15, 16, 17 столбцы в Cell, считать начинает соответственно в 5,6,7 столбцах.

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

Если уменьшить код и оставить только проблемный фрагмент, то ошибка остаётся?

Код
Sub Macro()
   
    Dim cRange As Range
    Dim b As Range
   
    r = Cells(Rows.Count, 1).End(xlUp).row
    Range("H2:H" & r).AutoFilter Field:=8, Criteria1:="=*C*", Operator:=xlFilterValues ' Оставляются через фильтр строки, которые содержат в диаметре букву "С"
    Set cRange = ActiveCell.SpecialCells(xlCellTypeVisible)  ' Эта формула выбирает все видимые ячейки в текущей области активной ячейки
    For Each b In cRange.Rows
        b.Cells(15).FormulaR1C1 = "=RC[1]*1.08"
    Next
 
End Sub
[свернуть]

Посетитель


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

Этот код выдаст в View - Immediate Window адреса. Какие адреса выдал код?

Код
Sub Macro()
   
    Dim cRange As Range
    Dim b As Range
   
    r = Cells(Rows.Count, 1).End(xlUp).row
    Range("H2:H" & r).AutoFilter Field:=8, 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
[свернуть]

Посетитель

Не пойму никак .... С таким кодом, именно сам по себе это кусок

Sub Macro()
 
    Dim cRange As Range
    Dim b As Range
    Dim R As Long
 
    R = Cells(Rows.Count, 1).End(xlUp).Row
    Range("H2:H" & R).AutoFilter Field:=8, 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

макрос не проходит. Выдаёт ошибку 1004 : "Метод AutoFilter из класса Range завершён неверно"

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

Field:=8 - под 8 вы какой столбец подразумеваете (какая буква столбца)?


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

Эта команда создаёт фильтр в столбце H:
 Range("H2:H" & R).AutoFilter

Соответственно, фильтр будет находиться только в столбце H, а не со столбца A по H (или по другой столбец).
Параметр Field не связан со столбцами Excel, у AutoFilter своя нумерация столбцов.
Т.к. в фильтре только один столбец, а вы указываете столбец 8, то происходит ошибка, т.к. в фильтре нет столбца 8.

Посетитель

Спасибо !
Вот адреса:
$A$1
$1:$2,$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

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

На первый взгляд что-то не то. Фильтр вы ставите со строки 2, а в результат попадает и строка 1.

Посетитель

Не знаю. В файле нет пустых строк вначале. Первая строка идёт уже заполненная.
Та строка, куда ставится фильтр, не учитывается им: надо будет вставлять пустую строку, наверное, чтобы считал с первой.
Но пока суть в том, что цикл идёт не по последнюю заполненную отфильтрованную строку, а до конца Excel