Я перерабатываю некоторые финансовые отчеты для своей организации, чтобы отойти от стороннего программного обеспечения и хочу использовать VBA для помощи в автоматизации. С колледжа не писал VBA, поэтому немного ржавый.
Я получил код для работы, однако он очень неэффективен и работает с 1000 тыс. Записей каждые 30 секунд, что невозможно с несколькими сотнями тысяч записей. Я пробовал несколько разных вариантов, которые вы все опубликовали в разных темах, но, должно быть, что-то упустили.
Не могли бы вы взглянуть?
Большинство потоков, на которые я смотрел, ссылались либо на прямой ввод через одну ячейку, либо на тот же лист, чтобы выполнить поиск. Это один столбец на листе A (расчет резервирования ATB-Calc), а затем поиск в таблице на листе B (планирование глобальных поисков).
Я хочу, чтобы он пропускал ошибки и ничего не возвращал.
Я пробовал метод заполнения и копирования и вставки, ни один из которых я не могу заставить работать с формулой. Кажется, они просто хотят заполнить значением из исходной формулы.
Я думаю, что это не работает из-за скачков между листами, с которыми я сталкивался в разных вычислениях.
Я не один, чтобы просто попробовать один или два раза, так что это определенно я в конце моей веревки.
Dim GlobalExpPct As Variant
Range("AI2").Select 'Gets historical rates from Plan Global Lookups tab
Do
On Error Resume Next
GlobalExpPct = Application.WorksheetFunction.VLookup(ActiveCell.Offset(0, -24), Sheets("Plan Global Lookups").Range("A:B"), 2, False)
ActiveCell.value = GlobalExpPct
GlobalExpPct = vbNullString
ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Row < 1000 'have this in place to keep it from looping through all the records
Я подозреваю, что медленная обработка происходит из-за выбора следующей ячейки каждый раз, а затем повторного вызова значений и формулы листа. Обычно я вижу, что формула возвращает либо нулевое значение, либо получает то же значение из предыдущей формулы при заполнении.
Спасибо за помощь заранее. Это отличный ресурс, так как мне удалось решить 99% моих проблем на этом сайте.
Редактировать
Этот код, предоставленный Ахмедом, прекрасно работает, но мне нужен еще один критерий:
Если дополнительный столбец (базовый класс учетной записи «T») - «IP», то мы можем использовать «Планирование глобальных поисков A: B» в соответствии с текущей настройкой. Однако, если он заполнен иначе, нам нужно извлечь из поиска другой столбец. Мы можем продублировать таблицу на том же листе или по-прежнему использовать столбец A при поиске плана, в зависимости от того, что является наиболее эффективным. Вот код, который стоит сегодня, который отлично работает:
Sub GetGlobals()
Dim IntervalProcessing60k As Integer
Dim SRow As Long
Dim ERow As Long
Dim Src As Variant
Dim AcctPlan
Dim GlobalExpPct As Variant
Dim AcctPlanRng As Range
Dim Rslt() As Variant
Dim t As Date
Dim GetGlobalTime As Date
Dim ActWs As Worksheet
Dim ATBAllowResCalc As Worksheet
Set ActWs = ThisWorkbook.ActiveSheet
Set PlanGlobalWs = ThisWorkbook.Sheets("Plan Global Lookups")
Set ATBAllowResCalc = ThisWorkbook.Sheets("ATB-Allowance Reserving-Calc")
Set AcctGlobalRng = PlanGlobalWs.Range("A1:B" & PlanGlobalWs.Cells(PlanGlobalWs.Rows.Count, 1).End(xlUp).Row)
t = Now()
LastRow = Range("A" & Rows.Count).End(xlUp).Row
IntervalProcessing60k = 0
SRow = 2
ERow = LastRow
Src = ActWs.Range("K" & SRow & ":K" & ERow).value
X = 1
For Rw = SRow To ERow
AcctPlan = Src(Rw - SRow + 1, 1)
On Error Resume Next
GlobalExpPct = Application.WorksheetFunction.VLookup(AcctPlan, AcctGlobalRng, 2, False)
On Error GoTo 0
ReDim Preserve Rslt(1 To X)
Rslt(X) = IIf(IsNull(GlobalExpPct), "", GlobalExpPct)
GlobalExpPct = vbNullString
If Rw > 120000 Then Debug.Print Rw, X, Src(Rw - SRow + 1, 1), Rslt(X)
If X = 60000 Then
ActWs.Range("AI" & IntervalProcessing60k * 60000 + SRow).Resize(UBound(Rslt, 1), 1).value = Application.Transpose(Rslt)
IntervalProcessing60k = IntervalProcessing60k + 1
X = 1
ReDim Rslt(1 To 1)
Else
X = X + 1
End If
Next Rw
ActWs.Range("AI" & IntervalProcessing60k * 60000 + SRow).Resize(UBound(Rslt, 1), 1).value = Application.Transpose(Rslt)
GetGlobalTime = Format(Now() - t, "hh:mm:ss")
End Sub