Всем привет! Назрел вопрос, который без помощи профи мне не решить. Есть книга, объединяющая в себе разные счета. В этой книге счета имеют одинаковые столбцы, только количество строк у них постоянно меняется. Помимо счетов имеется лист, с помощью которого формируется заявка на отпуск материалов со склада - вводится номенклатурный номер или он ищется в выпадающем списке. Но есть несколько но: 1. В таблицах счетов есть пустые строки, что создает неудобство при заполнении заявки. 2. У меня получилось к заявке привязать только один лист. Теперь суть вопроса: 1. Как можно собрать данные, строки выделены цветом, со всех счетов на лист "Обобщенка". В идеале - чтоб при появлении в одном из счетов новых данных, лист со сводной информацией мог обновляться автоматически. 2. Может есть альтернативный способ создания выпадающего списка с разных листов, но без пустых строк. Спасибо.
Sub Sbor()
Dim Sht As Worksheet
Dim iLastRow As Long
Dim iLR As Long
iLastRow = Cells(Rows.Count, 1).End(xlUp).Row
Range("A5:K" & iLastRow).EntireRow.Delete
For Each Sht In Worksheets
If Sht.Name <> "Обобщенка" And Sht.Name <> "123" Then
With Sht
iLR = .Cells(.Rows.Count, 1).End(xlUp).Row
iLastRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
.Range(.Cells(2, "A"), .Cells(iLR, "K")).Copy Cells(iLastRow, 1)
End With
End If
Next
End Sub
Он данные собирает, но: - сбор данных происходит со всех листов, а мне необходимо именно с листов, которые содержат данные счетов - Лист 1, 2 и 3. - сбор происходит вместе с пустыми строками, а мне необходимо именно строки, которые выделены цветом, в моем случае светло коричневый.
Уважаемые профи, реально нужна Ваша помощь. Вот, есть макрос:
Код
Sub MacroCollector()
Dim LastRow As Long, i As Long, n As Long, Arr, Uniq As New Collection, x As Long, Material
Application.ScreenUpdating = False
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(2, 1), Cells(LastRow + 1, 1)).Clear
For n = 1 To Sheets.Count
With Sheets(n)
If .Name <> ActiveSheet.Name Then
LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To LastRow
On Error Resume Next
If .Cells(i, 1).Interior.ColorIndex = 40 Then Uniq.Add .Cells(i, 2), CStr(.Cells(i, 2))
Next
End If
End With
Next
ReDim Arr(1 To Uniq.Count, 1 To 1)
For Each Material In Uniq
x = x + 1
Arr(x, 1) = Material
Next
Range("A2").Resize(x, 1).Value = Arr
Application.ScreenUpdating = True
End Sub
То, что нужно, как мне кажется, но: 1. сбор данных происходит только по 2 столбцу счетов, а мне нужны столбцы 2, 3, 4 (наименование, код и единица измерения). 2. при сборе данных удаляются дубликаты, которые имеются в счетах, а мне необходимо сбор всех данных, так как идентификатором является инвентарный номер. 3. как сбор данных поместитесь в "умную таблицу" - это для того, чтобы был динамический диапазон для выпадающего списка.
Sub MacroCollector()
Dim LastRow As Long, i As Long, n As Long, Arr, Uniq As New Collection, x As Long, Material As Variant
Dim yy As Long
Dim xx As Long
Application.ScreenUpdating = False
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(2, 1), Cells(LastRow + 1, 1)).Clear
yy = 2
For n = 1 To Sheets.Count
With Sheets(n)
If .Name <> ActiveSheet.Name Then
LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To LastRow
On Error Resume Next
If .Cells(i, 1).Interior.ColorIndex = 40 Then
For xx = 2 To 4
Cells(yy, xx - 1).Value = .Cells(i, xx)
Next
yy = yy + 1
End If
Next
End If
End With
Next
' ReDim Arr(1 To Uniq.Count, 1 To 1)
' For Each Material In Uniq
' x = x + 1
' Arr(x, 1) = Material
' Next
' Range("A2").Resize(x, 1).Value = Arr
Application.ScreenUpdating = True
End Sub
Так себе идея, спросить про макрос в ветке, к которой прикреплён файл по другому вопросу.
МатросНаЗебре написал: Так себе идея, спросить про макрос в ветке, к которой прикреплён файл по другому вопросу.
Немного не понял Ваш ответ, но макрос работает. Если можно, то помогите подправить макрос так, чтобы: - выбранные данные добавлялись в "умную таблицу"; - выбранные данные не разделялись пустой строкой, а шли нарастающим порядком. Спасибо.
А, так это и был пример. Тогда в какую умную таблицу нужно добавлять?
Код
Sub MacroCollector()
Dim LastRow As Long, i As Long, n As Long, Arr, Uniq As New Collection, x As Long, Material As Variant
Dim yy As Long
Dim xx As Long
Application.ScreenUpdating = False
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(2, 1), Cells(LastRow + 1, 3)).Clear
yy = 2
For n = 1 To Sheets.Count
With Sheets(n)
If .Name <> ActiveSheet.Name Then
LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To LastRow
If Not IsEmpty(.Cells(i, 2).Value) Then
If .Cells(i, 1).Interior.ColorIndex = 40 Then
For xx = 2 To 4
Cells(yy, xx - 1).Value = .Cells(i, xx)
Next
yy = yy + 1
End If
End If
Next
End If
End With
Next
Application.ScreenUpdating = True
End Sub
Sub MacroCollector()
Dim LastRow As Long, i As Long, n As Long, Arr, Uniq As New Collection, x As Long, Material As Variant
Dim yy As Long
Dim xx As Long
Application.ScreenUpdating = False
Dim rr As Range
On Error Resume Next
Set rr = ActiveSheet.ListObjects(1).DataBodyRange
On Error GoTo 0
If rr Is Nothing Then
Set rr = Cells(2, 1)
Else
ActiveSheet.ListObjects(1).Resize ActiveSheet.ListObjects(1).Range.Rows(1).Resize(2)
End If
LastRow = Cells(Rows.Count, rr.Column).End(xlUp).Row
Range(Cells(rr.Row, rr.Column), Cells(LastRow + 1, rr.Column + 2)).Clear
yy = rr.Row
For n = 1 To Sheets.Count
With Sheets(n)
If .Name <> ActiveSheet.Name Then
LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To LastRow
If Not IsEmpty(.Cells(i, 2).Value) Then
If .Cells(i, 1).Interior.ColorIndex = 40 Then
For xx = 2 To 4
Cells(yy, rr.Column + xx - 2).Value = .Cells(i, xx)
Next
yy = yy + 1
End If
End If
Next
End If
End With
Next
Application.ScreenUpdating = True
End Sub
МатросНаЗебре, еще раз спасибо за помощь. Макрос работает. Насчет "умной таблицы"- я имею ввиду, чтобы данные собранные со счетов на лист "Обобщенка" формировались в "умную таблицу". Объясню почему - дело в том, что в последующем я хочу на базе собранных данных создать выпадающий список на листе "Заявка", которую и буду заполнять по средствам формулы ИНДЕКС и ПОИСКПОЗ.
Я как бы не спрашивал, зачем Вам нужна умная таблица. Я спрашивал, в какую умную таблицу вносить данные. Вариант в сообщении #11 добавляет в первую умную таблицу на активном листе.
, но у меня пока получается только с одного листа.
Цитата
МатросНаЗебре написал: Я спрашивал, в какую умную таблицу вносить данные.
МатросНаЗебре спасибо, работает. А можно еще попросить о помощи подправить макрос: - чтобы строки копировались полностью, своего рода повторяли структуру таблиц с листов со счетами; - чтобы при изменении данных на листах со счетами, они автоматически добавлялись на лист "Обобщенка".
Sub MacroCollector()
Dim LastRow As Long, i As Long, n As Long, arr As Variant, Uniq As New Collection, x As Long, Material As Variant
Dim yy As Long
Dim xx As Long
Application.ScreenUpdating = False
Dim rr As Range
On Error Resume Next
Set rr = ActiveSheet.ListObjects(1).DataBodyRange
On Error GoTo 0
If rr Is Nothing Then
Set rr = Cells(2, 1)
Else
ActiveSheet.ListObjects(1).Resize ActiveSheet.ListObjects(1).Range.Rows(1).Resize(2)
End If
LastRow = Cells(Rows.Count, rr.Column).End(xlUp).Row
Range(Cells(rr.Row, rr.Column), Cells(LastRow + 1, rr.Column + 2)).Clear
yy = rr.Row
For n = 1 To Sheets.Count
With Sheets(n)
If .Name <> ActiveSheet.Name Then
LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To LastRow
If Not IsEmpty(.Cells(i, 2).Value) Then
If .Cells(i, 1).Interior.ColorIndex = 40 Then
arr = .Cells(i, 2).Resize(1, .UsedRange.Columns.Count - 1)
Cells(yy, rr.Column).Resize(1, UBound(arr, 2)).Value = arr
' For xx = 2 To 4
' Cells(yy, rr.Column + xx - 2).Value = .Cells(i, xx)
' Next
yy = yy + 1
End If
End If
Next
End If
End With
Next
Application.ScreenUpdating = True
End Sub
Цитата
написал: чтобы при изменении данных на листах со счетами, они автоматически добавлялись на лист "Обобщенка"
Уважаемый МатросНаЗебре, еще раз спасибо за оказанную помощь. Уделите пожалуйста еще немного Вашего драгоценного времени и помогите, если не затруднит, "причесать" макрос: - создал умную таблицу по образцу и при запуске макроса в строке
возникает ошибка. - если удалить строки с 1 по 3, то макрос срабатывает, но строки копируются не полностью; - и самое главное:
Цитата
МатросНаЗебре написал: Это уже совсем другая история
дабы не создавать кучу тем, помогите автоматизировать процесс сбора данных. Честно, в макросах не силен и подправить его самостоятельно не смогу. Спасибо.
Sub MacroCollector()
Dim LastRow As Long, i As Long, n As Long, arr As Variant, Uniq As New Collection, x As Long, Material As Variant
Dim yy As Long
Dim xx As Long
Application.ScreenUpdating = False
Dim rr As Range
On Error Resume Next
Set rr = ActiveSheet.ListObjects(1).DataBodyRange
On Error GoTo 0
If rr Is Nothing Then
Set rr = Cells(5, 1)
Else
ActiveSheet.ListObjects(1).Resize ActiveSheet.ListObjects(1).Range.Rows(1).Resize(2)
End If
LastRow = Cells(Rows.Count, rr.Column).End(xlUp).Row
Range(Cells(rr.Row, rr.Column), Cells(LastRow + 1, rr.Column)).EntireRow.ClearContents
yy = rr.Row
For n = 1 To Sheets.Count
With Sheets(n)
If .Name <> ActiveSheet.Name Then
LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To LastRow
If Not IsEmpty(.Cells(i, 2).Value) Then
If .Cells(i, 1).Interior.ColorIndex = 40 Then
arr = .Cells(i, 1).Resize(1, .UsedRange.Columns.Count - 1)
Cells(yy, rr.Column).Resize(1, UBound(arr, 2)).Value = arr
' For xx = 2 To 4
' Cells(yy, rr.Column + xx - 2).Value = .Cells(i, xx)
' Next
yy = yy + 1
End If
End If
Next
End If
End With
Next
Application.ScreenUpdating = True
End Sub