|
Макрос работает некорректно
|
|||
---|---|---|---|
#18+
Подскажите пожалуйста в чем может быть ошибка: написал код, который просматривает строчки снизу вверх, если в строчке колонка "Всего" с нулевым значением строка удаляется, макрос часть строк с нулями удаляет, часть пропускает. Никаких ошибок MS Excel не высвечивает. Доходит до половины и всё. Код: Sub Процедура() Dim c As Integer Application.ScreenUpdating = False c = 1440 b = 6 For Each Row In Range(Cells(c, b), Cells(7, b)) If Cells(c, b).Value = 0 Then Cells(c, 2).EntireRow.Delete Shift:=xlUp c = c - 1 Else c = c - 1 End If Next Row MsgBox "Обработка завершена" Application.ScreenUpdating = True End Sub ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2012, 20:52 |
|
Макрос работает некорректно
|
|||
---|---|---|---|
#18+
Значит часть строк не с нулями, а, скажем с 0.00000001 сравнивай так: Код: vbnet 1.
ЗЫ: А вообще, чрезвычайно странный макрос. Нет смысла делать цикл For Each Row, если этот Row потом нигде не используется. Можно использовать обычный цикл For To ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2012, 21:09 |
|
Макрос работает некорректно
|
|||
---|---|---|---|
#18+
При удалении строк цикл следует строить снизу вверх: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Еще можете прочитать эту статью - как раз по теме. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2012, 22:51 |
|
Макрос работает некорректно
|
|||
---|---|---|---|
#18+
The_PristПри удалении строк цикл следует строить снизу вверх: Сам же забыл именно снизу вверх сделать :-) For li = 1440 to 7 Step -1 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2012, 22:52 |
|
Макрос работает некорректно
|
|||
---|---|---|---|
#18+
The_Prist, Благодарю! Всё заработало. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2012, 23:04 |
|
Макрос работает некорректно
|
|||
---|---|---|---|
#18+
The_Prist , хоть посоветовал и верно, но неправильно Ведь всё равно от пропуска одного из двух подряд идущих нулей не избавился... Просто цикл можно строить в любом направлении, главное - при использовании .Delete не изменять значение счетчика, чтобы еще раз проверить ту же ячейку (которая будет замещена). Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2012, 04:21 |
|
Макрос работает некорректно
|
|||
---|---|---|---|
#18+
AndreTM The_Prist , хоть посоветовал и верно, но неправильно Ведь всё равно от пропуска одного из двух подряд идущих нулей не избавился... Просто цикл можно строить в любом направлении, главное - при использовании .Delete не изменять значение счетчика, чтобы еще раз проверить ту же ячейку (которая будет замещена).Пожалуй не соглашусь. Мой код удаляет ВСЕ строки с нулем. Проверьте сначала сами, прежде чем говорить о нерабочем коде. Согласен, что цикл может быть и сверху, но зачем это делать, если можно этого избежать и написать код короче, проще и понятней? Кстати, вот как раз Ваш код не будет работать, т.к. VBA не знает, что такое End Do...Правильнее было бы записать там Loop. И вообще, мне кажется как раз Ваш код вообще ничего не удалит, т.к. для созданного Вами условия необходимо делать Do Until, а не Do While Вот так я бы записал Ваш код и мне кажется так он бы удалял то, что ему положено. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2012, 15:03 |
|
Макрос работает некорректно
|
|||
---|---|---|---|
#18+
The_Prist, Каюсь, грешен... Но вы бы на время поста посмотрели. НО! - грешен только в использовании End Do... и том, что использовал lb как ограничение В остальном же - да, если цикл работает снизу-вверх, то счетчик надо менять всегда... Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2012, 16:31 |
|
Макрос работает некорректно
|
|||
---|---|---|---|
#18+
Если структура данных позволяет, то не будет ли концептуально правильней не удалять строчки с нулями, а выбирать с листа записи с ненулевыми значениями в поле? При помощи SQL. Если это не учебная задача на использование циклов и объектной модели Эксель. ЗЫ На этой неделе получил тестовое задание от потенциального работодателя - обработать эксельную выгрузку из DWH. Самое сложное (точнее, времязатратное) было привести таблицу типа отрасль ID клиента Сентябрь 2008 Октябрь 2008 Ноябрь 2008 Декабрь 2008 ... Март 2011 к нормальной таблице вида ID_Customer - ID Branch - отрасль Fee_Year - год Fee_Month - месяц Fee_Value - величина комиссии После чего на решение каждого задания время уходило собс-но на конструирование запроса в Акцесс и КопиПэйст в Эксель результирующего набора данных. ----- Не люблю Progress OpenEdge. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2012, 19:02 |
|
Макрос работает некорректно
|
|||
---|---|---|---|
#18+
Код: vbnet 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2012, 06:50 |
|
Макрос работает некорректно
|
|||
---|---|---|---|
#18+
кладовщик, Это не учебная база. Выбирать строчки с ненулевыми позициями я и сам умею :) Это, так сказать, шаг 1 А надо, по производственной необходимости, удалит нулевые строки в 341 листе, в каждом листе 16000 строчек. Вручную займет неделю. VBA сделает быстрей. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2012, 15:56 |
|
Макрос работает некорректно
|
|||
---|---|---|---|
#18+
Admiral67, месседж моего послания был в том, что если есть возможность выбирать строчки по условию при помощи SQL, то лучше делать так, а не ч-з Код: vbnet 1.
Поделился инфо. Я помню, как использовал Delete Shift:=xlUp на старом компе - это было очень долго. Но для случая "нулевые строки в 341 листе, в каждом листе 16000 строчек" вар-т с SQL, наверное, не подходит. ----- Не люблю Progress OpenEdge. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2012, 19:47 |
|
Макрос работает некорректно
|
|||
---|---|---|---|
#18+
кладовщик, вы правы - очень долго. Поэтому запустил этот код в режиме фона, а сначала запустил код, который проходит по всем листам, ищет строки с ненулевым значением и копирует в массив, а потом из массива копирую сверху вниз на главный лист. Только вот вопрос- ряд листов содержит строки с включенным фильтром (при чем не всегда по колонке "всего"). Взял ли Excel такие строки в массив? (проверить сложно) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2012, 20:56 |
|
Макрос работает некорректно
|
|||
---|---|---|---|
#18+
Admiral67по производственной необходимости, удалит нулевые строки в 341 листе, в каждом листе 16000 строчек. Ей-богу странная производственная необходимость, которая не велит сразу выбирать строки с ненулевыми позициями, тем более что вы умеете. По сабжу, наличие автофильтра можете проверять в макросе, перед работой с листом. По поводу долгого выполнения - попробуйте применить свойсвто диапазона .SpecialCells заместо массивов. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2012, 22:58 |
|
Макрос работает некорректно
|
|||
---|---|---|---|
#18+
Admiral67, Вы мой способ попробовали? На все листы понадобится в общей сложности 5-6 секунд(от скорости машины). Можно добавить отключение экрана(хотя проще не активировать листы) и возможно, сортировку. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2012, 09:16 |
|
Макрос работает некорректно
|
|||
---|---|---|---|
#18+
Чтобы ни чего не удалять, нужно изначально не добавлять. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2012, 09:23 |
|
Макрос работает некорректно
|
|||
---|---|---|---|
#18+
kuklpAdmiral67, Вы мой способ попробовали? На все листы понадобится в общей сложности 5-6 секунд(от скорости машины). Можно добавить отключение экрана(хотя проще не активировать листы) и возможно, сортировку. Да, попробовал и ваш метод. На один лист вышло достаточно много времени - несколько десятков минут. Но пробовал без отключения экрана. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2012, 19:10 |
|
|
start [/forum/topic.php?fid=61&fpage=98&tid=2175582]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 150ms |
0 / 0 |