Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 29.01.2018
Сообщений: 8
1

Собрать из большой кучи файлов разной структуры некоторые данные в один - VBA

29.01.2018, 22:36. Показов 2299. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день,
с VBA не знакома, прошу подсказать - по форуму поиском смотрю -
есть темы - Собрать кучу файлов (xls)в один - VBA , исходные файлы жесткой, одинаковой структуры. получатель - жесткой структуры, таблица, столбцы которой надо заполнить поиском из исходных файлов .
А можно ли из очень большого кол-ва файлов ( более 100, а может и к 200) , которые могут иметь разные структуры, в разных ячейках, но столбцы имеют одинаковые заголовки...
из каждого файла поиском по названию столбца находим содержимое, и помещаем в файл-сводку, который имеет жесткую структуру.
То есть можно ли силами вба - открыть один раз файл, поиском найти содержимое определенных ячеек, записать в файл получатель(вот он жесткой структуры), закрыть этот файл.... и открыть следующий.
так как файлов много, наверное файл, в котором идут поиски данных, лучше один раз открыть - для ускорения процесса?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.01.2018, 22:36
Ответы с готовыми решениями:

VBA EXCEL: Собрать кучу файлов в один
В папке находится куча xls файлов. У всех у них одинаковая структура. Но она может меняться...

Собрать данные из нескольких файлов в один
Добрый день! Уважаемые хакеры нужна ваша помощь. Проблема: есть папка в которой...

Как собрать данные из нескольких файлов в один
Доброго времяни суток! Помогите плиз Ламеру, сломал голову. Есть задача собрать данные (2 столбца)...

Как собрать 100 одинаковых файлов с одной и той же таблицей в один файл с одной большой таблицей?
Здравствуйте, уважаемые специалисты. У меня имеется таблица - анкета. После того как люди на нее...

18
Модератор
Эксперт MS Access
11960 / 4828 / 779
Регистрация: 07.08.2010
Сообщений: 14,140
Записей в блоге: 4
29.01.2018, 22:50 2
выложите пример, показывающий разность структур
одинаков ли номер строки с шапкой
0
4064 / 1445 / 399
Регистрация: 07.08.2013
Сообщений: 3,617
29.01.2018, 22:51 3
лучше это делать из под файла получателя
или вообще левого файла (обзовем его оболочкой)
перед перебором файлов
копии запихнуть в папку
перебрать
копии удалить
макрос будет большой
и работать будет явно не миллисекунды а минуты а может и десятки минут
0
0 / 0 / 0
Регистрация: 29.01.2018
Сообщений: 8
29.01.2018, 23:13  [ТС] 4
Исходные файлы изначально были жесткой структуры (определенная шапка и строки-столбцы определены),
но пролистав файлы, увидела, что пользователи могут добавлять комментарии и тп - добавляя что строки, что столбцы.... поэтому номера строк и столбцов могут уплыть. а вот заголовки - не меняют, то есть на них поиском можно опираться.
не все данные нужны в итоговую т-цу, только несколько столбцов , но с разных файлов, разных листов.
понимаю, что он будет долго работать, хоть часы, до хоть весь рабочий день)
просто как человек незнакомый с вба - не знаю - от чего начать плясать - чтобы исходный файл не открывать каждый раз на поиск каждой позиции, а открыть , пробежать поиском по всем столбцам получателя... заполнить т-цу файла-получателя.. и закрыть исходный файл. и перейти к след. исходному файлу.
есть ли у вба механизм, чтобы несколько поисков в исходном файле записать в т-цу файла получателя, при этом не октрывая много раз исходный файл?
0
4064 / 1445 / 399
Регистрация: 07.08.2013
Сообщений: 3,617
29.01.2018, 23:27 5
да механизмы - то есть

если в таблице известны названия столбцов но не известен порядок следования этих столбцов
то всегда можно эту таблицу считать с определенным следованием столбцов при помощи ADODB рекордсета
(т.е. если в исходной табле имена столбцов идут f1 f7 f3 f2 а нужно f1 f2 f3 то рекордсет так их и вытащит f1 f2 f3)
но это частности
но тут возникает много если
названия столбцов должны быть одинаковыми во всех файлах ибо лишний пробел и информацию подхватить не получится
названия столбцов желательно должны быть в первой строке листа
ни каких объединения ячеек в названиях столбцов

