Private Sub Worksheet_Change(ByVal Target As Range)
Dim j As Integer
j = Target.Column
Dim i As Integer
i = Target.Row
Dim k
Dim di
Dim fn As String
di = ThisWorkbook.Sheets("Данные").Cells(2, 1)
If j = 3 Then
k = Cells(i, 2)
fn = Dir(di & k & ".xlsx")
If fn = k & ".xlsx" Then
Range("D1:AS1").Select // В этом диапазонне ссылки на ячейки файла-бланка
Selection.Copy
Cells(i, 4).Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
ActiveSheet.Rows(i).Replace what:="000001", Replacement:=k
Rows(i).EntireRow.AutoFit
Cells(i, 3).Select
Cells(i, 3).Activate
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:= _
di & k & ".xlsx"
Else
MsgBox "такого номера нет в бланках"
Exit Sub
End If
End If
End Sub
Макрос служит для добавления по одной строчке бланков, которые находятся в папке, их номера 000001...n, при выделении двух последних ячеек в столбце C и их протяжки на 1 ячейку, создается ссылка на файл и заполняется строка из ячеек этого файла. Постоянно приходится добавлять по одной строке. хотелось бы чтоб протягивался до последнего номера файла в папке по нажатию кнопки. Помогите, подскажите, сам макросы писал только по записи
Этот лист тоже, наверно, стоит приложить... Как минимум те данные, которые используются в формулах. Если там есть что-то секретное, то поменяйте данные на что-то аналогичное и менее секретное... Постарайтесь сделать так, чтобы в примере не осталось ссылок на внешние файлы.
Изменено: Ренат - 06.06.2016 18:39:50(уточнение по "персональным/коммерческим данным".)
welsher, размер превышен... См. пункт 2.3 правил ("общим весом..."). Поправьте, иначе модераторы удалят вложение(я). Достаточно было добавить вкладку из первого файла ("000001.xlsx") в "Реестр бланков.xlsm", либо одного файла... Смотрю...
Sub Blanki()
Dim i As Long, j As Integer, k As String
Dim di As String, fn As String, Sel As String
ThisWorkbook.Sheets("Данные").Select
Sel = Selection.Address ' запоминаем текущее выделение
i = Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row ' последняя строка на листе
j = Cells.Find("*", [A1], , , xlByColumns, xlPrevious).Column ' последний столбец на листе
di = Cells(2, 1).Value
k = Cells(i, 2).Value
fn = Dir(di & k & ".xlsx")
Application.EnableEvents = False ' отключение событий - "для отключение макроса изменения листа"
While fn = k & ".xlsx" And k <> ""
Range(Cells(1, 4), Cells(1, j)).Copy ' копируем "шаблон" формул
Range(Cells(i, 4), Cells(i, j)).PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
ActiveSheet.Rows(i).Replace what:="000001", Replacement:=k ' "приводим шаблон" к нужному результату
Rows(i).EntireRow.AutoFit
Cells(i, 3).Hyperlinks.Add Anchor:=Cells(i, 3), Address:=di & k & ".xlsx"
If i < Cells.Rows.Count Then ' если ещё есть куда протягивать (мало ли) :)
Range(Cells(i, 1), Cells(i, j)).AutoFill Destination:=Range(Cells(i, 1), _
Cells(i + 1, j)), Type:=xlFillDefault ' протягивание последней строки
i = i + 1
k = Cells(i, 2).Value
fn = Dir(di & k & ".xlsx")
Else
k = ""
End If
Wend
If fn <> k & ".xlsx" Then Rows(i).Delete ' удаление строки с несуществующим бланком
Range(Sel).Select ' восстанавливаем исходное выделение
Application.EnableEvents = True
End Sub
Только этот код надо записать в основной модуль (не в модуль листа) и "повесить на кнопку". Плюс надо удалить "старый код" из модуля листа. Код будет добавлять строки к самой нижней строке, поэтому на листе не должно быть строк с пустыми данными (т.е. если бланков 5, то и строк данными должно быть 5, без строк с формулами "на будущее").