Форум по VBA и MS Office

VBA, Excel => VBA, макросы в Excel => Тема начата: Посетитель от 11 июля 2024, 15:22

Название: Вставка формулы по отфильтрованным ячейкам идёт до конца 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 видимых строк.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 11 июля 2024, 15:30
Какой адрес сообщает MsgBox:
Sub Макрос()
    MsgBox ActiveCell.CurrentRegion.Address
End Sub
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 11 июля 2024, 15:47
$A1$1:$J$4861
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 11 июля 2024, 16:05
В этом коде на первый взгляд что-то не то:
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.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 11 июля 2024, 16:10
Да, потому что если добавить CurrentRegion, то считать начинает не в 15 столбце, а в 5-м. Потому что между 10-м и 14-м столбцом идут пустые столбцы. А по Region может считать только смежные, неразрывные области. И при попытке написать 15, 16, 17 столбцы в Cell, считать начинает соответственно в 5,6,7 столбцах.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 11 июля 2024, 16:15
Если уменьшить код и оставить только проблемный фрагмент, то ошибка остаётся?

Код
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
[свернуть]
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 11 июля 2024, 16:25
Да. Просчёт дошёл до 53 000 строк, я остановил.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 11 июля 2024, 16:56
Этот код выдаст в 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
[свернуть]
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 12 июля 2024, 12:26
Не пойму никак .... С таким кодом, именно сам по себе это кусок

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 завершён неверно"
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 12 июля 2024, 12:36
Field:=8 - под 8 вы какой столбец подразумеваете (какая буква столбца)?
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 12 июля 2024, 12:40
H
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 12 июля 2024, 12:44
Эта команда создаёт фильтр в столбце H:
 Range("H2:H" & R).AutoFilter

Соответственно, фильтр будет находиться только в столбце H, а не со столбца A по H (или по другой столбец).
Параметр Field не связан со столбцами Excel, у AutoFilter своя нумерация столбцов.
Т.к. в фильтре только один столбец, а вы указываете столбец 8, то происходит ошибка, т.к. в фильтре нет столбца 8.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 12 июля 2024, 12:52
Спасибо !
Вот адреса:
$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
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 12 июля 2024, 13:01
На первый взгляд что-то не то. Фильтр вы ставите со строки 2, а в результат попадает и строка 1.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 12 июля 2024, 13:05
Не знаю. В файле нет пустых строк вначале. Первая строка идёт уже заполненная.
Та строка, куда ставится фильтр, не учитывается им: надо будет вставлять пустую строку, наверное, чтобы считал с первой.
Но пока суть в том, что цикл идёт не по последнюю заполненную отфильтрованную строку, а до конца Excel
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 12 июля 2024, 13:14
Почему вы фильтр применяете со строки 2? В фильтр включается и шапка таблицы.
У вас шапка начинается с какой строки? С 1 или со 2?
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 12 июля 2024, 13:17
Шапки нет. Строки со значением идут с первой строки. Я вставлял пустую строку в коде раньше, поэтому фильтр начинал со 2 строки.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 12 июля 2024, 13:20
В фильтр нужно включать и шапку. Если вы указываете строку 2, то строка 2 не участвует в фильтре.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 12 июля 2024, 14:00
Да, уже понял. А что с просчётом ?
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 12 июля 2024, 14:04
Сделайте человеческий код. Вторая строка ведь тоже должна участвовать в расчётах?
Сделайте так, чтобы фильтр создавался со строки 1.
Иначе сейчас вообще не понятно, что у вас там происходит.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 12 июля 2024, 16:59
Не пойму ....
Вот ставлю поле фильтра = 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
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 12 июля 2024, 17:07
Если фильтр применён не к одному столбцу (в данном случае к F), а к нескольким: от A до F и т.д. (стрелочки в Экселе находятся не в одном столбце, а в нескольких), то.
В коде вы указываете столбец F, но это игнорируется фильтром, а фильтр рассматривает всю область, где есть фильтр. Соответственно Field будет относительно всего диапазона, к которому применён фильтр.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 15 июля 2024, 09:34
Исправил код.
Всё осталось так же: формулу ставит в строки до конца 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
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 15 июля 2024, 09:44
Нужно обращаться к диапазону фильтра, чтобы внутри этого диапазона работать с видимыми строками.
Т.е. сделайте так, как вы раньше работали с видимыми строками фильтра (вы на форуме задавали вопрос, в котором тоже была работа с видимыми строками фильтра). Только нужно учитывать, что 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
[свернуть]
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 15 июля 2024, 09:59
Дописал в ответ пояснения и в код внёс изменения.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 15 июля 2024, 14:00
Спасибо, заработало ! Вы хорошо объясняете.
"но включит строку, которая находятся под таблицей. В этом случае нужно ещё внести изменения в код, который обращается к телу фильтра."
Вот к телу:
Range("H1:H" & R).AutoFilter Field:=1, Criteria1:="=*C*", Operator:=xlFilterValues
А какие изменения ?
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 15 июля 2024, 14:05
Вот так можно исключить строку, которая находится под таблицей.

