Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Поиск соответствующих значений и суммирование. - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск соответствующих значений и суммирование. (Макросы/Sub)
Поиск соответствующих значений и суммирование.
Black_Storm Дата: Понедельник, 26.01.2015, 13:38 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 55
Репутация: 1 ±
Замечаний: 100% ±

Excel 2007
Добрый день, уважаемые товарищи, не раз меня спасающие.

Вопрос следующего характера. Выгружаются данные из базы .dbf

Каталогов примерно 300.

Данные выгружаются на Лист "Расчеты" поочередно с каждого каталога.

Чего хотелось бы: Выгружаются данные одного каталога, переносятся в лист "Итог", далее, выгружается следующий каталог и ищет совпадения с уже имеющимися строками в листе "Итог". Если совпадения есть - суммирует колонку "Количество", если нет - добавляет новую строку и так со всеми каталогами.

Выгрузку осуществил сам. Не могу разобраться со второй частью задачи.

Пример прикрепляю, но он рандомный.

Буду признателен!
К сообщению приложен файл: 2356272.xlsx (9.1 Kb)


Сообщение отредактировал Black_Storm - Понедельник, 26.01.2015, 14:35
 
Ответить
СообщениеДобрый день, уважаемые товарищи, не раз меня спасающие.

Вопрос следующего характера. Выгружаются данные из базы .dbf

Каталогов примерно 300.

Данные выгружаются на Лист "Расчеты" поочередно с каждого каталога.

Чего хотелось бы: Выгружаются данные одного каталога, переносятся в лист "Итог", далее, выгружается следующий каталог и ищет совпадения с уже имеющимися строками в листе "Итог". Если совпадения есть - суммирует колонку "Количество", если нет - добавляет новую строку и так со всеми каталогами.

Выгрузку осуществил сам. Не могу разобраться со второй частью задачи.

Пример прикрепляю, но он рандомный.

Буду признателен!

Автор - Black_Storm
Дата добавления - 26.01.2015 в 13:38
alex77755 Дата: Понедельник, 26.01.2015, 16:30 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 362
Репутация: 64 ±
Замечаний: 0% ±

Цитата
Выгрузку осуществил сам

Как?
Если макросом, то вообще не надо вываливать 6на лист, пока не получишь все данные.
Тем более, что надо суммировать!
Копай в сторону Scripting.Dictionary
[vba]
Код
  Dim ODn: Set ODn = CreateObject("Scripting.Dictionary")
[/vba]
С ним это делается просто


Могу помочь в VB6, VBA
Alex77755@mail.ru
 
Ответить
Сообщение
Цитата
Выгрузку осуществил сам

Как?
Если макросом, то вообще не надо вываливать 6на лист, пока не получишь все данные.
Тем более, что надо суммировать!
Копай в сторону Scripting.Dictionary
[vba]
Код
  Dim ODn: Set ODn = CreateObject("Scripting.Dictionary")
[/vba]
С ним это делается просто

Автор - alex77755
Дата добавления - 26.01.2015 в 16:30
krosav4ig Дата: Понедельник, 26.01.2015, 19:06 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
имхо лучше копать в сторону adodb, суммировать запросом например [vba]
Код
SELECT Таблица1.Поле1, SUM(Таблица1.Поле2) FROM Таблица1 group by Таблица1.Поле1
[/vba], и уже результат запроса выгружать на лист


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Понедельник, 26.01.2015, 19:06
 
Ответить
Сообщениеимхо лучше копать в сторону adodb, суммировать запросом например [vba]
Код
SELECT Таблица1.Поле1, SUM(Таблица1.Поле2) FROM Таблица1 group by Таблица1.Поле1
[/vba], и уже результат запроса выгружать на лист

Автор - krosav4ig
Дата добавления - 26.01.2015 в 19:06
alex77755 Дата: Понедельник, 26.01.2015, 19:29 | Сообщение № 4
Группа: Проверенные
Ранг: Обитатель
Сообщений: 362
Репутация: 64 ±
Замечаний: 0% ±

Цитата
имхо лучше копать в сторону adodb

Цитата
Каталогов примерно 300.

Приведи пример запроса с перебором каталогов


Могу помочь в VB6, VBA
Alex77755@mail.ru
 
Ответить
Сообщение
Цитата
имхо лучше копать в сторону adodb

Цитата
Каталогов примерно 300.

Приведи пример запроса с перебором каталогов

