Копировать формулы ячеек VBA

Я сделал программу в VBA, чтобы скопировать формулы в каждой ячейке в определенном столбце, у меня есть 30501 балл, и программа действительно медленна даже для вычисления 100 пунктов, есть лучший способ сделать это?

Sub Copyformulas() Dim i As Integer Dim cell As Range Dim referenceRange As Range Dim a As String a = "$T$30510" Set range1= ActiveSheet.Range("A1:A30510") Set myrange = Range("T16:T30510") i = 16 Do Until Cells(20, 30510) With range1 For Each cell In myrange If cell.HasFormula Then Cells(i, 35).Value = cell.Address Cells(i, 36).Value = "'" & CStr(cell.Formula) i = i + 1 End If Next End With Loop End Sub 

Попробуйте добавить следующее:

 Application.Calculation = xlCalculationManual Application.ScreenUpdating = False Application.EnableEvents = False ... Your Code ... Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True Application.EnableEvents = True 

Вам может понадобиться только первая, но все они являются хорошей практикой в ​​использовании. Кроме того, где вы используете команду With ... End With ? Я не вижу его использования в блоке.

Рекомендуется использовать Option Explicit в верхней части модуля. И range1 и myrange не объявлены.

 Application.Calculation 

Когда рабочий лист доступен или прецеденты диапазона изменены, Excel автоматически пересчитывает формулы на листе. Поскольку вы зацикливаете более 30 000 раз, это заставляет Excel пересчитывать каждый раз через цикл и, таким образом, замедляет производительность.

 Application.ScreenUpdating 

Эта строка останавливает Excel от вспышек экрана и других вещей, которые возникают при запуске макроса.

 Application.EnableEvents 

Эта строка отключает события, такие как Worksheet_Change , так что событие не запускается. Если он не отключен, то в любой момент, когда на рабочем листе происходит изменение, будет запущен код в событии изменения. Если у вас есть событие Worksheet_SelectionChange тогда код будет запускаться каждый раз, когда вы выберете другую ячейку. Эти события записываются на рабочем листе или в объектах рабочей книги, расположенных в окне проекта VBE, и есть много событий на выбор. Вот очень простая иллюстрация. В окне проекта: Sheet1 В окне проекта поставьте следующее:

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox "Hi!" End Sub 

Теперь щелкните по рабочему листу. Вы видите, что он реагирует на каждое изменение выбора. Теперь разместите следующее в регулярном модуле:

 Sub TestEnableEvents() Application.EnableEvents = False ActiveCell.Offset(1, 0).Select Application.EnableEvents = True End Sub 

При запуске вышеуказанного кода окно сообщения не будет запущено.

Вы можете использовать SpecialCells для уточнения диапазона. Вам не нужно использовать ActiveSheet, это подразумевается.

Установите rSource = Range («A16: A30510»). SpecialCells (xlCellTypeFormulas)

 Sub Copyformulas() Application.Calculation = xlManual Application.ScreenUpdating = False Application.EnableEvents = False Dim c As Range Dim rSource As Range Set rSource = ActiveSheet.Range("A16:A30510").SpecialCells(xlCellTypeFormulas) For Each c In rSource c.Offset(0, 34) = c.Address c.Offset(0, 35) = "'" & c.Formula Next Application.Calculation = xlAutomatic Application.ScreenUpdating = True Application.EnableEvents = True End Sub 
Давайте будем гением компьютера.