Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Оптимазация кода VBA!!!! / 20 сообщений из 20, страница 1 из 1
17.12.2006, 17:53
    #34205839
Stanislaus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимазация кода VBA!!!!
Здраствуйте! у меня имеется около 400 строк в exel листе, есть код, который удаляет строки не отмеченные галочками (chekbox)! Все работает, но очень медленно (построчное удаление)!!!! Какие будут версии по увеличению быстродействия удаления???

код:
Dim i As Integer
Dim Flag As Boolean
Dim Cb As Object
Dim deleted As Integer
deleted = 0
For Each Cb In Me.OLEObjects
If (InStr(1, Cb.Name, "Check") > 0) Then
If (Len(Cb.Object.Caption) > 0 And Cb.Object.Value = False) Then
i = CInt(Cb.Object.Caption) - deleted
лист1.Rows(i).Delete
deleted = deleted + 1
Next j
Flag = True
While (лист1.Cells(i, 2) = "" And Flag = True)
If (i >= лист1.UsedRange.Rows.Count) Then Flag = False
лист.Rows(i).Delete
deleted = deleted + 1
Wend
End If
End If
Next
...
Рейтинг: 0 / 0
18.12.2006, 11:14
    #34206681
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимазация кода VBA!!!!
1. В начале Application.ScreenUpdating=False, в конце - True
2. Что за не-пришей-рукав Next j?
...
Рейтинг: 0 / 0
18.12.2006, 11:21
    #34206705
Настенька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимазация кода VBA!!!!
авторЧто за не-пришей-рукав Next j? ржупацстулом. 5 баллов.

вообще для начала надо отформатировать код, а то нифига не понятно. сделала это за автора.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Dim i As Integer
Dim Flag As Boolean
Dim Cb As Object
Dim deleted As Integer
deleted =  0 
For Each Cb In Me.OLEObjects
If (InStr( 1 , Cb.Name, "Check") >  0 ) Then
If (Len(Cb.Object.Caption) >  0  And Cb.Object.Value = False) Then
i = CInt(Cb.Object.Caption) - deleted
лист1.Rows(i).Delete
deleted = deleted +  1 
Next j
Flag = True
While (лист1.Cells(i,  2 ) = "" And Flag = True)
If (i >= лист1.UsedRange.Rows.Count) Then Flag = False
лист.Rows(i).Delete
deleted = deleted +  1 
Wend
End If
End If
Next
...
Рейтинг: 0 / 0
18.12.2006, 18:41
    #34208560
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимазация кода VBA!!!!
Настенька
вообще для начала надо отформатировать код, а то нифига не понятно. сделала это за автора.
Настенька, ЭТО не форматирование, это всего-лишь обертывание чужого кода тэгами src-/src, не надо это делать. Бессмысленно, а место на экране занимает.
...
Рейтинг: 0 / 0
18.12.2006, 19:08
    #34208635
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимазация кода VBA!!!!
White Owl,

Ясно же, что Настенька просто ошиблась. Что тут такого? Ну давай еще опечатки коллекционировать. А по делу? Я что-то не понял, там на каждой строке стоят чек боксы, а автор желает их удалять вместе сo строками, если боксы чекнуты? Там на самом деле ЧЕТЫРЕСТА чек боксов что-ли?

VladConn
...
Рейтинг: 0 / 0
18.12.2006, 19:37
    #34208695
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимазация кода VBA!!!!
VladConnWhite Owl,
Ясно же, что Настенька просто ошиблась. Что тут такого?"Просто ошибиться" можно один раз. Повторять одну и ту же ошибку несколько раз - это уже тенденция.

VladConnА по делу? Я что-то не понял, там на каждой строке стоят чек боксы, а автор желает их удалять вместе сo строками, если боксы чекнуты? Там на самом деле ЧЕТЫРЕСТА чек боксов что-ли?Угу, именно это он и делает. А если еще учесть что там в оригинальном макросе был какой-то еще блок (от которого остался загадочный Next j), то ничего удивительного что макрос тормозит.
Stanislaus, убери чекбоксы, помечай строки на удаление цветом, или текстом в специальной ячейке. Чекбоксы в каждой строке это очень плохо.
...
Рейтинг: 0 / 0
18.12.2006, 19:44
    #34208710
Stanislaus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимазация кода VBA!!!!
Antonariy1. В начале Application.ScreenUpdating=False, в конце - True
2. Что за не-пришей-рукав Next j?

да это описка! cсам не пойму откуда там это взялось у меня в исходнике нет этого
...
Рейтинг: 0 / 0
18.12.2006, 19:49
    #34208729
Stanislaus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимазация кода VBA!!!!
VladConnWhite Owl,

Ясно же, что Настенька просто ошиблась. Что тут такого? Ну давай еще опечатки коллекционировать. А по делу? Я что-то не понял, там на каждой строке стоят чек боксы, а автор желает их удалять вместе сo строками, если боксы чекнуты? Там на самом деле ЧЕТЫРЕСТА чек боксов что-ли?

VladConn

да именно на каждой строке чекбоксы, пользователь отмечает чекбоксы, тем самым отмечая строки для удаления! после нажатия клавиши на форме, все это обрабатывается, лишние строки удаляются, остальные сохраняются в файл! потом все объекты с формы тоже удаляются! там околок 120 чекбоксов, просто под каждым еще 4 строки.
...
Рейтинг: 0 / 0
18.12.2006, 19:54
    #34208735
Stanislaus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимазация кода VBA!!!!
VladConn
...Stanislaus, убери чекбоксы, помечай строки на удаление цветом, или текстом в специальной ячейке. Чекбоксы в каждой строке это очень плохо.

