Страницы: 1
RSS
Цикл при переборе пропускает часть элементов
 
Доброго всем дня!
Цикл по идее должен удалять колонки, с определенными заголовками. Но по факту всегда остается несколько, хотя они удовлетворяют условиям. Полностью все удаляется только при повторном запуске макроса. Конкретно в файле примера должны удаляться вообще все колонки, но этого не происходит
Код
For cl = 1 To .UsedRange.Columns.Count
      If .Cells(1, cl).Value Like "Скидка*" Then .Cells(1, cl).EntireColumn.Delete
      If .Cells(1, cl).Value Like "*999*" Then .Cells(1, cl).EntireColumn.Delete
Next
 
удаление нужно вести от последнего к первому и все получится
Код
 For cl = .UsedRange.Columns.Count to 1 step -1
По вопросам из тем форума, личку не читаю.
 
БМВ,Спасибо! Дело в смещении столбцов после удаления, да?
 
да, нужно понимать что удалив столбец Cl, столбцом № Cl становится следующий а счетчик цикла увеличивается и Вы его благополучно пропускаете, не проверив может и его нужно было удалять
чтобы не усложнять алгоритм проверок, проще удалять с конца  
Изменено: Ігор Гончаренко - 13.02.2019 13:49:35
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко,Спасибо!
 
IvanMantrov, Можно и с первого начиная, только алгоритм совершенно другой будет.
С помощью функции Union собрать диапазон удовлетворяющий условию в переменную типа Range, а уже после цикла удалить.
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Nordheim написал:
Можно и с первого начиная, только алгоритм совершенно другой будет
Можно и без Union,
Код
For cl = 1 To .UsedRange.Columns.Count
      If .Cells(1, cl).Value Like "Скидка*" or .Cells(1, cl).Value Like "*999*"  Then 
           .Cells(1, cl).EntireColumn.Delete 
           cl=cl-1
      end if
Next
 

хотя с ним будет шустрее, но он тоже не панацея и тут вспоминаем метод от ZVI с использованием признака сортировки , удаления, но это уже другая история.
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх