Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2014, 15:07   #1
Parklane1488
Пользователь
 
Регистрация: 21.08.2014
Сообщений: 15
По умолчанию Суммирование одинаковых файлов в 1

Всем привет
Подскажите, как можно несколько одинаковых файлов с разными данными объединить в один(просуммировать одинаковые позиции) ?
Все исходные файлы лежат в отдельной папке.
Заранее спасибо за ответ.

На данный момент есть такой код, но он не работает:

Код HTML:
Sub CombineWorkbooks()
    Dim FilesToOpen
    Dim x As Integer
    On Error GoTo ErrHandler
    Application.ScreenUpdating = False
    FilesToOpen = Application.GetOpenFilename _
                  (FileFilter:="Microsoft Excel Files (*.xls), *.xls", _
                   MultiSelect:=True, Title:="Files to Merge")
    If TypeName(FilesToOpen) = "Boolean" Then
        MsgBox "Не выбран файл!"
        GoTo ExitHandler
    End If
    x = 1
    While x <= UBound(FilesToOpen)
        Workbooks.Open FileName:=FilesToOpen(x)
        Sheets().Move After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
        x = x + 1
    Wend
ExitHandler:
    Application.ScreenUpdating = True
    Exit Sub
ErrHandler:
    MsgBox Err.Description
    Resume ExitHandler
End Sub
Вложения
Тип файла: rar Форум.rar (12.9 Кб, 12 просмотров)

Последний раз редактировалось Parklane1488; 27.08.2014 в 15:26.
Parklane1488 вне форума Ответить с цитированием
Старый 27.08.2014, 16:00   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

положите этот
Код:
Private Sub CommandButton1_Click()
  Dim dc, a, a2(), r As Long, fn As String
  Set dc = CreateObject("Scripting.Dictionary")
  fn = Dir(ThisWorkbook.Path & Application.PathSeparator & "*.xlsx")
  Do While fn <> ""
    With Workbooks.Add(fn)
      a = .Worksheets(1).[a2].CurrentRegion.Value:  .Close
    End With
    For r = 2 To UBound(a, 1)
      If dc.exists(a(r, 1)) Then dc.Item(a(r, 1)) = dc.Item(a(r, 1)) + a(r, 2) Else dc.Add a(r, 1), a(r, 2)
    Next
    fn = Dir
  Loop
  ReDim a2(1 To dc.Count + 1, 1 To 2): a2(1, 1) = a(1, 1): a2(1, 2) = a(1, 2)
  a = dc.keys
  For r = 0 To dc.Count - 1: a2(r + 2, 1) = a(r): Next
  a = dc.items
  For r = 0 To dc.Count - 1: a2(r + 2, 2) = a(r): Next
  Cells.ClearContents
  [a1].Resize(dc.Count + 1, 2).Value = a2
End Sub
в файл в папке с данными и выполните макрос, может это сработает...
(в папке должны находиться только файл с макросом и файлы с данными)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 27.08.2014 в 16:03.
IgorGO вне форума Ответить с цитированием
Старый 27.08.2014, 16:48   #3
Parklane1488
Пользователь
 
Регистрация: 21.08.2014
Сообщений: 15
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
положите этот
Код:
Private Sub CommandButton1_Click()
  Dim dc, a, a2(), r As Long, fn As String
  Set dc = CreateObject("Scripting.Dictionary")
  fn = Dir(ThisWorkbook.Path & Application.PathSeparator & "*.xlsx")
  Do While fn <> ""
    With Workbooks.Add(fn)
      a = .Worksheets(1).[a2].CurrentRegion.Value:  .Close
    End With
    For r = 2 To UBound(a, 1)
      If dc.exists(a(r, 1)) Then dc.Item(a(r, 1)) = dc.Item(a(r, 1)) + a(r, 2) Else dc.Add a(r, 1), a(r, 2)
    Next
    fn = Dir
  Loop
  ReDim a2(1 To dc.Count + 1, 1 To 2): a2(1, 1) = a(1, 1): a2(1, 2) = a(1, 2)
  a = dc.keys
  For r = 0 To dc.Count - 1: a2(r + 2, 1) = a(r): Next
  a = dc.items
  For r = 0 To dc.Count - 1: a2(r + 2, 2) = a(r): Next
  Cells.ClearContents
  [a1].Resize(dc.Count + 1, 2).Value = a2
