Помогите разобрать пример

Программирование на Visual Basic for Applications
morehod
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 17.06.2008 (Вт) 17:31

Помогите разобрать пример

Сообщение morehod » 17.06.2008 (Вт) 17:36

Добрый день.
Пытаюсь освоить азы программирования и написать макрос в VBA, который в листе Excel последовательно построчно проверяет содержимое ячеек с первого по третий и с шестого по седьмой столбцы и в случае нахождения идентичных строк (кроме 4 и 5 столбцов), копирует значение ячейки пятого столбца нижней (одинаковой) строки в верхнюю ячейку пятого столбца (одинаковой строки), и далее удаляет нижнюю (одинаковую строку).


2 1 3 7 8 4 8
4 5 7 10 7 4 7
4 6 7 10 7 4 1
9 1 5 6 8 2 9
9 1 5 8 9 2 9
1 4 6 8 0 3 6
3 2 7 9 5 4 1

Так в примере, по условию одинаковы строки 4 и 5.
Необходимо 9 (из 5 строки , пятого столбца) записать вместо 8
(4 строки пятого столбца), а затем удалить 5 строку.
Понимаю, что для вас это тривиальная задача, но мне она пока не по-зубам. Буду чертовски признателен если подробно растолкуете как это можно сделать наиболее оптимально.

Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Сообщение Wasup! » 23.06.2008 (Пн) 8:29

ИМХО, можно так

Код: Выделить всё
Sub tst()

Dim i   As Integer
Dim w   As Worksheet

Set w = ThisWorkbook.ActiveSheet

For i = 1 To 7
    If w.Cells(i, 1) = w.Cells(i + 1, 1) _
    And w.Cells(i, 2) = w.Cells(i + 1, 2) _
    And w.Cells(i, 3) = w.Cells(i + 1, 3) _
    And w.Cells(i, 6) = w.Cells(i + 1, 6) _
    And w.Cells(i, 7) = w.Cells(i + 1, 7) _
    Then
        w.Cells(i, 5) = w.Cells(i + 1, 5)
        w.Rows(i + 1).Delete
    End If
Next

End Sub


А что должно происходить, если несколько одинаковых строк идут подряд?

morehod
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 17.06.2008 (Вт) 17:31

Сообщение morehod » 23.06.2008 (Пн) 13:42

Всё гениальное просто! А я нагородил 14 переменных (по 7 на каждую строку). А если идёт несколько строк подряд то все строки между первой и одинаковой последней удаляются и далее по условию идёт копирование значения из пятого столбца. Собственно говоря построчная обработка сравнения двух ближайших строк и так к этому приводит. Т.к. я пока только начал изучать VBA, и знаю не все команды, то буду рад и комментариям. К стати, удаление строки я задавал ActiveCell.Offset(1, 0).EntireRow.Delete, и оно происходило наиболее медленно на фоне общего выполнения программы, это нормальное явление?

Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Сообщение Wasup! » 25.06.2008 (Ср) 8:23

В принце да, можно попробовать так:

Код: Выделить всё
application.ScreenUpdating=False
'...твой код...
application.ScreenUpdating=true


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 68

    TopList