А здесь уже воля заказчика! Ничего не поделаешь! Да и что в них плохого??? Они не тормозят удаление!
вся проблема в переиндексировании строк при удалении!!!!
может удалять не rows(i).delete, а скажем range("").delete, будет быстрее?
...
Рейтинг: 0 / 0
18.12.2006, 20:28
    #34208788
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимазация кода VBA!!!!
StanislausА здесь уже воля заказчика! Ничего не поделаешь! Да и что в них плохого??? Они не тормозят удаление! Они очень тормозят удаление. И во вторых, заказчик сам никогда не знает чего хочет и не знает как работает компьютер. Поэтому никогда нельзя идти у него на поводу.

Stanislausвся проблема в переиндексировании строк при удалении!!!! Не в переиндексировании строк, а в пересчитывании координат объектов.
Stanislausможет удалять не rows(i).delete, а скажем range("").delete, будет быстрее?Это будет медленнее. Не намного, практически не заметно для глаза, но медленнее.
Убирай чекбоксы вообще. Хочешь помечать строки на удаление мышкой? Элементарно, выдели в своей таблице колонку и сделай макрос типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Column =  1  Then
        If Target.Cells( 1 ,  1 ).Value = ChrW( 8730 ) Then
            Target.Cells( 1 ,  1 ).Clear
        Else
            Target.Cells( 1 ,  1 ).Value = ChrW( 8730 )
        End If
        Cancel = True
    Else
        Cancel = False
    End If
End Sub
Теперь двойной клик в любой ячейке первой колонки будет рисовать там галочку. Подправь номер колонки по своему усмотрению и все.
...
Рейтинг: 0 / 0
18.12.2006, 22:57
    #34209004
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимазация кода VBA!!!!
OK, тенденция так тенденция. Мне все равно. А насчет переиндексации строк - можно ведь удалять снизу вверх, без переиндексации.
...
Рейтинг: 0 / 0
19.12.2006, 07:58
    #34209250
Настенька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимазация кода VBA!!!!
Ну вас на фиг. хочется сделать как лучше, чтобы видно было нормально. без тегов ничего толком не видно, всё сливается. а вы все злые.
...
Рейтинг: 0 / 0
19.12.2006, 08:27
    #34209271
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимазация кода VBA!!!!
НастенькаНу вас на фиг. хочется сделать как лучше, чтобы видно было нормально. без тегов ничего толком не видно, всё сливается. а вы все злые.
вот пример форматирования, а не просто обводка тегом
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Dim i As Integer
Dim Flag As Boolean
Dim Cb As Object
Dim deleted As Integer
deleted =  0 
For Each Cb In Me.OLEObjects
     If (InStr( 1 , Cb.Name, "Check") >  0 ) Then
          If (Len(Cb.Object.Caption) >  0  And Cb.Object.Value = False) Then
                  i = CInt(Cb.Object.Caption) - deleted
                  лист1.Rows(i).Delete
                  deleted = deleted +  1 
                  Flag = True
                  While (лист1.Cells(i,  2 ) = "" And Flag = True)
                        If (i >= лист1.UsedRange.Rows.Count) Then Flag = False
                        лист.Rows(i).Delete
                        deleted = deleted +  1 
                  Wend
          End If
     End If
Next
...
Рейтинг: 0 / 0
19.12.2006, 08:41
    #34209283
Настенька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимазация кода VBA!!!!
вот единственный нормальный человек объяснил, остальные все только кричат.
лучше молчать.
...
Рейтинг: 0 / 0
19.12.2006, 19:09
    #34211429
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимазация кода VBA!!!!
VladConnА насчет переиндексации строк - можно ведь удалять снизу вверх, без переиндексации.Да нету там переиндексации строк. Там есть пересчет ВСЕХ координат OLE-объектов. Эксель для каждого объекта на листе будет спрашивать какие у него координаты, решать надо ли их обновлять, потом (возможно) обновлять. Но так как любое обращение к OLE объекту по довольно медлительное, то при большом их количестве начинаются видимые тормоза.
...
Рейтинг: 0 / 0
19.12.2006, 19:16
    #34211438
Stanislaus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимазация кода VBA!!!!
White Owl Убирай чекбоксы вообще.

ТЫ был прав на счет чекбоков (они тормозят)! я взял во внимание твой совет про их удаление и в сочетании со своей реализацией сделал следущее: там гда чекб. отмечены галочками я пометил эти строчки цветом, потом удалил все чекбоксы, и затем уже удалял строки исходя из помеченных! Работает на много быстрее!!!
...
Рейтинг: 0 / 0
19.12.2006, 20:13
    #34211529
Stanislaus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимазация кода VBA!!!!
Спасибо всем кто принял участие в обсуждении!!! Особенно Настеньке!!!!)
...
Рейтинг: 0 / 0
20.12.2006, 18:33
    #34214306
Stanislaus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимазация кода VBA!!!!
Да кстати ускорение получилось где то в 8 - 9 раз!
...
Рейтинг: 0 / 0
21.12.2006, 00:45
    #34214746
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимазация кода VBA!!!!
StanislausДа кстати ускорение получилось где то в 8 - 9 раз!

У тебя ведь какая-то табличка на листе?

Тогда можно ведь можно просто сделать:

DELETE FROM [Sheet1$] WHERE F1 = ...
...
Рейтинг: 0 / 0
22.12.2006, 20:13
    #34220008
RUSYA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимазация кода VBA!!!!
1) Если возможно, перейти на массив CheckBox'ов, тогда к ним можно бдует обращаться по индексу в цикле, это будет гораздо быстрее

2) Перебор и удаление организовать одинц циклом

3) Integer медление чем Long
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Оптимазация кода VBA!!!! / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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