для перебора файлов в папке удобно воспользоваться FSO

а еще лучше выложить хотя бы два файла источника и файл приемник (соответственно с левыми данными)
0
0 / 0 / 0
Регистрация: 29.01.2018
Сообщений: 8
29.01.2018, 23:43  [ТС] 6
Цитата Сообщение от snipe Посмотреть сообщение
если в таблице известны названия столбцов но не известен порядок следования этих столбцов
то всегда можно эту таблицу считать с определенным следованием столбцов при помощи ADODB рекордсета
(т.е. если в исходной табле имена столбцов идут f1 f7 f3 f2 а нужно f1 f2 f3 то рекордсет так их и вытащит f1 f2 f3)
порядок столбцов сохранен, между столбцами могут быть пользователями добавлены ещё столбцы.... ну, или даже какие-то столбцы могут быть удалены.
Цитата Сообщение от snipe Посмотреть сообщение
названия столбцов должны быть одинаковыми во всех файлах ибо лишний пробел и информацию подхватить не получится
названия столбцов желательно должны быть в первой строке листа
ни каких объединения ячеек в названиях столбцов
названия столбцов одинаковы, а вот названия столцбов могут быть в любой строке, так как строки могут быть добавлены(
Цитата Сообщение от snipe Посмотреть сообщение
для перебора файлов в папке удобно воспользоваться FSO
а еще лучше выложить хотя бы два файла источника и файл приемник (соответственно с левыми данными)
файлы источники и получатели создам и выложу, сейчас под рукой их нет, почитаю пока про рекордсеты и fso)
спасибо за помощь и идеи)
0
4064 / 1445 / 399
Регистрация: 07.08.2013
Сообщений: 3,617
29.01.2018, 23:48 7
про fso тут
http://www.script-coding.com/W... bject.html
про adodb (есть еще dao) - ссылку дать не могу т.к. не знаю

а вообще это очень большие библиотеки и изучать их придется не один день
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
30.01.2018, 00:19 8
Можно вообще открыть последовательно в цикле все источники, считать из них всю инфу в некий промежуточный объект, в конце из этого объекта всё собранное перегрузить в сводный файл.
Или сперва запомнить куда что в сводный нужно класть, затем открываем в цикле источники и данные кладём куда запомнили, без лишнего поиска.
Но без конкретной задачи и файлов - это всё теория...
0
15146 / 6419 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
30.01.2018, 00:21 9
Цитата Сообщение от snipe Посмотреть сообщение
это очень большие библиотеки и изучать их придется не один день
Не пугай человека!
Можно все встроенными средствами Excel+VBA сделать. Если структура данных не очень корявая, данные листа переносятся ОДНИМ действием - Расширенным фильтром. Он столбцы переставит в заданном порядке.
Цитата Сообщение от BlackEyes Посмотреть сообщение
не знаю - от чего начать плясать
Посмотрите Похожие темы внизу страницы. Приложите файлы-примеры и что должно получиться.
0
0 / 0 / 0
Регистрация: 29.01.2018
Сообщений: 8
30.01.2018, 11:08  [ТС] 10
Спасибо за помошь, вставляю файлы, объекты могут быть на разных листах, на трех, со всех листов объекты вставляем в одну т-цу получатель, объекты разные везде.
Вложения
Тип файла: xlsx получатель-шаблон.xlsx (9.6 Кб, 11 просмотров)
Тип файла: xlsx исходный файл - какой может быть.xlsx (12.3 Кб, 8 просмотров)
Тип файла: xlsx исходный файл - шаблон.xlsx (11.5 Кб, 7 просмотров)
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
30.01.2018, 11:33 11
Накидали бы туда что тянуть - ибо сейчас тянуть по факту нечего.
Список объектов есть? Или тянуть все что есть в заголовках, и то что туда вставили 'красным' тоже?
0
0 / 0 / 0
Регистрация: 29.01.2018
Сообщений: 8
30.01.2018, 13:19  [ТС] 12
Накидала придуманных данных, вкладываю.
Вложения
Тип файла: xlsx исходный файл - шаблон.xlsx (12.7 Кб, 7 просмотров)
Тип файла: xlsx исходный файл - какой может быть.xlsx (12.1 Кб, 10 просмотров)
Тип файла: xlsx получатель-шаблон.xlsx (9.6 Кб, 6 просмотров)
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
30.01.2018, 14:44 13
А какого вида должен быть результат?
Вот смотрите - есть данные
первый файл - первая группа - объект 1 - параметр 1 - Лодка
другой файл - первая группа - объект 1 - параметр 1 - ну пускай автомобиль...
куда их запихнуть в получатель? Там не предусмотрены файлы и группы, есть только какие-то непонятные номера...
Если исходить из того что есть - при переборе файлов-источников собираем словарь ключей файл/лист/объект/параметр с значениями соотв. ячейки, в финале просто выгружаем столбиком

