Доброго времени суток! Недавно начал заниматься с vba, так что с трудными задачами возникают большие трудности. В 1 колонке дата, в 11 сумма, в 12 сумма, в 14 дата, которую надо заполнить. Необходимо, найти в колонке 12 сумму больше либо равно сумме в 11 и записать дату из найденной строки (колонка 1) в исходную строку в колонке 14. И так для каждого значения в колонке 11.
Вот мой код, в которому сразу есть какая-то ошибка, не очень понимаю, как исправить, возможно, что он вообще не заработает.
Код
Dim k As Integer, l As Integer, m As Date
Set R = Range(Cells(2, 12), Cells(LastRow, 12))
For i = 2 To LastRow Step 1
For l = 2 To LastRow Step 1
If l1.Cells(i, 11) <= R(l) Then
k = R(l).Row
GoTo cont
Next l
cont:
m = l1.Cells(k, 1)
l1.Cells(i, 14).Value = m
Next i
1. Название темы плохое: сюда можно какие угодно вопросы по циклам поместить. Предложите новое, раскрывающее суть проблемы, а не название инструмента, при помощи которого Вы планируете это осуществить. Модераторы поменяют. 2. Код следует оформлять соответствующим тегом. Ищите такую кнопку и исправьте своё сообщение.
Hugo, 1 - точно, про end if совсем забыл, когда писал равенство, сейчас посмотрю, работает ли сам расчет
2-3 - 4тыс с строк в данном случае, на другие операции хватает, тут же цикл вообще не запускается, выдает ошибку по next l (next without for), если убрать, то то же самое с next i
Ошибку не выдает, но не работает... везде посчитал 0... может как изменить надо?
Такие вещи лучше на массивах делать (а то и на коллекциях) Если я правильно представляю конечный результат, попробуйте так
Код
Sub calculate_()
Dim lRow As Long, I As Integer
Application.ScreenUpdating = False
With Sheets("l1")
.Columns("A:A").NumberFormat = "DD.MM.YYYY"
.Columns("N:N").NumberFormat = "DD.MM.YYYY"
lRow = .Cells(.Rows.Count, 1).End(xlUp).Row
arr1 = .Range("K2:K" & lRow).Value
arr2 = .Range("L2:L" & lRow).Value
For I = LBound(arr1) To UBound(arr1)
For J = LBound(arr2) To UBound(arr2)
If arr2(J, 1) >= arr1(I, 1) Then .Cells(J + 1, 14) = .Cells(I + 1, 1)
Next
Next
End With
Application.ScreenUpdating = True
End Sub
Hugo, спасибо, поставил end if после совета... да не там... goto снаружи оказалось, плюс переместил в модуль из листа и все заработало на большом объеме данных, ровно как моя огромадная формула, только в vba проще оказалось реализовать
Sanja, спасибо, завтра тоже попробую и ваш вариант, может он заработает и окажется быстрее
Посмотрел, все то же самое, подход понятен, спасибо, мне больше привычен просто другой, хотя не знаю, сыграет ли роль на скорости выполнения при тысячах 8-10 строк
Dim k As Integer, l As Integer, m As Date, R
LastRow = 4000
Set l1 = ActiveSheet '= Worksheets("Лист1")
With l1
Set R = Range(.Cells(2, 12), .Cells(LastRow, 12))
For i = 2 To LastRow Step 1
k = LastRow + 1
For l = 2 To LastRow Step 1
If .Cells(i, 11) <= R(l) Then
k = R(l).Row
Exit For
End If
Next l
m = .Cells(k, 1)
.Cells(i, 14).Value = m
Next i
End With