Объясняю более подробно. Есть таблица, в которой я сделала дополнительный столбик. В этот столбик я подтягиваю ВПР. Но так как в таблице постоянно меняется количество строчек, то мой макрос сейчас то не до конца протягивает функцию, то наоборот - выходит за пределы таблицы. Можно ли как-то универсально прописать чтобы выделяло до конца заполненной таблицы таблицы(по аналогии с клавишами Ctrl+Shift+стрелочка вниз)? Сильно не ругать - VBA только изучаю.
Dim lLastRow As Long
lLastRow = Cells(Rows.Count,1).End(xlUp).Row 'номер последней заполненной ячейки в первом столбце.
подходит?
Range("A2:A" & lLastRow).Select
Если применяете VBA, то и результат вместо ВПР можно получать в коде.
cheshiki1 ,спасибо но не работает :(возможно я как-то не так его ставлю
vikttur, я это знаю, но опять возникает вопрос - как ВПР вставить в ячейки в границах заполненной таблицы?
Если поможет, то код(та часть что отвечает за впр) у меня сейчас выглядит так:
Sheets("1").Select
Range("C2").Select
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-2],ÂÏÐ!C[-2]:C[-1],2,0)"
Selection.AutoFill Destination:=Range("C2:C5107")
Range("C2:C5107").Select
Range("C2").Select
Selection.Copy
Я Вам предложил вообще не использовать функцию листа.
Файл-пример?
Пример во вложении
Откуда-куда?
Формула ВПР вставляется в столбик С и до конца заполненной таблицы.
ВПР: (А2,ВПР!А:В,2,0)
Sub RetrievalOfData()
Dim ArrData(), ArrInit()
Dim lRws As Long, lRwsIn As Long
Dim i As Long, k As Long
With Worksheets("ВПР")
lRwsIn = .Cells(.Rows.Count, 1).End(xlUp).Row ' строк в таблице сравнения
If lRwsIn < 2 Then Exit Sub ' нет данных, выход
ArrInit = .Range("A1:B" & lRwsIn).Value ' таблица сравнения в массив
End With
With Worksheets("Просроки ОИВ")
lRws = .Cells(.Rows.Count, 1).End(xlUp).Row ' строк в данных
If lRws < 2 Then Exit Sub ' нет данных, выход
ArrData = .Range("A1:B" & lRws).Value ' данные в массив
ReDim Preserve ArrData(1 To lRws, 1 To 3) ' добавляем столбец для результата поиска
ArrData(1, 3) = .Cells(1, 3).Value
End With
For i = 2 To lRws ' построчно проходим по данным
For k = 2 To lRwsIn ' построчно проходим по таблице сравнения
If ArrData(i, 1) = ArrInit(k, 1) Then ' искомое совпало
ArrData(i, 3) = ArrInit(k, 2) ' записываем результат
Exit For ' выходим (нет смысла просматривать таблицу)
End If
Next k
Next i
' выгружаем данные на лист, отключив обновление экрана
Application.ScreenUpdating = False
Worksheets("Просроки ОИВ").Cells(1, 1).Resize(lRws, 3).Value = ArrData
Application.ScreenUpdating = True
End Sub
Спасибо, работает. А если вкладок в документе несколько?Формула и состав таблиц один и тот же-меняется только название вкладок...когда подставляю этот код мне уже на второй вкладке выдает ошибку в Dim ArrData(), ArrInit().
Макрос должен находиться в общем модуле (см. файл в предыдущем моем сообщении). Этому коду безразлично, с какого листа его запускать. Имена листов указаны в макросе.
With Worksheets("имялиста")
.........
End With
Все, что внутри оператора и начинается точкой, относится к родителю, указанному в операторе.
Если нужно перебрать все листы одним заходом, можно дополнить макрос:
Dim shts As Worksheet
For Each shts In ThisWorkbook.Worksheets
If shts.Name <> "ВПР" Then ' если лист с другим именем
' то поизвести действия для этого листа
End If
Next shts
Но это уже вопрос, выходящий за рамки темы.
Спасибо :)