End Sub
в файл в папке с данными и выполните макрос, может это сработает...
(в папке должны находиться только файл с макросом и файлы с данными)
Я сохранил Ваш макрос в отдельный лист и поместил его к исходникам(которые нужно объединить)
И после этого выполнил свой макрос, но к сожалению ничего не произошло(((
Parklane1488 вне форума Ответить с цитированием
Старый 27.08.2014, 16:59   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

ладно, упростим инструкцию по эксплуатации:
1. распакуйте 3 файла из архива в отдельную папку
2. откройте файл SumMcr.xlsm
3. нажмите кнопку CommandButton1 (собственно она одна в файле)
Вложения
Тип файла: rar Sum1.rar (28.1 Кб, 22 просмотров)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 27.08.2014, 17:38   #5
Parklane1488
Пользователь
 
Регистрация: 21.08.2014
Сообщений: 15
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
ладно, упростим инструкцию по эксплуатации:
1. распакуйте 3 файла из архива в отдельную папку
2. откройте файл SumMcr.xlsm
3. нажмите кнопку CommandButton1 (собственно она одна в файле)
Почему то ругается, что я изменил имя файлов.
Ошибку прилагаю в скрине
Вложения
Тип файла: rar Безымянный.rar (53.0 Кб, 5 просмотров)
Parklane1488 вне форума Ответить с цитированием
Старый 27.08.2014, 17:48   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

макросу все равно как называються файлы, он будет перебирать все файлы в папке, в которой лежит файл с макросом
Код:
Dir(ThisWorkbook.Path & Application.PathSeparator & "*.xlsx")
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 27.08.2014, 17:50   #7
Parklane1488
Пользователь
 
Регистрация: 21.08.2014
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Parklane1488 Посмотреть сообщение
Почему то ругается, что я изменил имя файлов.
Ошибку прилагаю в скрине
Всё, ошибку понял свою.
Поправил формат excel файлов.
А у меня ещё вопрос, если нужно будет в этих файлах 3 вкладки складывать(шапка такая же, просто данные за другие периоды будут) как поступить?
Parklane1488 вне форума Ответить с цитированием
Старый 27.08.2014, 18:03   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Private Sub CommandButton1_Click()
  Dim dc, a, a2(), r As Long, fn As String, sh As Worksheet
  Set dc = CreateObject("Scripting.Dictionary")
  fn = Dir(ThisWorkbook.Path & Application.PathSeparator & "*.xlsx")
  Do While fn <> ""
    With Workbooks.Add(fn)
      For Each sh In .Worksheets
        a = sh.[a2].CurrentRegion.Value
        For r = 2 To UBound(a, 1)
          If dc.exists(a(r, 1)) Then dc.Item(a(r, 1)) = dc.Item(a(r, 1)) + a(r, 2) Else dc.Add a(r, 1), a(r, 2)
        Next
      Next
      .Close: fn = Dir
    End With
  Loop
  ReDim a2(1 To dc.Count + 1, 1 To 2): a2(1, 1) = a(1, 1): a2(1, 2) = a(1, 2)
  a = dc.keys
  For r = 0 To dc.Count - 1: a2(r + 2, 1) = a(r): Next
  a = dc.items
  For r = 0 To dc.Count - 1: a2(r + 2, 2) = a(r): Next
  Cells.ClearContents
  [a1].Resize(dc.Count + 1, 2).Value = a2
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 28.08.2014, 09:19   #9
Parklane1488
Пользователь
 
Регистрация: 21.08.2014
Сообщений: 15
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
Код:
Private Sub CommandButton1_Click()
  Dim dc, a, a2(), r As Long, fn As String, sh As Worksheet
  Set dc = CreateObject("Scripting.Dictionary")
  fn = Dir(ThisWorkbook.Path & Application.PathSeparator & "*.xlsx")
  Do While fn <> ""
    With Workbooks.Add(fn)
      For Each sh In .Worksheets
        a = sh.[a2].CurrentRegion.Value
        For r = 2 To UBound(a, 1)
          If dc.exists(a(r, 1)) Then dc.Item(a(r, 1)) = dc.Item(a(r, 1)) + a(r, 2) Else dc.Add a(r, 1), a(r, 2)
        Next
      Next
      .Close: fn = Dir
    End With
  Loop
  ReDim a2(1 To dc.Count + 1, 1 To 2): a2(1, 1) = a(1, 1): a2(1, 2) = a(1, 2)
  a = dc.keys
  For r = 0 To dc.Count - 1: a2(r + 2, 1) = a(r): Next
  a = dc.items
  For r = 0 To dc.Count - 1: a2(r + 2, 2) = a(r): Next
  Cells.ClearContents
  [a1].Resize(dc.Count + 1, 2).Value = a2
End Sub
Прошу прощения за неточность в вопросе.
Если допустим 3 вкладки есть в файле и нужно чтобы каждая вкладка считалась вместе с такой же вкладкой в других файлах(то есть Лист 1 с Лист 1, Лист 2 с Лист 2)
И где можно прописать, чтобы он считал не только 1 столбец, а допустим если их будет 12(разбивка к примеру по месяцам будет)?
Ещё такая ситуация. Когда я кладу свои файлы в папку с макросом мне приходится дублировать файлы ещё в папку Мои Документы, так как макрос не видит их почему-то.
Parklane1488 вне форума Ответить с цитированием
Старый 28.08.2014, 10:39   #10
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
И где можно прописать, чтобы он считал не только 1 столбец, а допустим...
пишите все в предложенном выше макросе, но... уже без меня, извините
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление строки и суммирование одинаковых данных в ней, реально ли реализовать через макрос? Just_07 Microsoft Office Excel 9 05.06.2012 00:00
Суммирование из одинаковых ячеек maksvas Microsoft Office Excel 30 17.05.2011 18:03
Поиск одинаковых файлов на диске MeTeOpA Общие вопросы Delphi 26 07.03.2011 13:28
обьединение одинаковых файлов ексель Alex47 Microsoft Office Excel 9 09.02.2011 11:33
Суммирование одинаковых элиментов. Классфикация по значению. PashaNastya Microsoft Office Excel 10 27.03.2010 15:00