powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Макрос работает некорректно
17 сообщений из 17, страница 1 из 1
Макрос работает некорректно
    #37851055
Admiral67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуйста в чем может быть ошибка: написал код, который просматривает строчки снизу вверх, если в строчке колонка "Всего" с нулевым значением строка удаляется, макрос часть строк с нулями удаляет, часть пропускает. Никаких ошибок 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
...
Рейтинг: 0 / 0
Макрос работает некорректно
    #37851071
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит часть строк не с нулями, а, скажем с 0.00000001

сравнивай так:
Код: vbnet
1.
if Round(Cells(c, b).Value,0) = 0 Then



ЗЫ: А вообще, чрезвычайно странный макрос. Нет смысла делать цикл For Each Row, если этот Row потом нигде не используется. Можно использовать обычный цикл For To
...
Рейтинг: 0 / 0
Макрос работает некорректно
    #37851136
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При удалении строк цикл следует строить снизу вверх:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub Процедура()
Dim li as long, lb as long
Application.ScreenUpdating = False
lb = 6
For li = 1440 to 7
If Cells(li, lb).Value = 0 Then rows(li).Delete Shift:=xlUp
Next li
MsgBox "Обработка завершена"
Application.ScreenUpdating = True
End Sub



Еще можете прочитать эту статью - как раз по теме.
...
Рейтинг: 0 / 0
Макрос работает некорректно
    #37851140
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The_PristПри удалении строк цикл следует строить снизу вверх:
Сам же забыл именно снизу вверх сделать :-)
For li = 1440 to 7 Step -1
...
Рейтинг: 0 / 0
Макрос работает некорректно
    #37851146
Admiral67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
The_Prist,

Благодарю! Всё заработало.
...
Рейтинг: 0 / 0
Макрос работает некорректно
    #37851271
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The_Prist , хоть посоветовал и верно, но неправильно Ведь всё равно от пропуска одного из двух подряд идущих нулей не избавился... Просто цикл можно строить в любом направлении, главное - при использовании .Delete не изменять значение счетчика, чтобы еще раз проверить ту же ячейку (которая будет замещена).
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Sub Процедура()
Dim li as long, lb as long
Application.ScreenUpdating = False
lb = 6
li = 1440
Do While li <= lb
    If Cells(li, lb).Value = 0 Then
       rows(li).Delete Shift:=xlUp
    Else
        li = li - 1
    End If
End Do
MsgBox "Обработка завершена"
Application.ScreenUpdating = True
End Sub
...
Рейтинг: 0 / 0
Макрос работает некорректно
    #37851457
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
Sub Процедура()
    Dim li As Long, lb As Long
    Application.ScreenUpdating = False
    lb = 6
    li = 1440
    Do Until li <= lb
        If Cells(li, lb).Value = 0 Then Rows(li).Delete Shift:=xlUp
        li = li - 1
    Loop
    MsgBox "Обработка завершена"
    Application.ScreenUpdating = True
End Sub
...
Рейтинг: 0 / 0
Макрос работает некорректно
    #37851532
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The_Prist,

Каюсь, грешен... Но вы бы на время поста посмотрели.
НО! - грешен только в использовании End Do... и том, что использовал lb как ограничение

В остальном же - да, если цикл работает снизу-вверх, то счетчик надо менять всегда...
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Sub Процедура()
Dim li As Long, lb As Long
Application.ScreenUpdating = False
lb = 6
li = 1440
Do While li >= 7
    If Cells(li, lb).Value = 0 Then Rows(li).Delete Shift:=xlUp
    li = li - 1
Loop
MsgBox "&#206;&#225;&#240;&#224;&#225;&#238;&#242;&#234;&#224; &#231;&#224;&#226;&#229;&#240;&#248;&#229;&#237;&#224;"
Application.ScreenUpdating = True
End Sub

...
Рейтинг: 0 / 0
Макрос работает некорректно
    #37851703
