У меня есть рабочий лист со страницами 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


Используйте 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
большое спасибо, я проверил вашу правку, она как-то лучше, но, к сожалению, все еще очень медленная
Тысячи вопросов и ответов по этому поводу здесь, на 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», даже я добавил формулы обратно, но они исчезают, как только я запускаю код...
Извините, я совсем забыл о формулах. Я изменил код, теперь данные столбца B и E записываются в 2 отдельных массива (помните, что даже если они содержат только один столбец данных, это 2-мерные массивы). Когда вы изменяете только данные столбца E, обратно записывается только массив столбца E.
огромное вам спасибо, я очень ценю вашу помощь - она работает отлично и быстрее, но есть одна простая проблема.. после запуска макроса появляется сообщение об ошибке 400 - можете ли вы это исправить, пожалуйста, и, пожалуйста, чтобы сохранить книгу после бегать?
большое вам спасибо, новый код редактирования очень быстрый и работает отлично, просто попробуйте исправить эту ошибку 400 .. если это может помочь, у меня нет формул в «B», но формулы начинаются с «C». также я попытался изменить параметр vba на (Break on all error) и запустить код, в котором была выделена последняя строка кода. Range("E1:E" & rowCount).Formula = EData
Извините, но я не могу исправить эту ошибку. Сам код работает без ошибок, только что проверил еще раз. Если погуглить: ошибка 400 довольно печально известна, и трудно найти ей причину. Возможно, попробуйте создать тестовую книгу с нуля, скопировать данные из текущего листа и запустить на нем код. Честно говоря, я понятия не имею, чем я могу вам помочь.
не могли бы вы отредактировать мой код, потому что я не эксперт в Vba