Автор - alex77755
Дата добавления - 26.01.2015 в 19:29
Black_Storm Дата: Вторник, 27.01.2015, 09:12 | Сообщение № 5
Группа: Пользователи
Ранг: Участник
Сообщений: 55
Репутация: 1 ±
Замечаний: 100% ±

Excel 2007
Приветствую!
alex77755, На один лист вывалить анриал - больше миллиона строк. Компьютер не тянет.
 
Ответить
СообщениеПриветствую!
alex77755, На один лист вывалить анриал - больше миллиона строк. Компьютер не тянет.

Автор - Black_Storm
Дата добавления - 27.01.2015 в 09:12
Hugo Дата: Вторник, 27.01.2015, 09:31 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Если макросом, то вообще не надо вываливать 6на лист, пока не получишь все данные.

Ну а если и полученные данные не лезут на лист - можно из словаря выгрузить в текст.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
Сообщение
Если макросом, то вообще не надо вываливать 6на лист, пока не получишь все данные.

Ну а если и полученные данные не лезут на лист - можно из словаря выгрузить в текст.

Автор - Hugo
Дата добавления - 27.01.2015 в 09:31
alex77755 Дата: Вторник, 27.01.2015, 10:14 | Сообщение № 7
Группа: Проверенные
Ранг: Обитатель
Сообщений: 362
Репутация: 64 ±
Замечаний: 0% ±

Black_Storm,
Но ведь вопрос-то не об этом стоял!
А о том как реализовать суммирование существующих и добавления новых!
Надо бы озвучить конечную задачу! Что в итоге надо сделать?


Могу помочь в VB6, VBA
Alex77755@mail.ru
 
Ответить
СообщениеBlack_Storm,
Но ведь вопрос-то не об этом стоял!
А о том как реализовать суммирование существующих и добавления новых!
Надо бы озвучить конечную задачу! Что в итоге надо сделать?

Автор - alex77755
Дата добавления - 27.01.2015 в 10:14
krosav4ig Дата: Вторник, 27.01.2015, 20:29 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
может я чего-то не так понял, но вот что у мну получилось
[vba]
Код
Option Explicit
Function FilenamesCollection(ByVal FolderPath As String, Optional ByVal Mask As String = "", _
                     Optional ByVal SearchDeep As Long = 999) As Collection
      Dim FSO As Object
      Set FilenamesCollection = New Collection
      Set FSO = CreateObject("Scripting.FileSystemObject")
      GetAllFileNamesUsingFSO FolderPath, Mask, FSO, FilenamesCollection, SearchDeep
      Set FSO = Nothing
End Function
Function GetAllFileNamesUsingFSO(ByVal FolderPath As String, ByVal Mask As String, ByRef FSO, _
                     ByRef FileNamesColl As Collection, ByVal SearchDeep As Long)
      Dim curfold As Object, fil As Object, sfol As Object
      On Error Resume Next: Set curfold = FSO.GetFolder(FolderPath)
      If Not curfold Is Nothing Then
          For Each fil In curfold.Files
              If fil.Name Like "*" & Mask Then FileNamesColl.Add fil
          Next
          SearchDeep = SearchDeep - 1
          If SearchDeep Then
              For Each sfol In curfold.SubFolders
                  GetAllFileNamesUsingFSO sfol.path, Mask, FSO, FileNamesColl, SearchDeep
              Next
          End If
          Set fil = Nothing: Set curfold = Nothing
      End If
End Function

Sub sdf()
        Dim con As New ADODB.Connection
        Dim RS  As New ADODB.Recordset
        Dim coll As Collection
        Dim ObjFile As Object
        Dim FilePath$, path$, ConnectionString$
        ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.path & ";Extended Properties=dBASE IV"
        'ConnectionString = "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & ThisWorkbook.path
        con.Open ConnectionString$
        con.Execute "create table atable (name Text(50), cnt long)"
        For Each ObjFile In FilenamesCollection(ThisWorkbook.path, ".dbf", 2)
          FilePath = ObjFile.path: path$ = Replace(FilePath, ObjFile.Name, "")
          con.Execute "INSERT INTO atable SELECT Field1 as name, sum(Field2) as cnt From " & ObjFile.Name & " IN '" & path & "' [Dbase IV;DATABASE=" & FilePath & "] group by Field1"
        Next
        RS.Open "select name, sum(cnt) as sumcnt from atable group by name", con, 3, 3
        [A1].CopyFromRecordset RS
        RS.Close
        con.Execute "drop table atable"
        con.Close
        Set con = Nothing: Set RS = Nothing
