Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / глупая ошибка в коде, не могу найти / 14 сообщений из 14, страница 1 из 1
29.03.2010, 08:52
    #36547435
Nomad87
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
глупая ошибка в коде, не могу найти
Доброго времени суток, никак не могу найти ошибку, программка вылетает после нескольких итерраций..

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Sub sravn()
Dim a, b, c As String
Dim i, Count As Long
i =  1 
a = ActiveWorkbook.Worksheets("Лист1").Range("A1")
MsgBox (a)
Do While (i) <>  87000 
If ActiveWorkbook.Worksheets("Лист1").Range("A" & i) = "5-Закрыто" Then
ActiveWorkbook.Worksheets("Лист1").Rows(i).Select
    Selection.Delete Shift:=xlUp
    End If
i = i +  1 
Loop
End Sub
...
Рейтинг: 0 / 0
29.03.2010, 09:39
    #36547478
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
глупая ошибка в коде, не могу найти
Код: plaintext
1.
ActiveWorkbook.Worksheets("Лист1").Rows(i).Select
    Selection.Delete Shift:=xlUp

Это вам зачем?

Код: plaintext
ActiveWorkbook.Worksheets("Лист1").Rows(i).Delete Shift:=xlUp
...
Рейтинг: 0 / 0
29.03.2010, 09:52
    #36547493
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
глупая ошибка в коде, не могу найти
Кстати, у вас логическая ошибка, имхо
Допустим, вы удалили строку 5.
Бывшая 6-я стала 5-й.
Но ее вы уже не проверяете, так как i=i+1

То есть у вас не будут проверены все строки, следующие за удаленными.
...
Рейтинг: 0 / 0
29.03.2010, 10:03
    #36547511
_AlexeyK_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
глупая ошибка в коде, не могу найти
Ещё желательно перебирать с конца к началу, или i=i+1 делать по else. Иначе пропуски будут.
...
Рейтинг: 0 / 0
29.03.2010, 10:15
    #36547547
Nomad87
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
глупая ошибка в коде, не могу найти
спасибо огромное я все учел и все получилось :)
...
Рейтинг: 0 / 0
29.03.2010, 10:38
    #36547591
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
глупая ошибка в коде, не могу найти
Nomad87, вот так побыстрее будет (удаление строк происходит один раз)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Dim r As Range, i As Long
i =  1 
With ActiveWorkbook.Worksheets("Лист1")
    Do While (i) <  87000 
        If .Cells(i,  1 ) = "5-Закрыто" Then
            If Not r Is Nothing Then
                Set r = Union(r, .Rows(i))
            Else
                Set r = .Rows(i)
            End If
        End If
        i = i +  1 
    Loop
End With
r.Select
r.Delete Shift:=xlUp
И ещё замечание:
Код: plaintext
1.
2.
Dim a, b, c As String
Dim i, Count As Long
Здесь у Вас переменные а, в, i имеют тип Variant
Правильно:
Код: plaintext
1.
2.
Dim a As String,  As Stringb, c As String
Dim i As Long, Count As Long
...
Рейтинг: 0 / 0
29.03.2010, 10:42
    #36547603
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
глупая ошибка в коде, не могу найти
Выделение r.Select - для проверки удаляемого диапазона. Удалите эту строку.
...
Рейтинг: 0 / 0
29.03.2010, 11:35
    #36547750
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
глупая ошибка в коде, не могу найти
vlth
Set r = Union(r, .Rows(i))


Тут где-то с месяца два назад была тема (не смог найти), где были похожие приемчики. Так вот при больших объемах объединяемых данных (кажется пришли к мнению, когда строка, описывающая объединенные ячейки превышает 255 символов), начинаются проблемы.... Так что тут проверить надо, будет ли это корректно работать.
...
Рейтинг: 0 / 0
29.03.2010, 11:41
    #36547761
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
глупая ошибка в коде, не могу найти
> Автор: Shocker.Pro
> Тут где-то с месяца два назад была тема (не смог найти), где были похожие приемчики. Так вот при больших объемах
> объединяемых данных (кажется пришли к мнению, когда строка, описывающая объединенные ячейки превышает 255 символов),
> начинаются проблемы.... Так что тут проверить надо, будет ли это корректно работать.

Было такое

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
29.03.2010, 13:17
    #36547994
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
глупая ошибка в коде, не могу найти
Shocker.ProТут где-то с месяца два назад была тема (не смог найти), где были похожие приемчики. Так вот при больших объемах объединяемых данных (кажется пришли к мнению, когда строка, описывающая объединенные ячейки превышает 255 символов), начинаются проблемы.... Так что тут проверить надо, будет ли это корректно работать.
Проверил. На 65536 строк получилось 7709 удаляемых. Всё сработало, но оч. долго (больше 20 мин. - точно) процесс шёл. Потому как цикл. Да ещё и с проверкой условия (Do While i < 65537).
Подобные вещи надо делать по-другому:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim r As Range
With ActiveWorkbook.Worksheets("Лист1")
    With .Columns( 1 )
        .AutoFilter Field:= 1 , Criteria1:="=5-Закрыто", Operator:=xlAnd
        Set r = .SpecialCells(xlVisible).EntireRow.Rows
    End With
    .AutoFilterMode = False
End With
r.Select
'r.Delete Shift:=xlUp
...
Рейтинг: 0 / 0
29.03.2010, 13:26
    #36548016
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
глупая ошибка в коде, не могу найти
Nomad87,добавлю, что если из удаляемых строк нужно исключить первую, можно поступить так:
Код: plaintext
1.
Set r = .SpecialCells(xlVisible).EntireRow.Rows
Set r = Intersect(Rows( 2  & ":" & .Rows.Count), r)
...
Рейтинг: 0 / 0
29.03.2010, 18:18
    #36548884
zchvv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
глупая ошибка в коде, не могу найти
Нужно собрать все строки к удалению в один диапазон (например, deldpz), и потом одним махом удалить этот диапазон:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Do While (i) <>  87000 
If ActiveWorkbook.Worksheets("Лист1").Range("A" & i) = "5-Закрыто" Then
set c=ActiveWorkbook.Worksheets("Лист1").rows(i)
set u=iif(deldpz is nothing,c,Application.Union(deldpz,c))
End If
Loop
If not deldpz=nothing theh
deldpz.delete
end if

И никаких проблем.
...
Рейтинг: 0 / 0
29.03.2010, 18:21
    #36548889
zchvv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
глупая ошибка в коде, не могу найти
Ошибка:
set deldpz=
вместо set u=
...
Рейтинг: 0 / 0
29.03.2010, 18:25
    #36548900
zchvv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
глупая ошибка в коде, не могу найти
И еще одна:
if not deldpz is nothing then... :)
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / глупая ошибка в коде, не могу найти / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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