№__объект___параметр 1

1|объект 1|Лодка
2|объект 1|автомобиль

Сделать реально. Таблицы можно выискивать по позиции ячейки "Характеристики (элементы сравнения)"
0
0 / 0 / 0
Регистрация: 29.01.2018
Сообщений: 8
30.01.2018, 16:47  [ТС] 14
Заполнила получатель по первому исходнику, в идеале должно быть так. второй, в приницпе с таким же содержимым, названия столбцов везде сохраняется, а вот их положение может плавать.
столбец объект будет заполнятся не из файлов-получателей. ему значения будут присвоены потом.
остальные столбцы и ячейки - где есть инфа, то есть.
непонятные номера в ячейках - это характеристики объектов.
в это примере всё равно такие - хоть масса, высота, ширина, цена... и тп. всё равно.
просто они или есть или нет.
смысл - есть некие данные, заполненные разными людьми, собираются эти файлы, сливаются в одну т-цу..
а потом фильтрами анализируется инфа вот как раз по определенным параметрам. но это уже ср-вами эксель, формулами.
Вложения
Тип файла: xlsx !получатель-шаблон.xlsx (11.8 Кб, 14 просмотров)
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
30.01.2018, 18:04 15
Т.е. сами объекты вообще не интересны? А как же тогда понимать что нужно тянуть, а что юзер просто так от нечего делать воткнул? Ориентироваться только на то, что шапка заполнена/пустая?
Вообще конечно так даже проще, тут даже словари не нужны. Хотя один привлечь для упрощения работы с заголовками можно. Или коллекцию.
0
0 / 0 / 0
Регистрация: 29.01.2018
Сообщений: 8
30.01.2018, 22:56  [ТС] 16
Тянем из столбца строку. В исходном файле они - по столбцам, а итоговую структуру - нарисовали - по строкам. Объект интересен своими параметрами. ID объекта будет присвоено потом, но по-большому счету сейчас оно не нужно - ну вот по выборке данных которую я сама тут нарисовала-придумала, смысл в том - что подтянуть ВСЕ строки из всех листов всех файлов, а потом их фильтровать.
ну, к примеру, если это этим выдуманным данным - выбрать все синие самолеты и узнать их максимальный вес(размер или другой там любой параметр - цифровой). мне нужно свести все данные , а потом разные статистики по ним собрать.
у меня другие данные, но смысл такой. Какая масса у всех самолетов такого интервала цены? какой спрос на велосипеды такой-то ценовой категории? вобщем, какой там средний, максимальный, минимальный параметр по какому-то фильтру (разным фильтрам) какого-то объекта.
конечно, для отчета эти данные надо сохранить в этом общем , ОДНОМ ,файле , а идентификатор каждой строке будет присвоен.
путанно объясняю, прошу прощения.