End Sub
[/vba]
К сообщению приложен файл: qwe.zip (21.6 Kb)


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Вторник, 27.01.2015, 20:36
 
Ответить
Сообщениеможет я чего-то не так понял, но вот что у мну получилось
[vba]
Код
Option Explicit
Function FilenamesCollection(ByVal FolderPath As String, Optional ByVal Mask As String = "", _
                     Optional ByVal SearchDeep As Long = 999) As Collection
      Dim FSO As Object
      Set FilenamesCollection = New Collection
      Set FSO = CreateObject("Scripting.FileSystemObject")
      GetAllFileNamesUsingFSO FolderPath, Mask, FSO, FilenamesCollection, SearchDeep
      Set FSO = Nothing
End Function
Function GetAllFileNamesUsingFSO(ByVal FolderPath As String, ByVal Mask As String, ByRef FSO, _
                     ByRef FileNamesColl As Collection, ByVal SearchDeep As Long)
      Dim curfold As Object, fil As Object, sfol As Object
      On Error Resume Next: Set curfold = FSO.GetFolder(FolderPath)
      If Not curfold Is Nothing Then
          For Each fil In curfold.Files
              If fil.Name Like "*" & Mask Then FileNamesColl.Add fil
          Next
          SearchDeep = SearchDeep - 1
          If SearchDeep Then
              For Each sfol In curfold.SubFolders
                  GetAllFileNamesUsingFSO sfol.path, Mask, FSO, FileNamesColl, SearchDeep
              Next
          End If
          Set fil = Nothing: Set curfold = Nothing
      End If
End Function

Sub sdf()
        Dim con As New ADODB.Connection
        Dim RS  As New ADODB.Recordset
        Dim coll As Collection
        Dim ObjFile As Object
        Dim FilePath$, path$, ConnectionString$
        ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.path & ";Extended Properties=dBASE IV"
        'ConnectionString = "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & ThisWorkbook.path
        con.Open ConnectionString$
        con.Execute "create table atable (name Text(50), cnt long)"
        For Each ObjFile In FilenamesCollection(ThisWorkbook.path, ".dbf", 2)
          FilePath = ObjFile.path: path$ = Replace(FilePath, ObjFile.Name, "")
          con.Execute "INSERT INTO atable SELECT Field1 as name, sum(Field2) as cnt From " & ObjFile.Name & " IN '" & path & "' [Dbase IV;DATABASE=" & FilePath & "] group by Field1"
        Next
        RS.Open "select name, sum(cnt) as sumcnt from atable group by name", con, 3, 3
        [A1].CopyFromRecordset RS
        RS.Close
        con.Execute "drop table atable"
        con.Close
        Set con = Nothing: Set RS = Nothing
End Sub
[/vba]

Автор - krosav4ig
Дата добавления - 27.01.2015 в 20:29
Black_Storm Дата: Понедельник, 09.02.2015, 16:44 | Сообщение № 9
Группа: Пользователи
Ранг: Участник
Сообщений: 55
Репутация: 1 ±
Замечаний: 100% ±

Excel 2007
krosav4ig, Не пойму как это работает...
 
Ответить
Сообщениеkrosav4ig, Не пойму как это работает...

Автор - Black_Storm
Дата добавления - 09.02.2015 в 16:44
krosav4ig Дата: Вторник, 10.02.2015, 13:48 | Сообщение № 10
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
так понятнее?
[vba]
Код
Option Explicit
Function FilenamesCollection(ByVal FolderPath As String, Optional ByVal Mask As String = "", _
                    Optional ByVal SearchDeep As Long = 999) As Collection
     ' Получает в качестве параметра путь к папке FolderPath,
     ' маску имени искомых файлов Mask (будут отобраны только файлы с такой маской/расширением)
     ' и глубину поиска SearchDeep в подпапках (если SearchDeep=1, то подпапки не просматриваются).
     ' Возвращает коллекцию, содержащую полные пути найденных файлов
     ' (применяется рекурсивный вызов процедуры GetAllFileNamesUsingFSO)
      
     Dim FSO As Object
     Set FilenamesCollection = New Collection    ' создаём пустую коллекцию
     Set FSO = CreateObject("Scripting.FileSystemObject")    ' создаём экземпляр FileSystemObject
     GetAllFileNamesUsingFSO FolderPath, Mask, FSO, FilenamesCollection, SearchDeep ' поиск
     Set FSO = Nothing: Application.StatusBar = False    ' очистка строки состояния Excel
