Как агрегировать строки из большого файла Excel - PullRequest
0 голосов
/ 03 мая 2018

У меня большой файл Excel с большим количеством строк. Я хотел бы суммировать эти строки, которые имеют одинаковые критерии (есть 4/5 столбцов критериев и 6/7 столбцов вещей для суммирования).

  • Можно ли создать VBA для создания этого процесса суммирования?
  • Можно ли сделать это в другом листе Excel, ссылаясь на основной, без необходимости открывать исходный файл Excel (так как для его открытия требуется много времени).

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Рассмотрите возможность запуска SQL непосредственно в книге Excel при использовании Excel для ПК, поскольку он может подключаться к Jet / ACE Engine (файлы Windows .dll). Затем выполните известный и используемый совокупный запрос.

Ниже предполагается, что у вас есть лист с именем OUTPUT . Обязательно настройте strSQL для фактических критериев и Col # имен и SheetName . Если в именах столбцов есть пробелы и специальные символы, заключите столбцы SELECT и GROUP BY в квадратные скобки [] или обратные галочки ``.

' ADO OBJECTS
Dim xlConn As Object, rs As Object
Dim icols As Long

Set xlConn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

' CURRENT WORKBOOK CONNECTION
xlConn.Open "DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" _
              & "DBQ=" & ThisWorkbook.FullName & ";"

' AGGREGATE QUERY
strSQL = "SELECT Criteria1, Criteria2, Criteria3, Criteria4, " _
      & "   Sum(Col1) As TotalCol1, Sum(Col2) As TotalCol2, Sum(Col3) As TotalCol3," _
      & "   Sum(Col4) As TotalCol4, Sum(Col5) As TotalCol5, Sum(Col6) As TotalCol6" _
      & " FROM [SheetName$]" _
      & " GROUP BY Criteria1, Criteria2, Criteria3, Criteria4"

' OUTPUT RESULTS
rs.Open strSQL, xlConn

With Worksheets("OUTPUT")
    .Cells.Clear
    ' COLUMN HEADERS
    For icols = 0 To rs.Fields.Count - 1
        .Cells(1, icols + 1).Value = rs.Fields(icols).Name
    Next icols

    ' DATA ROWS
    .Range("A2").CopyFromRecordset rs
End With    

rs.Close
xlConn.Close
0 голосов
/ 03 мая 2018

Вы можете сделать и то и другое, но, вероятно, проще сделать суммирование с помощью функции SumIfs или сводной таблицы. Однако, если вы настроены на VBA, вот какой-то код:

Sub SumNumber()
'Column F is data to sum
'Column B is year
'Column C is month

MsgBox Application.WorksheetFunction.SumIfs(Columns("F"), Columns("B"), "2018", Columns("C"), "April")

End Sub

Если вы хотите суммировать несколько столбцов, просто продублируйте суммы с другим начальным диапазоном (не столбцом F).

Пример: Sumifs (Columns ("F) ... + SumIfs (Columns (" E ") ...

")

(Обратите внимание, что это практически идентично созданию формулы в ячейке)

Вот файл , в котором есть некоторые примеры данных с этим макросом. У этого также есть сводная таблица, которая, вероятно, была бы намного лучшим выбором.

Отвечая на другой вопрос, вы можете перейти по ссылке с другого листа. Вам просто нужно использовать ссылку на путь к файлу, однако это может привести к поломке при переименовании каталогов, изменении профилей безопасности и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...