kavaka, РАБОТАЕТ! Вы мой спаситель!!! Огромное Вам спасибо! Подскажите, а если название файлов совпадать не будет с именем заполненного столбца, могут быть проблемы с выводом информации? И если у кого то из магазинов будет шаблон без нового магазина и будет идти смещение столбцов, данные будут корректно заполняться? И есть ли возможность сделать так, что бы добавляемые позиции считались? Проблема в том, что магазины не видят чужих доп потребностей и заполняют их с 1-ой строчки. Естественно все вперемешку и макрос не может это посчитать. Можно ли сделать, что бы видя новую заполненную строчку макрос вставлял ее ниже и данные по ней тоже ниже вставлял, а не на место заполненной другим магазином строчки? Это строчки ниже "Дополнительно". Так же с удовольствием почитаю инфу про написание макросов, если кто-то посоветует хороший, а главное понятный источник)
m.roman написал: Можете один из этих файлов выложить здесь
К сожалению, выложить оригинал файла не получается т.к. он весит больше допустимого. Сохранил его без формул и т.п. в цифровом режиме. Но даже так из него не собираются данные. По результатам сбора в шаблоне много столбцов без нулей. С учетом того, что "0" должен проставляться по всем ячейкам где не обнаружено данных, я предположу, что макрос просто не проводит проверку в этих столбцах.
Nordheim, я хочу сделать сетевую папку, где будут лежать поименованные файлы и каждый магазин будет заполнять свой файл. Сейчас я собираю их из почты и даю имена файлом по названию магазина.
m.roman написал: На скорую руку. Сделано исходя из того, что структуры файлов от магазинов будут без изменений, т.е один в один с шаблоном.
Огромное Вам спасибо! Протестил. Запустил на 13 книгах. Почему то пропускает некоторые файлы =( Проверил книги, никаких изменений в структуре нет. все полностью идентичны. даже по условиям(ограничения, защита и т.п.) расхождений нет. Из 13 подгрузил 7. Прикладываю результат. Пропустил столбцы с именами: А073, А076, А151, А199, А208 Сможете подсказать, что нужно доработать?
Nordheim написал: вас непонятно как выглядит файл из которого тянутся данные, т.е. что является в файле источнике ориентиром, для определения столбца в который будут вставлятся данные.
Все файлы одинаковые и аналогичны шаблону. У каждого магазина свой столбец, в который он заносит цифровые значение (количество требуемого товара) напротив товара(строчки слева) Единственные изменения, которые могут быть - это дополнительные товары, не указанные в списке. Их магазин вносит в конце списка товаров.
Читал про эту надстройку и даже скачал, но на работе нет админских прав. А что бы установить доп. программы придется пройти целую кучу согласований. По этому софт и надстройки, к сожалению, рассматривать не могу(((((
Вот такой еще нашел, но у него ограничение по столбцам до VI, а у меня их гораздо больше до UU
Код
Sub Собрать_данные_из_xls_файлов() ' Макрос создает книгу и последовательно вставляет на одноименные листы ' данные из всех xls файлов заданной директории начиная со строки FRow. Const FRow& = 2 ' Номер строки начала сбора данных (ниже шапки) Const Sborka$ = "Сборка.xls" ' Имя сборочного файла Dim FCol&, LCol& ' Переменные номеров первого и последнего столбца для сбора данных Dim LRow&, LRow_Cel& Dim wb_Cel As Workbook, wb_Tek As Workbook Dim Sh_Cel As Worksheet, Sh_Tek As Worksheet Dim MyPath$, MyFileName$, MyFulName$ Dim Uslovie1 As Boolean ' Выбор папки With Application.FileDialog(msoFileDialogFolderPicker) .Title = "Укажите рабочую папку": .Show If .SelectedItems.Count = 0 Then Exit Sub MyPath = .SelectedItems(1) & "\" End With 'MyPath = "C:\inbox\Тест Макроса\Тест\" ' MyPath = CurDir & "\" MyFileName = Dir(MyPath & "*.xls*") Uslovie1 = False Do Until MyFileName = "" If MyFileName <> Sborka Then MyFulName = MyPath & MyFileName Workbooks.Open Filename:=MyFulName, UpdateLinks:=0 If Not Uslovie1 Then Set wb_Cel = ActiveWorkbook ActiveWorkbook.SaveAs Filename:=MyPath & Sborka, FileFormat:=xlExcel8, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False Uslovie1 = True Else Set wb_Tek = ActiveWorkbook For Each Sh_Cel In wb_Cel.Sheets With Sh_Cel FCol = .UsedRange.Cells(1, 1).Column LCol = .UsedRange.Columns.Count + FCol - 1 LRow_Cel = .Cells(.Rows.Count, FCol).End(xlUp).Row + 1 End With For Each Sh_Tek In wb_Tek.Sheets If Sh_Tek.Name = Sh_Cel.Name Then With Sh_Tek LRow = .Cells(.Rows.Count, FCol).End(xlUp).Row If LRow >= FRow Then .Range(.Cells(FRow, FCol), .Cells(LRow, LCol)).Copy Sh_Cel.Cells(LRow_Cel, 1) End If End With With Sh_Cel Range(.Cells(LRow_Cel , 2+LCol-FCol), .Cells(LRow_Cel+LRow-FRow, 2+LCol-FCol))= MyFulName End With End If Next Sh_Tek Next Sh_Cel Workbooks(MyFileName).Close SaveChanges:=False End If End If MyFileName = Dir LoopEnd Sub
Прошу прощения. Не тот файл приложил. Вот файл с макросом и код.
Код
Option Explicit
Sub Consolidated_Range_of_Books_and_Sheets()
Dim iBeginRange As Object, lCalc As Long, lCol As Long
Dim oAwb As String, sCopyAddress As String, sSheetName As String
Dim lLastrow As Long, lLastRowMyBook As Long, li As Long, iLastColumn As Integer
Dim wsSh As Object, wsDataSheet As Object, bPolyBooks As Boolean, avFiles
Dim wbAct As Workbook
Dim bPasteValues As Boolean
On Error Resume Next
'Выбираем диапазон выборки с книг
Set iBeginRange = Application.InputBox("Выберите диапазон сбора данных." & vbCrLf & _
"1. При выборе только одной ячейки данные будут собраны со всех листов начиная с этой ячейки. " & _
vbCrLf & "2. При выделении нескольких ячеек данные будут собраны только с указанного диапазона всех листов.", Type:=8)
'для указания диапазона без диалогового окна:
'Set iBeginRange = Range("A1:A10") 'диапазон указывается нужный
'Если диапазон не выбран - завершаем процедуру
If iBeginRange Is Nothing Then Exit Sub
'Указываем имя листа
'Допустимо указывать в имени листа символы подставки ? и *.
'Если указать только * то данные будут собираться со всех листов
sSheetName = InputBox("Введите имя листа, с которого собирать данные(если не указан, то данные собираются со всех листов)", "Параметр")
'Если имя листа не указано - данные будут собраны со вех листов
If sSheetName = "" Then sSheetName = "*"
On Error GoTo 0
'Запрос - вставлять на результирующий лист все данные
'или только значения ячеек (без формул и форматов)
bPasteValues = (MsgBox("Вставлять только значения?", vbQuestion + vbYesNo, "Excel-VBA") = vbYes)
'Запрос сбора данных с книг(если Нет - то сбор идет с активной книги)
If MsgBox("Собрать данные с нескольких книг?", vbInformation + vbYesNo, "Excel-VBA") = vbYes Then
avFiles = Application.GetOpenFilename("Excel files(*.xls*),*.xls*", , "Выбор файлов", , True)
If VarType(avFiles) = vbBoolean Then Exit Sub
bPolyBooks = True
lCol = 1
Else
avFiles = Array(ThisWorkbook.FullName)
End If
'отключаем обновление экрана, автопересчет формул и отслеживание событий
'для скорости выполнения кода и для избежания ошибок, если в книгах есть иные коды
With Application
lCalc = .Calculation
.ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual
End With
'создаем новый лист в книге для сбора
Set wsDataSheet = ActiveWorkbook.Sheets.Add(After:=Sheets(Sheets.Count))
'если нужно сделать сбор данных на новый лист книги с кодом
'Set wsDataSheet = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
'цикл по книгам
For li = LBound(avFiles) To UBound(avFiles)
If bPolyBooks Then
Set wbAct = Workbooks.Open(Filename:=avFiles(li))
Else
Set wbAct = ThisWorkbook
End If
oAwb = wbAct.Name
'цикл по листам
For Each wsSh In wbAct.Sheets
If wsSh.Name Like sSheetName Then
'Если имя листа совпадает с именем листа, в который собираем данные
'и сбор идет только с активной книги - то переходим к следующему листу
If wsSh.Name = wsDataSheet.Name And bPolyBooks = False Then GoTo NEXT_
With wsSh
Select Case iBeginRange.Count
Case 1 'собираем данные начиная с указанной ячейки и до конца данных
lLastrow = .Cells(1, 1).SpecialCells(xlLastCell).Row
iLastColumn = .Cells.SpecialCells(xlLastCell).Column
sCopyAddress = .Range(.Cells(iBeginRange.Row, iBeginRange.Column), .Cells(lLastrow, iLastColumn)).Address
Case Else 'собираем данные с фиксированного диапазона
sCopyAddress = iBeginRange.Address
End Select
lLastRowMyBook = wsDataSheet.Cells.SpecialCells(xlLastCell).Row + 1
'вставляем имя книги, с которой собраны данные
If lCol Then wsDataSheet.Cells(lLastRowMyBook, 1).Resize(Range(sCopyAddress).Rows.Count).Value = oAwb
If bPasteValues Then 'если вставляем только значения
.Range(sCopyAddress).Copy
wsDataSheet.Cells(lLastRowMyBook, 1).Offset(, lCol).PasteSpecial xlPasteValues
Else
.Range(sCopyAddress).Copy wsDataSheet.Cells(lLastRowMyBook, 1).Offset(, lCol)
End If
End With
End If
NEXT_:
Next wsSh
If bPolyBooks Then wbAct.Close False
Next li
With Application
.ScreenUpdating = True: .EnableEvents = True: .Calculation = lCalc
End With
End Sub
Z написал: Если вам нужен не совет по самостоятельному решению задачи, а чтобы все сделали за вас
Так есть же макрос, я только прошу помочь его "заточить" под мою задачу. Если кто-то готов объяснить, как это сделать самостоятельно, я с удовольствием приму эту информацию!
Добрый день. Прошу Вашей помощи вот в чем. Каждый месяц мне приходят одинаковые файлы 450 штук. В каждом файле магазин заполняет один столбец со своими потребностями. Мне приходится вручную собирать все файлы в папку а потом копи-пастить 1 столбец из каждого файла в общий заказ. Хотелось бы найти макрос, который будет забирать числа из ЗАПОЛНЕННОГО столбца и вставлять в единую таблицу. Нашел макрос, который работает с моими книгами, но делает не то что мне надо. Он копирует и вставляет таблицы друг под другом, а мне нужно, что бы он в готовый шаблон подставлял заполненные столбцы из выбранных книг. По итогу должна получаться общая потребность всех магазинов в столбце "Итого" и потребность каждого - для поставщика. Есть строчки(товары), которые не меняются. Есть столбцы(магазины), которые на против товара ставят потребность. Есть 450 файлов от магазинов. В каждом файле заполнен 1 или 2 столбца. Я хочу, что бы выбрав эти 450 файлов, макрос копировал и подставлял именно заполненный столбец в шаблон. И желательно как то упростить процедуру т.к. выбрав 20 файлов ноут завис совсем. Прикладываю Файл шаблона. На 2-ом листе пример, как выглядит заполненный файл от магазина. Так же прикладываю зам макрос.
Очень прошу о помощи! Без Вас с этим никак не справлюсь...