Код:
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
[свернуть]
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 15 июля 2024, 15:28
Извините. Но одну строчку после последней видимой формула всё равно посчитала:

Set cRange = ActiveSheet.AutoFilter.Range.Offset(1).Resize(ActiveSheet.AutoFilter.Range.Rows.Count - 1).Columns(1).SpecialCells(xlCellTypeVisible).EntireRow
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 15 июля 2024, 15:35
Не знаю, почему.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 15 июля 2024, 15:36
Какой адрес даёт этот код, совпадает с адресом вашей таблицы?

Sub Macro()
    Debug.Print ActiveSheet.AutoFilter.Range.Offset(1).Resize(ActiveSheet.AutoFilter.Range.Rows.Count - 1).Address
End Sub
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 15 июля 2024, 16:13
$H$2:$H$4861
Это область столбца даёт.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 15 июля 2024, 16:17
Тело таблицы находится в строках 2 - 4861?
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 15 июля 2024, 16:18
Да.  А на 4862 стоит 0.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 15 июля 2024, 16:20
Если Debug.Print показал правильные номера строк, значит код работает с телом таблицы и не выходит ниже таблицы.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 15 июля 2024, 16:32
И 0 появляется после прохождение цикла с формулой. Значит формула каким-то образом захватывает эту строку.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 15 июля 2024, 16:37
Строка 4862 не пустая, поэтому она тоже входит в диапазон фильтра.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 15 июля 2024, 16:46
Так тело же находится в строках 2 - 4861. Как тогда 4862 не пустая ?
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 15 июля 2024, 16:49
Вы пишите, что в строке 4862 находится ноль.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 15 июля 2024, 16:55
Да. Как результат просчёта формулы по соседнему столбцу. Но в соседнем столбце в этой строке, как и в других строках, нет ничего. То есть таблица заканчивается последней заполненной данными строкой с номером 4861.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 15 июля 2024, 16:58
Если нажать Ctrl + End, в какую строку переходит курсор? Если дальше, чем нужно, то удалите все строки, которые находятся под таблицей. Возможно в этих строках что-то есть, но это невидимо глазу.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 15 июля 2024, 17:08
До выполнения макроса = 5313, после выполнения = 5314.
А что там может быть, что невидимо ?
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 15 июля 2024, 17:21
Если до запуска макроса нажать Ctrl+End, в какую строку переходит курсор?
Если после макроса нажать Ctrl+End, в какую строку переходит курсор?
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 15 июля 2024, 17:29
Я и написал выше, что до запуска макроса переходит в строку под № 5313, после выполнения макроса, в строку под № 5314.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 15 июля 2024, 17:40
Вы только этот код используете? Или в начале есть ещё ваш код?

Код:
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
[свернуть]
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 15 июля 2024, 17:49
Чисто по Вашему коду после макроса Ctrl+End переводит курсор в строку № 5313.
С моим полным кодом — в строку под № 5314 (я добавляю сверху пустую строку в своём коде).
Только Ваш код показывает последнюю заполненную строку (просто её номер 5313 был до выполнения макроса. А видимый он по счёту 758), а мой код показывает после выполнения и нажатия Ctrl+End пустую строку с № 5314 (там же в коде строки удаляются).
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Администратор от 15 июля 2024, 17:51
Значит ваш код что-то делает не то.
Весь ваш код я не знаю.
Название: Вставка формулы по отфильтрованным ячейкам идёт до конца Excel
Отправлено: Посетитель от 16 июля 2024, 08:23
Спасибо ! Нашёл свою ошибку, я пропустил поставить в одном из фильтров по этой колонке Count - 1. Теперь всё работает !