Макрос стал очень медленным после функции фильтра

У меня есть рабочий лист со страницами 30:31 для дней месяца, и у меня есть макрос для добавления символа @ в строку между двумя разными задержками, и он работал отлично, пока я не создал функцию ФИЛЬТР в первой строке каждой страницы, например этот ФИЛЬТР. (E:F,G:G=D1041,""), затем макрос стал очень медленным. Я не знаю, почему он вообще стал очень медленным, когда я вставляю любой текст на лист. возможно, он пытается проверить все страницы ниже моей текущей страницы, над которой я работаю - .... пожалуйста, помогите

Sub englishATarabic()
    Dim L, count As Long, B, E As Range
    For R = 1 To ActiveSheet.Cells(ActiveSheet.Rows.count, "E").End(xlUp).Row
        Set B = ActiveSheet.Range("B" & R)
        Set E = ActiveSheet.Range("E" & R)
        If E.Value <> "" And B.Value <> "" And IsNumeric(B.Value) Then
            If InStr(E.Text, "@") < 1 Then
                count = 0
                For L = 1 To Len(E.Text)
                    If AscW(Mid(E.Text, L, 1)) < 1000 Then count = count + 1 Else Exit For
                Next
                
                E.Value = Left(E.Value, count) & "@" & Right(E.Value, Len(E.Value) - count)
                                                                           
            End If
        End If
    Next
                     
        ThisWorkbook.Save
End Sub
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
0
79
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте Application.Calculation = xlCalculationManual в начале кода и Application.Calculation = xlCalculationAutomatic в конце.
Filter функция пересчитывается при изменении содержимого ячейки.

Sub englishATarabic()
    Dim L, count As Long, B, E As Range
    Application.Calculation = xlCalculationManual
    For R = 1 To ActiveSheet.Cells(ActiveSheet.Rows.count, "E").End(xlUp).Row
        Set B = ActiveSheet.Range("B" & R)
        Set E = ActiveSheet.Range("E" & R)
        If E.Value <> "" And B.Value <> "" And IsNumeric(B.Value) Then
            If InStr(E.Text, "@") < 1 Then
                count = 0
                For L = 1 To Len(E.Text)
                    If AscW(Mid(E.Text, L, 1)) < 1000 Then count = count + 1 Else Exit For
                Next
                
                E.Value = Left(E.Value, count) & "@" & Right(E.Value, Len(E.Value) - count)
                                                                           
            End If
        End If
    Next
                     
    ThisWorkbook.Save
    Application.Calculation = xlCalculationAutomatic
End Sub

не могли бы вы отредактировать мой код, потому что я не эксперт в Vba

Ramadan Moussa 27.05.2024 13:56

большое спасибо, я проверил вашу правку, она как-то лучше, но, к сожалению, все еще очень медленная

Ramadan Moussa 27.05.2024 14:11
Ответ принят как подходящий

Тысячи вопросов и ответов по этому поводу здесь, на SO: Что замедляет VBA, так это интерфейс с Excel. Гораздо быстрее прочитать все необходимые данные в памяти за один раз, обработать логику с данными в памяти и снова записать все за один раз.

Ваш код может выглядеть так:

Sub englishATarabic()
    With ActiveSheet
        Dim BData, EData
        Dim rowCount As Long
        rowCount = .Cells(.Rows.count, "E").End(xlUp).row
        BData = .Range("B1:B" & rowCount).Formula
        EData = .Range("E1:E" & rowCount).Formula
        
        Dim row As Long
        For row = 1 To UBound(BData)
            Dim eVal As Variant, bVal As Variant
            bVal = BData(row, 1)
            eVal = EData(row, 1)
                        
            If bVal <> "" And eVal <> "" And IsNumeric(bVal) Then
                Dim count As Long, l As Long
                If InStr(eVal, "@") < 1 Then
                    count = 0
                    For l = 1 To Len(eVal)
                        If AscW(Mid(eVal, l, 1)) < 1000 Then
                            count = count + 1
                        Else
                            Exit For
                        End If
                    Next
    
                    EData(row, 1) = Left(eVal, count) & "@" & Right(eVal, Len(eVal) - count)
                End If
            End If
        Next
        
        .Range("E1:E" & rowCount).Formula = EData
    End With
End Sub

большое спасибо, я был удивлен, что ваше редактирование прошло гладко, но, к сожалению, я не знаю, почему оно удаляет все формулы со всех листов в столбцах C и D, а также функцию ФИЛЬТР, которую я добавил в «E», даже я добавил формулы обратно, но они исчезают, как только я запускаю код...

Ramadan Moussa 27.05.2024 15:35

Извините, я совсем забыл о формулах. Я изменил код, теперь данные столбца B и E записываются в 2 отдельных массива (помните, что даже если они содержат только один столбец данных, это 2-мерные массивы). Когда вы изменяете только данные столбца E, обратно записывается только массив столбца E.

FunThomas 27.05.2024 16:56

огромное вам спасибо, я очень ценю вашу помощь - она ​​работает отлично и быстрее, но есть одна простая проблема.. после запуска макроса появляется сообщение об ошибке 400 - можете ли вы это исправить, пожалуйста, и, пожалуйста, чтобы сохранить книгу после бегать?

Ramadan Moussa 28.05.2024 07:55

большое вам спасибо, новый код редактирования очень быстрый и работает отлично, просто попробуйте исправить эту ошибку 400 .. если это может помочь, у меня нет формул в «B», но формулы начинаются с «C». также я попытался изменить параметр vba на (Break on all error) и запустить код, в котором была выделена последняя строка кода. Range("E1:E" & rowCount).Formula = EData

Ramadan Moussa 30.05.2024 11:28

Извините, но я не могу исправить эту ошибку. Сам код работает без ошибок, только что проверил еще раз. Если погуглить: ошибка 400 довольно печально известна, и трудно найти ей причину. Возможно, попробуйте создать тестовую книгу с нуля, скопировать данные из текущего листа и запустить на нем код. Честно говоря, я понятия не имею, чем я могу вам помочь.

FunThomas 30.05.2024 11:53

Другие вопросы по теме

Похожие вопросы

В Excel мне интересно, как использовать функцию ВПР в логике ИЛИ
Использование списка (диапазона) из нескольких критериев столбца и строки в формуле ФИЛЬТР
Вычисление СУММПРОИЗВ с использованием критериев нескольких столбцов и критериев одной строки (с пустыми столбцами и текстовыми столбцами в диапазоне данных)
Функция фильтра Доставляет пустые ячейки массива как нули, а другие пустые ячейки в ячейки, отформатированные по времени, как 12:00
Вычислить СУММПРОИЗВ с несколькими критериями столбца и одним критерием строки (с пустыми столбцами в диапазоне данных)
Диаграмма Excel: цветные метки данных по категориям — строки
Функция фильтра или альтернатива для вертикальных и горизонтальных критериев
Выделите ячейку в диапазоне, если значение ячейки совпадает со значением ячейки в столбце A
Вычисление СУММПРОИЗВ с несколькими критериями столбца и критериями одной строки
Извлечь текст после последнего разделителя, но исключить последний символ