End Function

Function GetAllFileNamesUsingFSO(ByVal FolderPath As String, ByVal Mask As String, ByRef FSO, _
                    ByRef FileNamesColl As Collection, ByVal SearchDeep As Long)
     ' перебирает все файлы и подпапки в папке FolderPath, используя объект FSO
     ' перебор папок осуществляется в том случае, если SearchDeep > 1
     ' добавляет пути найденных файлов в коллекцию FileNamesColl
     Dim curfold As Object, fil As Object, sfol As Object
     On Error Resume Next: Set curfold = FSO.GetFolder(FolderPath)
     If Not curfold Is Nothing Then    ' если удалось получить доступ к папке
         ' раскомментируйте эту строку для вывода пути к просматриваемой
         ' в текущий момент папке в строку состояния Excel
         ' Application.StatusBar = "Поиск в папке: " & FolderPath
         For Each fil In curfold.Files    ' перебираем все файлы в папке FolderPath
             If fil.Name Like "*" & Mask Then FileNamesColl.Add fil '.path
         Next
         SearchDeep = SearchDeep - 1    ' уменьшаем глубину поиска в подпапках
         If SearchDeep Then    ' если надо искать глубже
             For Each sfol In curfold.SubFolders    ' перебираем все подпапки в папке FolderPath
             GetAllFileNamesUsingFSO sfol.path, Mask, FSO, FileNamesColl, SearchDeep
             Next
         End If
         Set fil = Nothing: Set curfold = Nothing    ' очищаем переменные
     End If
End Function

Sub sdf()
     Dim con: Set con = CreateObject("ADODB.Connection") 'подключение
     Dim RS: Set RS = CreateObject("ADODB.Recordset") 'рекордсет
     Dim ObjFile As Object
     Dim FilePath$, path$, ConnectionString$
      
     'Строка подключения
     ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.path & ";Extended Properties=dBASE IV"
     'ConnectionString = "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & ThisWorkbook.path
      
     'открываем подключение
     con.Open ConnectionString$
      
     'создаем пустую временную базу данных dbf в папке с этим файлом
     con.Execute "create table atable (name Text(50), cnt long)"
      
     'перебираем найденные файлы dbf в папке с этим файлом и дочерних папках 1го уровня
     'если нужно искать в другой папке, то ее путь нужно указать вместо ThisWorkbook.path
     'например FilenamesCollection("C:\DBase\", ".dbf", 2)
     For Each ObjFile In FilenamesCollection(ThisWorkbook.path, ".dbf", 2)
         FilePath = ObjFile.path: path$ = Replace(FilePath, ObjFile.Name, "")
          
         'добавляем из каждого найденного файла группированные записи по первому полю в созданную временную базу
         con.Execute "INSERT INTO atable SELECT Field1 as name, sum(Field2) as cnt From " & ObjFile.Name & " IN '" & path & "' [Dbase IV;DATABASE=" & FilePath & "] group by Field1"
     Next
      
     'помещаем в рекордсет группированные записи из временной базы
     RS.Open "select name, sum(cnt) as sumcnt from atable group by name", con, 3, 3
      
     'выгружаем данные из рекордсета на лист
     [A1].CopyFromRecordset RS
      
     'закрываем рекордсет
     RS.Close
      
     'удаляем временную базу
     con.Execute "drop table atable"
      
     'закрвыаем подключение
     con.Close
     Set con = Nothing: Set RS = Nothing
End Sub
[/vba]

[p.s.]функции FilenamesCollection и GetAllFileNamesUsingFSO взяты тут: Получение списка файлов в папке и подпапках средствами VBA[/p.s.]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
Сообщениетак понятнее?
[vba]
Код
Option Explicit
Function FilenamesCollection(ByVal FolderPath As String, Optional ByVal Mask As String = "", _
                    Optional ByVal SearchDeep As Long = 999) As Collection
     ' Получает в качестве параметра путь к папке FolderPath,
     ' маску имени искомых файлов Mask (будут отобраны только файлы с такой маской/расширением)
     ' и глубину поиска SearchDeep в подпапках (если SearchDeep=1, то подпапки не просматриваются).
     ' Возвращает коллекцию, содержащую полные пути найденных файлов
     ' (применяется рекурсивный вызов процедуры GetAllFileNamesUsingFSO)
      
     Dim FSO As Object
     Set FilenamesCollection = New Collection    ' создаём пустую коллекцию
     Set FSO = CreateObject("Scripting.FileSystemObject")    ' создаём экземпляр FileSystemObject
     GetAllFileNamesUsingFSO FolderPath, Mask, FSO, FilenamesCollection, SearchDeep ' поиск
     Set FSO = Nothing: Application.StatusBar = False    ' очистка строки состояния Excel
