Добрый день. Столкнулся с проблемой. Существует книга с любым количеством листов, имеющих в каждой новой книге разные названия. Листы представляют из себя форму акта. Каждая новая книга имеет листы с новым наименованием, либо вообще без оного. На каждом листе часть данных повторяется, а часть меняется (напр.: Акт освидетельствования скрытых работ № - постоянно, сам номер в отдельной ячейке и естественно неповторим, наименование работ, содержащееся в определенном диапазоне ячеек, и дата аналогично. Нужен универсальный макрос, который: 1. Создаст новый лист с названием "Реестр" 2. В этом листе создаст список из 2-х столбцов: а). Сцепка фраз из ячеек каждого листа в новой строке "АКТосвидетельствования скрытых работ№ХХХНаименованиеработ (каждый цвет - это определенная ячейка в листе) б). чч. мм.гггг Макрос должен быть универсальным, обновлять реестр при добавлении и удалении листов и не реагировать на их переименование. Каждая новая строка в реестре берется из следующего листа. Отдаленный пример того что должно получиться в приложении.
Добрый день. Столкнулся с проблемой. Существует книга с любым количеством листов, имеющих в каждой новой книге разные названия. Листы представляют из себя форму акта. Каждая новая книга имеет листы с новым наименованием, либо вообще без оного. На каждом листе часть данных повторяется, а часть меняется (напр.: Акт освидетельствования скрытых работ № - постоянно, сам номер в отдельной ячейке и естественно неповторим, наименование работ, содержащееся в определенном диапазоне ячеек, и дата аналогично. Нужен универсальный макрос, который: 1. Создаст новый лист с названием "Реестр" 2. В этом листе создаст список из 2-х столбцов: а). Сцепка фраз из ячеек каждого листа в новой строке "АКТосвидетельствования скрытых работ№ХХХНаименованиеработ (каждый цвет - это определенная ячейка в листе) б). чч. мм.гггг Макрос должен быть универсальным, обновлять реестр при добавлении и удалении листов и не реагировать на их переименование. Каждая новая строка в реестре берется из следующего листа. Отдаленный пример того что должно получиться в приложении.Webbear
Sub Реестр() Dim i%, Sh Cells.Clear 'Очистим лист Реестр i = 1 For Each Sh In Sheets 'Перебираем все имеющиеся листы в Книге If Sh.Name <> "Реестр" Then 'пропустим лист Реестр i = i + 1 With Sh Cells(i, 1) = .Range("A48") & " " & .Range("A49") & " № " & .Range("B51") & " " & .Range("T82") & " " & .Range("A83") 'Собираем текст из ячеек Cells(i, 2) = .Range("U51") & " " & .Range("X51") & " " & .Range("AC51") 'Собираем текст из ячеек End With End If Next Sh End Sub
[/vba]
Webbear, В таком виде: (кнопка на листе Реестр)
[vba]
Код
Sub Реестр() Dim i%, Sh Cells.Clear 'Очистим лист Реестр i = 1 For Each Sh In Sheets 'Перебираем все имеющиеся листы в Книге If Sh.Name <> "Реестр" Then 'пропустим лист Реестр i = i + 1 With Sh Cells(i, 1) = .Range("A48") & " " & .Range("A49") & " № " & .Range("B51") & " " & .Range("T82") & " " & .Range("A83") 'Собираем текст из ячеек Cells(i, 2) = .Range("U51") & " " & .Range("X51") & " " & .Range("AC51") 'Собираем текст из ячеек End With End If Next Sh End Sub
Webbear, Надеюсь у Вас не более 100 листов будет )))))
[vba]
Код
Sub Реестр() Dim i%, Sh, bSh As Boolean, Arr(1 To 100, 1 To 2)
i = 0: bSh = False For Each Sh In Sheets 'Перебираем все имеющиеся листы в Книге If Sh.Name <> "Реестр" Then i = i + 1 With Sh Arr(i, 1) = .Range("A48") & " " & .Range("A49") & " № " & .Range("B51") & " " & .Range("T82") & " " & .Range("A83") Arr(i, 2) = DateValue(.Range("U51") & " " & .Range("X51") & " " & Mid(.Range("AC51"), 1, 4)) End With Else bSh = True End If Next Sh
If Not bSh Then Set ShR = Sheets.Add: ShR.Name = "Реестр" With Sheets("Реестр") .Cells.Clear .Range("A1:B100") = Arr .Columns("A:B").EntireColumn.AutoFit End With End Sub
[/vba]
Webbear, Надеюсь у Вас не более 100 листов будет )))))
[vba]
Код
Sub Реестр() Dim i%, Sh, bSh As Boolean, Arr(1 To 100, 1 To 2)
i = 0: bSh = False For Each Sh In Sheets 'Перебираем все имеющиеся листы в Книге If Sh.Name <> "Реестр" Then i = i + 1 With Sh Arr(i, 1) = .Range("A48") & " " & .Range("A49") & " № " & .Range("B51") & " " & .Range("T82") & " " & .Range("A83") Arr(i, 2) = DateValue(.Range("U51") & " " & .Range("X51") & " " & Mid(.Range("AC51"), 1, 4)) End With Else bSh = True End If Next Sh
If Not bSh Then Set ShR = Sheets.Add: ShR.Name = "Реестр" With Sheets("Реестр") .Cells.Clear .Range("A1:B100") = Arr .Columns("A:B").EntireColumn.AutoFit End With End Sub
devilkurs, мне кажется так будет несколько проще (взял за основу Ваш первый код, изменения формата даты не переносил) [vba]
Код
Sub Реестр() Dim i%, Sh As Worksheet, rSh As Worksheet Application.ScreenUpdating = False On Error Resume Next Set rSh = Sheets("Реестр") If Err Then Err.Clear Set rSh = Sheets.Add rSh.Name = "Реестр" Else With rSh .Activate .UsedRange.Clear 'Очистим лист Реестр End With End If i = 1 For Each Sh In Sheets 'Перебираем все имеющиеся листы в Книге If Sh.Name <> "Реестр" Then i = i + 1 With Sh Cells(i, 1) = .Range("A48") & " " & .Range("A49") & " № " & .Range("B51") & " " & .Range("T82") & " " & .Range("A83") Cells(i, 2) = .Range("U51") & " " & .Range("X51") & " " & .Range("AC51") End With End If Next Sh rSh.Columns("A:B").AutoFit Application.ScreenUpdating = True End Sub
[/vba]
devilkurs, мне кажется так будет несколько проще (взял за основу Ваш первый код, изменения формата даты не переносил) [vba]
Код
Sub Реестр() Dim i%, Sh As Worksheet, rSh As Worksheet Application.ScreenUpdating = False On Error Resume Next Set rSh = Sheets("Реестр") If Err Then Err.Clear Set rSh = Sheets.Add rSh.Name = "Реестр" Else With rSh .Activate .UsedRange.Clear 'Очистим лист Реестр End With End If i = 1 For Each Sh In Sheets 'Перебираем все имеющиеся листы в Книге If Sh.Name <> "Реестр" Then i = i + 1 With Sh Cells(i, 1) = .Range("A48") & " " & .Range("A49") & " № " & .Range("B51") & " " & .Range("T82") & " " & .Range("A83") Cells(i, 2) = .Range("U51") & " " & .Range("X51") & " " & .Range("AC51") End With End If Next Sh rSh.Columns("A:B").AutoFit Application.ScreenUpdating = True End Sub
МВТ, О! через обработчик ошибок ))) Отлично! А я никак не научу себя его использовать )))
Код МВТ + преобразование даты
[vba]
Код
Sub Реестр() Dim i%, Sh As Worksheet, rSh As Worksheet Application.ScreenUpdating = False On Error Resume Next Set rSh = Sheets("Реестр") If Err Then Err.Clear Set rSh = Sheets.Add rSh.Name = "Реестр" Else With rSh .Activate .UsedRange.Clear 'Очистим лист Реестр End With End If i = 1 For Each Sh In Sheets 'Перебираем все имеющиеся листы в Книге If Sh.Name <> "Реестр" Then i = i + 1 With Sh Cells(i, 1) = .Range("A48") & " " & .Range("A49") & " № " & .Range("B51") & " " & .Range("T82") & " " & .Range("A83") Cells(i, 2) = DateValue(.Range("U51") & " " & .Range("X51") & " " & Mid(.Range("AC51"), 1, 4)) End With End If Next Sh rSh.Columns("A:B").AutoFit Application.ScreenUpdating = True End Sub
[/vba]
МВТ, О! через обработчик ошибок ))) Отлично! А я никак не научу себя его использовать )))
Код МВТ + преобразование даты
[vba]
Код
Sub Реестр() Dim i%, Sh As Worksheet, rSh As Worksheet Application.ScreenUpdating = False On Error Resume Next Set rSh = Sheets("Реестр") If Err Then Err.Clear Set rSh = Sheets.Add rSh.Name = "Реестр" Else With rSh .Activate .UsedRange.Clear 'Очистим лист Реестр End With End If i = 1 For Each Sh In Sheets 'Перебираем все имеющиеся листы в Книге If Sh.Name <> "Реестр" Then i = i + 1 With Sh Cells(i, 1) = .Range("A48") & " " & .Range("A49") & " № " & .Range("B51") & " " & .Range("T82") & " " & .Range("A83") Cells(i, 2) = DateValue(.Range("U51") & " " & .Range("X51") & " " & Mid(.Range("AC51"), 1, 4)) End With End If Next Sh rSh.Columns("A:B").AutoFit Application.ScreenUpdating = True End Sub
Возможно ли как то поменять код, что бы также excel создавал реестр, но с измененными исходными условиями.
Все исходные данные располагаются на листе "АОСР"
1. Из лист "АОСР", столбец Е на лист "Реестр" в столбец B 2. Из лист "АОСР", столбец В, С, D в на лист "Реестр" в столбец С (=АОСР!B2&"."&АОСР!C2&"."&"20"&АОСР!D2) 3. Из лист "АОСР", столбец Q Е на лист "Реестр": наименование в столбец B, даты столбец С.
Аналогично с другими строками.
Реестр необходимо сформировать согласно шаблона на листе "Реестр" Пример во вложении. Спасибо!
Всем добрый вечер! Разрешите поднять тему.
Возможно ли как то поменять код, что бы также excel создавал реестр, но с измененными исходными условиями.
Все исходные данные располагаются на листе "АОСР"
1. Из лист "АОСР", столбец Е на лист "Реестр" в столбец B 2. Из лист "АОСР", столбец В, С, D в на лист "Реестр" в столбец С (=АОСР!B2&"."&АОСР!C2&"."&"20"&АОСР!D2) 3. Из лист "АОСР", столбец Q Е на лист "Реестр": наименование в столбец B, даты столбец С.
Аналогично с другими строками.
Реестр необходимо сформировать согласно шаблона на листе "Реестр" Пример во вложении. Спасибо!DmitriiS