(Найти обновленную версию в ответах)VBA: Loops и Смещение в Worksheet_Change
У меня есть код, который работает хорошо, но немного медленно, и я хотел бы знать, как сделать его более эффективным , Тот факт, что код включает два цикла, может быть одной из возможных причин.
Ниже вы можете найти весь код:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Columns.CountLarge > 1 Then Exit Sub
If Not Intersect(Target, Me.Range("TABLE[COLUMN]")) Is Nothing Then
Application.ScreenUpdating = False
Dim rngCell As Range, urg As Range, drg As Range, u As Integer, d As Integer
d = 0
u = 0
Set urg = Target.Cells(1, 1)
Set drg = Target.Cells(Target.Count, 1)
Do While drg.Offset(d, -13) = drg.Offset(d + 1, -13)
d = d + 1
Loop
Do While urg.Offset(u, -13) = urg.Offset(u - 1, -13)
u = u - 1
Loop
For Each rngCell In Me.Range(Target.Offset(u, 0), Target.Offset(d, 0))
Application.EnableEvents = False
rngCell.Value = Target.Value
Application.EnableEvents = True
Next
Application.ScreenUpdating = True
End If
End Sub
Код вставки одинаковое значение входного сигнала (столбец 13) для всех соседних ячеек с тем же идентификатором (столбец 1). Например, если я бы ввести 3 для Column13 в любом ID002 или ID003:
Column1 Column2 Column3... Column13 Column13
ID001 1 1 1 > 1
ID002 2 2 2 > 3
ID002 3 3 2 > 3
ID003 4 4 4 > 4
После того, как я unput значение, это занимает несколько секунд, чтобы пересчитать соседние клетки, так что я был бы признателен за любые советы, которые сделают это быстрее работает код.
Большое спасибо!
Вызов «Офсет» и доступ к листам - это, вероятно, то, что убивает вас в производительности - вытащить все нужные вам значения в массив и работать с этим. – Comintern
Кроме того, вы можете просто установить значения в конце 'rngCell.value = Me.Range (Target.Offset (u, 0), Target.Offset (d, 0)). Значение', делая rngCell той же глубиной и т. д. du –