кладовщик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если структура данных позволяет, то не будет ли концептуально правильней не удалять строчки с нулями, а выбирать с листа записи с ненулевыми значениями в поле? При помощи SQL.
Если это не учебная задача на использование циклов и объектной модели Эксель.
ЗЫ На этой неделе получил тестовое задание от потенциального работодателя - обработать эксельную выгрузку из DWH. Самое сложное (точнее, времязатратное) было привести таблицу типа
отрасль ID клиента Сентябрь 2008 Октябрь 2008 Ноябрь 2008 Декабрь 2008 ... Март 2011
к нормальной таблице вида
ID_Customer - ID
Branch - отрасль
Fee_Year - год
Fee_Month - месяц
Fee_Value - величина комиссии
После чего на решение каждого задания время уходило собс-но на конструирование запроса в Акцесс и КопиПэйст в Эксель результирующего набора данных.
-----
Не люблю Progress OpenEdge.
...
Рейтинг: 0 / 0
Макрос работает некорректно
    #37851942
kuklp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Sub www()
    With [f6:f1440]
        .AutoFilter 1, "=0"
        .Offset(1).SpecialCells(12).EntireRow.Delete
        .Parent.AutoFilterMode = 0
    End With
End Sub
...
Рейтинг: 0 / 0
Макрос работает некорректно
    #37852191
Admiral67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кладовщик,

Это не учебная база.
Выбирать строчки с ненулевыми позициями я и сам умею :) Это, так сказать, шаг 1
А надо, по производственной необходимости, удалит нулевые строки в 341 листе, в каждом листе 16000 строчек.
Вручную займет неделю. VBA сделает быстрей.
...
Рейтинг: 0 / 0
Макрос работает некорректно
    #37852371
кладовщик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Admiral67, месседж моего послания был в том, что если есть возможность выбирать строчки по условию при помощи SQL, то лучше делать так, а не ч-з
Код: vbnet
1.
If Cells(li, lb).Value = 0 Then rows(li).Delete Shift:=xlUp


Поделился инфо. Я помню, как использовал Delete Shift:=xlUp на старом компе - это было очень долго.
Но для случая "нулевые строки в 341 листе, в каждом листе 16000 строчек" вар-т с SQL, наверное, не подходит.
-----
Не люблю Progress OpenEdge.
...
Рейтинг: 0 / 0
Макрос работает некорректно
    #37852436
Admiral67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кладовщик,

вы правы - очень долго. Поэтому запустил этот код в режиме фона, а сначала запустил код, который проходит по всем листам, ищет строки с ненулевым значением и копирует в массив, а потом из массива копирую сверху вниз на главный лист.
Только вот вопрос- ряд листов содержит строки с включенным фильтром (при чем не всегда по колонке "всего"). Взял ли Excel такие строки в массив? (проверить сложно)
...
Рейтинг: 0 / 0
Макрос работает некорректно
    #37852552
ElenHim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Admiral67по производственной необходимости, удалит нулевые строки в 341 листе, в каждом листе 16000 строчек.

Ей-богу странная производственная необходимость, которая не велит сразу выбирать строки с ненулевыми позициями, тем более что вы умеете.

По сабжу, наличие автофильтра можете проверять в макросе, перед работой с листом.
По поводу долгого выполнения - попробуйте применить свойсвто диапазона .SpecialCells заместо массивов.
...
Рейтинг: 0 / 0
Макрос работает некорректно
    #37852749
kuklp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Admiral67,
Вы мой способ попробовали? На все листы понадобится в общей сложности 5-6 секунд(от скорости машины). Можно добавить отключение экрана(хотя проще не активировать листы) и возможно, сортировку.
...
Рейтинг: 0 / 0
Макрос работает некорректно
    #37858242
Денис Б.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы ни чего не удалять, нужно изначально не добавлять.
...
Рейтинг: 0 / 0
Макрос работает некорректно
    #37865067
Admiral67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kuklpAdmiral67,
Вы мой способ попробовали? На все листы понадобится в общей сложности 5-6 секунд(от скорости машины). Можно добавить отключение экрана(хотя проще не активировать листы) и возможно, сортировку.

Да, попробовал и ваш метод. На один лист вышло достаточно много времени - несколько десятков минут.
Но пробовал без отключения экрана.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Макрос работает некорректно
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]