Страницы: 1
RSS
Как встроить статус бар в 2 макроса
 
Добрый день! Подскажите, пожалуйста, как встроить статус бар в 2 готовых макроса, первый удаляет дубликаты в определенном столбце, а второй удаляет ненужную информацию по маске. Заранее спасибо за Ваше решение. Вот эти макросы:
Код
Sub DeleteDuble()
    Dim Sh As Worksheet, URL As String, FilterMode As Boolean, rng As Range, rg As Range

    Set C_Dubl = CreateObject("scripting.dictionary")
    C_Dubl.CompareMode = 1
    Set Sh = ThisWorkbook.Worksheets("Яндекс")
    FilterMode = Sh.AutoFilter.FilterMode
    If FilterMode Then
        Sh.ShowAllData
    End If
    LastRow = Sh.Cells(Sh.Rows.Count, "C").End(xlUp).Row
    dx = Sh.Range("B1:C" & LastRow)
    Set rng = Sh.Range("A1:D" & LastRow)
    For n = 5 To UBound(dx)
        URL = dx(n, 2)
        If URL <> "" Then
            If Not C_Dubl.Exists(URL) Then
                C_Dubl.Item(URL) = URL
            Else
                If rg Is Nothing Then
                    Set rg = rng.Rows(n)
                Else
                    Set rg = Union(rg, rng.Rows(n))

                End If

            End If
        End If

    Next
    If Not rg Is Nothing Then
        rg.Delete
        LastRow = Sh.Cells(Sh.Rows.Count, "C").End(xlUp).Row
        Sh.Range("A5") = 1
        Sh.Range("A6") = 2
        Sh.Range("A5:A6").AutoFill Destination:=Sh.Range("A5").Resize(LastRow - 5, 1), Type:=xlFillDefault


    End If


End Sub
Код
Sub DeleteMask()
    Dim Sh As Worksheet, URL As String, FilterMode As Boolean, Sh1 As Worksheet, rng As Range, _
        rg As Range, s As String
    Set Sh = ThisWorkbook.Worksheets("слова исключения")
    LastRow = Sh.Cells(Sh.Rows.Count, "A").End(xlUp).Row
    dd = Sh.Range("A1:B" & LastRow)
    Set Sh1 = ThisWorkbook.Worksheets("исключения")
    LastRow1 = Sh1.Cells(Sh1.Rows.Count, "A").End(xlUp).Row
    Set Sh = ThisWorkbook.Worksheets("Яндекс")
    FilterMode = Sh.AutoFilter.FilterMode
    If FilterMode Then
        Sh.ShowAllData
    End If
    LastRow = Sh.Cells(Sh.Rows.Count, "C").End(xlUp).Row
    dx = Sh.Range("B1:C" & LastRow)
    Set rng = Sh.Range("A1:D" & LastRow)
    For n = 5 To UBound(dx)
        URL = dx(n, 2)
        If URL <> "" Then
            For i = 3 To UBound(dd)
                s = dd(i, 1)
                If s <> "" Then
                    If InStr(1, URL, s, vbTextCompare) > 0 Then
                        LastRow1 = LastRow1 + 1
                         Sh1.Cells(LastRow1, 1) = URL
                        If rg Is Nothing Then
                            Set rg = rng.Rows(n)
                        Else
                            Set rg = Union(rg, rng.Rows(n))
                        End If
                   Exit For
                    End If

                End If

            Next


        End If

    Next
    If Not rg Is Nothing Then
        rg.Delete
        LastRow = Sh.Cells(Sh.Rows.Count, "C").End(xlUp).Row
        Sh.Range("A5") = 1
        Sh.Range("A6") = 2
        Sh.Range("A5:A6").AutoFill Destination:=Sh.Range("A5").Resize(LastRow - 5, 1), Type:=xlFillDefault


    End If
End Sub
 
Евгений И.,  А может не анимация нужна, а оптимизация? Лично мне видится для первого макроса использование расширенного фильтра и удалений строк отфильтрованных.
P.S.
Код
dx = Sh.Range("B1:C" & LastRow)
- зачем пихать в массив из двух столбцов если  обрабатывается только второй?
Изменено: БМВ - 04.04.2020 17:34:43
По вопросам из тем форума, личку не читаю.
 
Пусть без оптимизации, нужен именно статус бар, чтобы видеть, сколько времени он еще будет удалять дубликаты и удалять по маске...Можно самый простейший вариант...
 
А что все так плохо что требуется статус бар?
"Все гениальное просто, а все простое гениально!!!"
 
Евгений И., Ну лично я не сторонник греть планету процессором, а с учетом того, что при определенном объеме данных  или сбойнет
Код
Set rg = Union(rg, rng.Rows(n))
дойдя до предела , а он есть. или
Код
rg.Delete
будет длится долго  и в это время ничего не показать в статус баре.
ну в в целом показывать
Код
For n = 5 To UBound(dx)
Application.stаtusbar = n-4 & " from " & UBound(dx) - 4
' сode here
next
Application.stаtusbar = false


Да здравствует глобальное потепление!
По вопросам из тем форума, личку не читаю.
 
Спасибо за варианты решения...Я просто не программист, а пользователь (но стремлюсь знать больше...), поэтому мне сложно ответить на вопрос о том или ином решении. Скорее всего Вы правы, что тут нужен не статус бар, а оптимизация самого макроса в целом. В обработке у меня будет до 700 000 строк, в которых нужно будет удалить дубликаты...с помощью данного макроса я подождал минут 20 при обработке 120 000 строк и естественно до конца ничего не дошло... скорее всего так долго дубликаты обрабатываться не должны, поэтому и хотел посмотреть с помощью статуса бар, сколько времени займет вся обработка...Как будет выглядеть макрос удаления дубликатов с учетом предложенных вариантов оптимизации самого макроса?
Изменено: Евгений И. - 04.04.2020 18:52:31
 
Здравствуйте, Евгений! Для того, чтобы Вам могли эффективно помочь, необходимо выложить пример файла на несколько десятков строк.
Из общих соображений: разработчик (Microsoft) уже написал для Вас макрос, который удаляет строки с повторяющимися полями. Вряд ли мы сможем написать более эффективный. :)  Ваши 700 000 строк для указанного метода - не проблема.
Изменено: sokol92 - 04.04.2020 19:09:59
Владимир
 
Цитата
Евгений И. написал:
700 000 строк
Ну если дубликаты удалить можно указанным Владимиром методом, то второй макрос нужно перестраивать.  Тут  нужно использовать метод ZVI. Помечать строки под удаление в отдельном столбце,  ссортировка, удалений . Также для скорости уход от словаря переход на коллекции может сильно ускорить. Допускаю, что самой тяжкой операцией для вас стала как раз Union(rg, rng.Rows(n)) что при большом заполнении становится не быстрой.
По вопросам из тем форума, личку не читаю.
 
Спасибо за Ваши ответы!!!))
Страницы: 1
Наверх