End Function

Function GetAllFileNamesUsingFSO(ByVal FolderPath As String, ByVal Mask As String, ByRef FSO, _
                    ByRef FileNamesColl As Collection, ByVal SearchDeep As Long)
     ' перебирает все файлы и подпапки в папке FolderPath, используя объект FSO
     ' перебор папок осуществляется в том случае, если SearchDeep > 1
     ' добавляет пути найденных файлов в коллекцию FileNamesColl
     Dim curfold As Object, fil As Object, sfol As Object
     On Error Resume Next: Set curfold = FSO.GetFolder(FolderPath)
     If Not curfold Is Nothing Then    ' если удалось получить доступ к папке
         ' раскомментируйте эту строку для вывода пути к просматриваемой
         ' в текущий момент папке в строку состояния Excel
         ' Application.StatusBar = "Поиск в папке: " & FolderPath
         For Each fil In curfold.Files    ' перебираем все файлы в папке FolderPath
             If fil.Name Like "*" & Mask Then FileNamesColl.Add fil '.path
         Next
         SearchDeep = SearchDeep - 1    ' уменьшаем глубину поиска в подпапках
         If SearchDeep Then    ' если надо искать глубже
             For Each sfol In curfold.SubFolders    ' перебираем все подпапки в папке FolderPath
             GetAllFileNamesUsingFSO sfol.path, Mask, FSO, FileNamesColl, SearchDeep
             Next
         End If
         Set fil = Nothing: Set curfold = Nothing    ' очищаем переменные
     End If
End Function

Sub sdf()
     Dim con: Set con = CreateObject("ADODB.Connection") 'подключение
     Dim RS: Set RS = CreateObject("ADODB.Recordset") 'рекордсет
     Dim ObjFile As Object
     Dim FilePath$, path$, ConnectionString$
      
     'Строка подключения
     ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.path & ";Extended Properties=dBASE IV"
     'ConnectionString = "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & ThisWorkbook.path
      
     'открываем подключение
     con.Open ConnectionString$
      
     'создаем пустую временную базу данных dbf в папке с этим файлом
     con.Execute "create table atable (name Text(50), cnt long)"
      
     'перебираем найденные файлы dbf в папке с этим файлом и дочерних папках 1го уровня
     'если нужно искать в другой папке, то ее путь нужно указать вместо ThisWorkbook.path
     'например FilenamesCollection("C:\DBase\", ".dbf", 2)
     For Each ObjFile In FilenamesCollection(ThisWorkbook.path, ".dbf", 2)
         FilePath = ObjFile.path: path$ = Replace(FilePath, ObjFile.Name, "")
          
         'добавляем из каждого найденного файла группированные записи по первому полю в созданную временную базу
         con.Execute "INSERT INTO atable SELECT Field1 as name, sum(Field2) as cnt From " & ObjFile.Name & " IN '" & path & "' [Dbase IV;DATABASE=" & FilePath & "] group by Field1"
     Next
      
     'помещаем в рекордсет группированные записи из временной базы
     RS.Open "select name, sum(cnt) as sumcnt from atable group by name", con, 3, 3
      
     'выгружаем данные из рекордсета на лист
     [A1].CopyFromRecordset RS
      
     'закрываем рекордсет
     RS.Close
      
     'удаляем временную базу
     con.Execute "drop table atable"
      
     'закрвыаем подключение
     con.Close
     Set con = Nothing: Set RS = Nothing
End Sub
[/vba]

[p.s.]функции FilenamesCollection и GetAllFileNamesUsingFSO взяты тут: Получение списка файлов в папке и подпапках средствами VBA[/p.s.]

Автор - krosav4ig
Дата добавления - 10.02.2015 в 13:48
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск соответствующих значений и суммирование. (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!