Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Объединение файлов + подсчет строк

67K
11 июля 2011 года
Kerstone
5 / / 29.03.2011
Всем привет!
Помогите кто может, как объединить несколько файлов в один и посчитать количество наименований по 4ем совпадающим столбцам
на примере таблицы во вложении
584
13 июля 2011 года
brodotsky
33 / / 25.01.2004
Код:
'Количество строк во всех объединяемых файлах:
Dim N
'Динамические массивы для временного хранения данных ячеек:
Dim B(), C(), D(), E(), F(), G()

'ПРОЦЕДУРА GetData ИЗВЛЕКАЕТ ДАННЫЕ ИЗ УКАЗАННОГО ФАЙЛА
Sub GetData(WorkbookName)
  'В файле перебираем строки:
  For I = 2 To Workbooks(WorkbookName).Sheets("список").Rows.Count
    'Извлекаем из строки данные ячеек:
    Value1 = Workbooks(WorkbookName).Sheets("список").Cells(I, 2)
    Value2 = Workbooks(WorkbookName).Sheets("список").Cells(I, 3)
    Value3 = Workbooks(WorkbookName).Sheets("список").Cells(I, 4)
    Value4 = Workbooks(WorkbookName).Sheets("список").Cells(I, 5)
    Value5 = Workbooks(WorkbookName).Sheets("список").Cells(I, 6)
    'Если везде оказалось пусто - выходим из цикла:
    If IsEmpty(Value1) And IsEmpty(Value2) _
    And IsEmpty(Value3) And IsEmpty(Value4) And IsEmpty(Value5) _
    Then Exit For
    'Увеличиваем N:
    N = N + 1
    'Расширяем массивы:
    ReDim Preserve B(1 To N)
    ReDim Preserve C(1 To N)
    ReDim Preserve D(1 To N)
    ReDim Preserve E(1 To N)
    ReDim Preserve F(1 To N)
    'Записываем данные в массивы:
    B(N) = Value1
    C(N) = Value2
    D(N) = Value3
    E(N) = Value4
    F(N) = Value5
  Next
  'Конец цикла
End Sub
'КОНЕЦ ПРОЦЕДУРЫ GetData

'ПРОЦЕДУРА GetCount СЧИТАЕТ КОЛИЧЕСТВО ПОВТОРОВ
Sub GetCount()
  'Расширяем массив:
  ReDim G(1 To N)
  'Сравниваем каждую строку со всеми остальными,
  'записываем количество повторов:
  For I = 1 To N
    G(I) = 1
    For K = 1 To N
      If I <> K _
      And B(I) = B(K) _
      And C(I) = C(K) _
      And D(I) = D(K) _
      And E(I) = E(K) _
      Then G(I) = G(I) + 1
    Next K
  Next I
  'Всё записали
End Sub
'КОНЕЦ ПРОЦЕДУРЫ GetCount

'ПРОЦЕДУРА SetData ЗАПИСЫВАЕТ МАССИВЫ В ФАЙЛ
Sub SetData()
  'Заполняем в цикле строки:
  For I = 1 To N
    ActiveWorkbook.Sheets("свод").Cells(I + 1, 2) = B(I)
    ActiveWorkbook.Sheets("свод").Cells(I + 1, 3) = C(I)
    ActiveWorkbook.Sheets("свод").Cells(I + 1, 4) = D(I)
    ActiveWorkbook.Sheets("свод").Cells(I + 1, 5) = E(I)
    ActiveWorkbook.Sheets("свод").Cells(I + 1, 6) = F(I)
    ActiveWorkbook.Sheets("свод").Cells(I + 1, 7) = G(I)
  Next
  'Конец цикла
End Sub
'КОНЕЦ ПРОЦЕДУРЫ SetData

'ПРОЦЕДУРА Tables ОБЪЕДИНЯЕТ ФАЙЛЫ
Sub Tables()
  N = 0
  'Определяем путь к активной книге Excel:
  Path = Left(ActiveWorkbook.FullName, _
              Len(ActiveWorkbook.FullName) - Len(ActiveWorkbook.Name))
  'Открываем файлы, которые будем объединять:
  Workbooks.Open Path & "1xxx.xls"
  Workbooks.Open Path & "2xxx.xls"
  Workbooks.Open Path & "3xxx.xls"
  'Заполняем массивы:
  GetData ("1xxx.xls")
  GetData ("2xxx.xls")
  GetData ("3xxx.xls")
  'Закрываем файлы:
  Workbooks("1xxx.xls").Close
  Workbooks("2xxx.xls").Close
  Workbooks("3xxx.xls").Close
  'Считаем повторы:
  GetCount
  'Записываем данные:
  SetData
End Sub
'КОНЕЦ ПРОЦЕДУРЫ Tables

Как это работает в Excel - см. вложение.
В файле _ответ.xls по нажатию кнопки запускается макрос.

Как открыть макросы в редакторе VBA:
1) Alt+F11 - откроется редактор VBA;
2) Ctrl+R - откроется окно проекта;
3) VBAProject (_ответ.xls) -> Modules -> Module1.
67K
13 июля 2011 года
Kerstone
5 / / 29.03.2011
СПАААСИБО!!! Всё работает! Для удобства нашел как в процедуру Tables добавить, чтоб файлы можно было выбирать
Код:
'ПРОЦЕДУРА Tables ОБЪЕДИНЯЕТ ФАЙЛЫ
Sub Tables()
Dim oAwb As String, oFile
  N = 0
  'очищаем лист
  Intersect(ActiveSheet.UsedRange, Rows("2:65536"), Columns("B:G")).ClearContents
  'выбираем файлы
  With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = True
        .InitialFileName = "*.xls"
        .Title = "Выберите файлы"
        If .Show = False Then Exit Sub
        For Each oFile In .SelectedItems
            Workbooks.OpenText Filename:=oFile
            oAwb = Dir(oFile, vbDirectory)

            Application.ScreenUpdating = False
            Workbooks(oAwb).Activate
            GetData (oAwb)
 
            Workbooks(oAwb).Close False
        Next oFile
    End With
   GetCount
   SetData
End Sub
'КОНЕЦ ПРОЦЕДУРЫ Tables
584
14 июля 2011 года
brodotsky
33 / / 25.01.2004
Толково.

А вообще, для подобных задач гораздо удобнее использовать Access+SQL.

Например, объединение таблиц.
 
Код:
Select
Таблица1.Поле1,Таблица1.Поле2,
Таблица2.Поле1,Таблица2.Поле2,Таблица2.Поле3
From Таблица1,Таблица2
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог