У меня есть код, который смотрит на данные, вызывает данные, которые не каталогизированы, копирует данные на новый лист и удаляет строки с ошибками. Макрос работает EXTREMELY медленно, и мне нужно запустить его дважды, чтобы удалить строки с ошибками на новых листах. Любые предложения о том, как я могу его улучшить? Огромное спасибо!VBA - Ускорение кода?
Sub SynthData()
Dim rCell As Range
Dim lColor As Long
Dim rColored As Range
Dim c As Range
Dim rng As Range
Application.ScreenUpdating = False
lColor = RGB(255, 255, 0)
With Worksheets("Output").Columns("D")
Lastrow = .Find("*", After:=.Cells(1), _
LookIn:=xlValues, SearchDirection:=xlPrevious).Row
End With
'Finds last row
For Each c In Worksheets("Output").Range("E1:E" & Lastrow)
If c.Offset(0, 1) = "#N/A" Then
c.Interior.Color = lColor
Else: c.Interior.Color = xlNone
End If
Next c
'Highlights cells with adjacent errors
Set rColored = Nothing
For Each rCell In Worksheets("Output").Range("A1:G" & Lastrow)
If rCell.Interior.Color = lColor Then
If rColored Is Nothing Then
Set rColored = rCell
Else
Set rColored = Union(rColored, rCell)
End If
End If
Next
If rColored Is Nothing Then
Worksheets("Source").Range("A3:G2000").ClearContents
With Worksheets("Output").Columns("D")
Lastrow = .Find("*", After:=.Cells(1), _
LookIn:=xlValues, SearchDirection:=xlPrevious).Row
End With
'finds last row in data
Worksheets("Output").Range("A1:G" & Lastrow).Copy
Worksheets("Source").Range("A3").PasteSpecial xlPasteValues
'copies it over
With Worksheets("Source").Columns("F")
lngrow = .Find("*", After:=.Cells(1), _
LookIn:=xlValues, SearchDirection:=xlPrevious).Row
For i = lngrow To 1 Step -1
If (Cells(i, "F").Value) = "NA" Then
Cells(i, "A").EntireRow.Delete
'Deletes catalogued NAs
End If
Next i
End With
Application.CutCopyMode = False
On Error Resume Next
If Worksheets("source").Range("Table4[[Company]]").SpecialCells(xlCellTypeBlanks).Count > 0 Then
Worksheets("source").Range("Table4[[Company]]").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
'Deletes blank cells in table
End If
Else
rColored.Select
MsgBox "Selected cells contain data that are not catalogued in the refrence table. Please catalogue them before preeceding:" & _
vbCrLf & rColored.Address
End If
Set rCell = Nothing
Set rColored = Nothing
ActiveWorkbook.RefreshAll
Application.ScreenUpdating = True
End Sub
Я не вижу ничего, что сразу же выделяется - это выглядит как будто вы только что обработка тонны данных. Однако этот вопрос может быть лучше подходит для 'codereview.stackexchange.com' – puzzlepiece87
Удаление строк - один из самых медленных процессов в Excel. Я обнаружил, что ошибки сортировки в верхней или нижней части моего диапазона перед удалением помогают ускорить процесс. Есть много формул в вашей таблице, или это жесткие данные? –
Вместо того, чтобы зацикливать, используйте фильтрацию и удалите вещи за один раз. Вероятно, можно сделать то же самое с раскраской на ячейке. – sous2817