powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / глупая ошибка в коде, не могу найти
14 сообщений из 14, страница 1 из 1
глупая ошибка в коде, не могу найти
    #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
глупая ошибка в коде, не могу найти
    #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
глупая ошибка в коде, не могу найти
    #36547493
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, у вас логическая ошибка, имхо
Допустим, вы удалили строку 5.
Бывшая 6-я стала 5-й.
Но ее вы уже не проверяете, так как i=i+1

То есть у вас не будут проверены все строки, следующие за удаленными.
...
Рейтинг: 0 / 0
глупая ошибка в коде, не могу найти
    #36547511
_AlexeyK_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ещё желательно перебирать с конца к началу, или i=i+1 делать по else. Иначе пропуски будут.
...
Рейтинг: 0 / 0
глупая ошибка в коде, не могу найти
    #36547547
Nomad87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо огромное я все учел и все получилось :)
...
Рейтинг: 0 / 0
глупая ошибка в коде, не могу найти
    #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
глупая ошибка в коде, не могу найти
    #36547603
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выделение r.Select - для проверки удаляемого диапазона. Удалите эту строку.
...
Рейтинг: 0 / 0
глупая ошибка в коде, не могу найти
    #36547750
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlth
Set r = Union(r, .Rows(i))


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

Было такое

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
глупая ошибка в коде, не могу найти
    #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
глупая ошибка в коде, не могу найти
    #36548016
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nomad87,добавлю, что если из удаляемых строк нужно исключить первую, можно поступить так:
Код: plaintext
1.
Set r = .SpecialCells(xlVisible).EntireRow.Rows
Set r = Intersect(Rows( 2  & ":" & .Rows.Count), r)
...
Рейтинг: 0 / 0
глупая ошибка в коде, не могу найти
    #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
глупая ошибка в коде, не могу найти
    #36548889
zchvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка:
set deldpz=
вместо set u=
...
Рейтинг: 0 / 0
глупая ошибка в коде, не могу найти
    #36548900
zchvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще одна:
if not deldpz is nothing then... :)
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / глупая ошибка в коде, не могу найти
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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