Добавлено через 2 часа 2 минуты
Ориентир - только названия столбцов. они не меняются, содержимое - столбец - под названием столбца (под шапкой), количество столбцов может быть разным. и как во вложенных примерах - могут сдвигаться и вниз , и вверх... и все столбцы и строки... и некоторые столбцы и строки.
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
31.01.2018, 11:32 17
Код должен работать из любой книги-инструмента (надстройки или персональной книги), будет копировать на изначально активный лист.
Берёт все xlsx из каталога активного файла.
Предварительным списком заголовков столбцов будут те, что есть в наличии в первой строке активного листа.
Без предварительной очистки шаблона!


Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
Option Explicit
 
Sub tt()
Dim col As New Collection
Dim c As Range, i&, x&, shag&, imax&
Dim wb As Workbook, wsh As Worksheet, fso As Object, TheFolder As Object, afile As Object
 
Application.ScreenUpdating = False
Application.DisplayAlerts = False
 
Set wb = ActiveWorkbook
Set wsh = ActiveSheet
 
imax = 1
 
For Each c In ActiveSheet.[a1].CurrentRegion.Rows(1).Cells
col.Add c.Column, Trim(c)
Next
 
Set fso = CreateObject("Scripting.FileSystemObject")
 
Set TheFolder = fso.GetFolder(wb.Path) 'Каталог
For Each afile In TheFolder.Files
    If UCase(fso.GetExtensionName(afile.Path)) = "XLSX" Then
    Call Zapolnenie(wsh, afile, col, shag, imax)
    End If
Next
 
Application.ScreenUpdating = True
Application.DisplayAlerts = True
 
End Sub
 
Private Sub Zapolnenie(wsh As Worksheet, afile As Object, col As Object, shag As Long, imax As Long)
Dim book As Workbook, sh As Worksheet, r As Range, rr As Range, c As Range
Dim x&, y&, z&, il&, ii&, rrow&, t$
 
 
Set book = Workbooks.Open(afile)
    For Each sh In book.Worksheets
    shag = imax
    With sh
        Set r = .Cells.Find("Характеристики (элементы сравнения)", , xlValues, xlPart)
            If Not r Is Nothing Then
                y = r.Column
                rrow = r.Row
                x = .Cells(rrow, .Columns.Count).End(xlToLeft).Column
                il = .Cells(.Rows.Count, y).End(xlUp).Row
                For Each rr In .Range(.Cells(rrow + 1, y + 1), .Cells(il, x)).Rows
                t = Trim(.Cells(rr.Row, y))
                If Len(t) Then
                ii = shag
                    For Each c In rr.Cells
                        If Len(.Cells(rrow, c.Column)) Then
                        On Error Resume Next
                        z = col(t)
                        If Err <> 0 Then
                        Err.Clear
                        Else
                        'тут копирование
                        'Debug.Print c.Address
                        ii = ii + 1
                        c.Copy wsh.Cells(ii, z)
                        wsh.Cells(ii, 1) = ii - 1
                        imax = Application.Max(imax, ii)
                        End If
                        On Error GoTo 0
                        End If
                    Next
                End If
                Next
            End If
    End With
    Next
    book.Close 0
End Sub
Добавлено через 26 минут
P.S. Проверил работу из другого файла на активном - есть косяк, работает если у самого шаблона другое расширение, например xlsb.
Ибо сбивает с толку файл ~$получатель-шаблон.xlsx
Ну или нужно дорабатывать чуть код, что пока делать/постить некогда.
0
0 / 0 / 0
Регистрация: 29.01.2018
Сообщений: 8
31.01.2018, 12:34  [ТС] 18
Спасибо огромное, ушла разбираться)
спасибо!
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
31.01.2018, 14:03 19
Как вариант исключения из списка "левых" файлов - сперва составить список всех нужных файлов (сразу исключить всякие "~$*", а их и не будет если файлы закрыты), затем их по этому списку открывать.
0
31.01.2018, 14:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.01.2018, 14:03
Помогаю со студенческими работами здесь

Как собрать 32 разбитых архива Winrar, по 200мб каждый в один большой архив 6 Гб
народ ,мне нужно собрать 32 разбитых архива ,по 200мб в один большой в 6гб,повторяю,не распаковать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru